ropr 是一个极速的多线程 ROP 小工具查找器
ROP(返回导向编程)小工具是少量汇编指令的小片段,通常以 ret 指令结尾,这些指令已作为可执行代码存在于每个二进制文件或库中。这些小工具可用于二进制利用和破坏易受攻击的可执行文件。
当多个 ROP 小工具的地址被写入缓冲区时,我们就形成了一条 ROP 链。如果攻击者能够将栈指针移入此 ROP 链,则控制权可以完全转移给攻击者。
大多数可执行文件包含足够的小工具来编写一个图灵完备的 ROP 链。对于那些没有的,我们始终可以使用位于同一地址空间中的动态库(如 libc),只要我们知道了它们的地址。
使用 ROP 小工具的美妙之处在于,无需在任何地方编写新的可执行代码——攻击者可以使用程序中已有的代码来实现其目标。
通常,使用 ROP 小工具的第一个要求是有一个地方来写入你的 ROP 链——这可以是任何可读缓冲区。只需将你想要使用的每个小工具的地址写入此缓冲区。如果缓冲区太小,可能没有足够的空间来写入较长的 ROP 链,因此攻击者应小心地构建 ROP 链,使其足够高效以适应可用空间。
下一个要求是能够控制栈——这可以采取栈溢出的形式——它允许 ROP 链直接写在栈指针下方,或者“栈 pivoting”——通常是一个单一的小工具,将栈指针移动到 ROP 链的其余部分。
一旦栈指针位于 ROP 链的开头,下一个 ret 指令将触发小工具按顺序执行——每个小工具将其下一个小工具作为其自己的栈帧上的返回地址。
也可以将函数指针添加到 ROP 链中——注意函数参数需在 ROP 链的下一个元素之后提供。这通常与“pop 小工具”结合使用,该小工具会将参数从栈中弹出,以便在函数参数之后平滑过渡到下一个小工具。
简易安装:
cargo install ropr
应用程序将安装到 ~/.cargo/bin
从源码安装:
git clone https://github.com/Ben-Lichtman/ropr
cd ropr
cargo build --release
生成的二进制文件将位于 target/release/ropr
或者:
git clone https://github.com/Ben-Lichtman/ropr
cd ropr
cargo install --path .
应用程序将安装到 ~/.cargo/bin
用法:
ropr [选项] <二进制文件>
参数:
<二进制文件> 要检查的文件路径
选项:
-b, --base-pivot 筛选改变基址指针的小工具
-c, --colour <颜色> 强制输出为彩色或纯文本(`true` 或 `false`)
-h, --help 打印帮助信息
-j, --nojop 移除“JOP 小工具”——这些可能有可控的分支、调用等,而不是简单的结尾 `ret`
-m, --max-instr <最大指令数> 每个小工具中的最大指令数 [默认值: 6]
-n, --noisy 包含可能低质量的小工具,如前缀、条件分支和近分支(将找到显著更多的小工具)
-p, --stack-pivot 筛选改变栈指针的小工具
-r, --norop 移除普通的“ROP 小工具”
-R, --regex <正则表达式> 对返回的小工具执行正则表达式搜索以方便过滤
--range <范围> 在地址范围之间搜索(十六进制),例如 `0x1234-0x4567`
--raw <原始> 将输入文件视为代码 blob(`true` 或 `false`)
-s, --nosys 移除系统调用和其他中断
-V, --version 打印版本信息
例如,如果我正在寻找一种用另一个寄存器中的值填充 rax 的方法,我可能会选择使用正则表达式 ^mov eax, ...; 进行过滤:
❯ ropr /usr/lib/libc.so.6 -R "^mov eax, ...;" > /dev/null
==> 在 0.118 秒内找到 197 个小工具
现在我可以为获得最优质的结果添加一些过滤器到命令行:
❯ ropr /usr/lib/libc.so.6 -m 2 -j -s -R "^mov eax, ...;"
0x000353e7: mov eax, eax; ret;
0x000788c8: mov eax, ecx; ret;
0x00052252: mov eax, edi; ret;
0x0003ae43: mov eax, edx; ret;
0x000353e6: mov eax, r8d; ret;
0x000788c7: mov eax, r9d; ret;
==> 在 0.046 秒内找到 6 个小工具
现在我在地址 0x00052252 处有了一个好的 mov 小工具候选。