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>:指定原始模式(例如 32 或 64 位)。 --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
|