ROPgadget是一种基于代码复用技术的攻击工具,它可以帮助攻击者在二进制文件中找到可利用的代码片段(即ROP链中的gadgets),从而构建出有效的攻击载荷。以下是ROPgadget的基本使用方法:

查找gadgets

使用ROPgadget的基本命令格式是:

ROPgadget --binary <文件名> --only <gadgets类型>

其中,<文件名>是你想要分析的二进制文件的路径,是你想要查找的gadgets的类型,比如“pop|ret”表示查找所有包含pop和ret指令的gadgets。

常用

ROPgadget --binary example --string "/bin/sh"
ROPgadget --binary example --only "int"
例如,如果你想在名为example的二进制文件中查找所有的pop和ret gadgets,你可以使用以下命令:
ROPgadget --binary example --only "pop|ret"
jmp和ret
ROPgadget --binary b0verfl0w --only "jmp|ret"ROPgadget —binary libc.so.6 —only “pop|ret” |grep “rax”"rax""rdx""rdi""rcx""rsi"one_gadget /path/to/binary`
ROPgadget会输出所有匹配的gadgets以及它们在二进制文件中的偏移地址。

分析gadgets

查看ROPgadget的输出,分析哪些gadgets可以被用来构建ROP链。你需要找到一系列的gadgets,它们能够按顺序执行你想要的操作,比如改变寄存器的值、调用系统函数等。

构建ROP链:

根据分析的结果,手动或使用自动化工具构建ROP链。ROP链是一系列gadgets的序列,当它们被连续执行时,能够完成攻击者的目标,比如执行任意代码或获取shell。

测试ROP链:

在受控的环境中测试构建的ROP链,确保它能够按照预期工作。这通常涉及到在目标系统上触发漏洞并利用ROP链执行攻击。

ROPgadget 的使用说明如下:
用法:ROPgadget [-h] [-v] [-c] [--binary <binary>] [--opcode <opcodes>]
[--string <string>] [--memstr <string>] [--depth <nbyte>] [--only <key>]
[--filter <key>] [--range <start-end>] [--badbytes <byte>]
[--rawArch <arch>] [--rawMode <mode>] [--rawEndian <endian>] [--re <re>]
[--offset <hexaddr>] [--ropchain] [--thumb] [--console] [--norop]
[--nojop] [--callPreceded] [--nosys] [--multibr] [--all] [--noinstr]
[--dump] [--silent] [--align ALIGN] [--mipsrop <rtype>]
选项翻译:

-h, --help:显示帮助信息并退出。
-v, --version:显示版本信息并退出。
-c, --color:输出彩色结果(需要终端支持)。
--binary <binary>:指定要分析的二进制文件。
--opcode <opcodes>:搜索包含指定指令的 gadgets。
--string <string>:搜索包含指定字符串的 gadgets。
--memstr <string>:搜索在内存中找到指定字符串的 gadgets。
--depth <nbyte>:搜索指定深度的 gadgets。
--only <key>:仅显示包含指定关键字的 gadgets。
--filter <key>:排除包含指定关键字的 gadgets。
--range <start-end>:在指定地址范围内搜索 gadgets。
--badbytes <byte>:排除包含指定字节的 gadgets。
--rawArch <arch>:指定原始架构(例如 x86, amd64, arm 等)。
--rawMode <mode>:指定原始模式(例如 3264 位)。
--rawEndian <endian>:指定原始字节序(例如 little 或 big)。
--re <re>:使用正则表达式搜索 gadgets。
--offset <hexaddr>:显示给定偏移地址附近的 gadgets。
--ropchain:为找到的 gadgets 生成一个 ROP 链。
--thumb:针对 ARM Thumb 指令集搜索 gadgets。
--console:将输出发送到控制台(在 --ropchain 模式下有用)。
--norop:不显示 ROP gadgets。
--nojop:不显示 JOP gadgets。
--callPreceded:仅显示被调用指令前面的 gadgets。
--nosys:不显示系统调用 gadgets。
--multibr:显示多个分支的 gadgets。
--all:显示所有 gadgets,无过滤。
--noinstr:不显示指令,只显示偏移。
--dump:输出 gadgets 的原始字节。
--silent:不显示任何警告或信息。
--align ALIGN:对 gadgets 偏移进行对齐。
--mipsrop <rtype>:针对 MIPS 架构,指定 ROP 类型(例如 rop, jop, rop_nop)。

这些选项可以帮助你根据特定需求定制 ROPgadget 的搜索和分析过程。例如,你可以使用 --opcode 来搜索包含特定指令序列的 gadgets,或者使用 --range 来限制搜索的地址范围。你还可以使用 --ropchain 来自动生成一个基于找到的 gadgets 的 ROP 链,这对于快速构建攻击载荷非常有用。

这些例子展示了如何使用ROPgadget的不同选项来执行特定的搜索和分析任务。下面是每个例子及其用途的中文解释:
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86
这个命令对指定的x86 Linux ELF二进制文件进行ROP gadgets搜索。
---------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --ropchain
这个命令除了搜索ROP gadgets之外,还自动生成一个ROP链。
--------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --depth 3
这个命令搜索深度为3的ROP gadgets,即只搜索包含3个或更少指令的gadgets。
---------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --string "main"
这个命令搜索包含字符串"main"的ROP gadgets。
---------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --string "m..n"
这个命令使用通配符搜索包含以"m"开头,接着是任意字符,以"n"结尾的字符串的gadgets。
---------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --opcode c9c3
这个命令搜索包含特定指令序列0xc9(leave)和0xc3(ret)的ROP gadgets。
---------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --only "mov|ret"
这个命令仅搜索包含mov或ret指令的ROP gadgets。
--------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --only "mov|pop|xor|ret"
这个命令仅搜索包含mov、pop、xor或ret指令的ROP gadgets。
----------------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --filter "xchg|add|sub|cmov.*"
这个命令搜索ROP gadgets,但排除包含xchg、add、sub或以cmov开头的指令的gadgets。
----------------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --norop --nosys
这个命令搜索gadgets,但不显示ROP gadgets和系统调用gadgets。
--------------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --range 0x08041000-0x08042000
这个命令在指定的地址范围内搜索ROP gadgets。
------------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --string main --range 0x080c9aaa-0x080c9aba
这个命令在指定的地址范围内搜索包含字符串"main"的ROP gadgets。
--------------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --memstr "/bin/sh"
这个命令搜索在内存中能找到字符串"/bin/sh"的ROP gadgets。
------------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --console
这个命令将ROP gadgets的输出发送到控制台,这在某些情况下,如生成ROP链时,可能很有用。
------------------
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --badbytes "00|01-1f|7f|42"
这个命令搜索ROP gadgets,但排除包含特定字节序列的gadgets,如空字节、控制字符和字节0x42。
------------------
ROPgadget.py --binary ./test-suite-binaries/Linux_lib64.so --offset 0xdeadbeef00000000
这个命令在指定的库文件中搜索偏移`0xdeadbeef00000000