0x0 开始
做题需要用到ROPgadget,去安装下载,然后麻烦越来越多,将成功过程记录下来。
它就是用来查找你的二进制文件中你想要的一些指令,方便你加以利用。
有了ROPgadget 你会发现one_gadget也是必须的。
one_gadget的安装与使用
0x0.1介 绍
使用此工具,您可以在二进制文件中搜索Gadgets,以方便您对ROP的利用。
随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果。攻击者们也提出来相应的方法来绕过保护,目前主要的是 ROP(Return Oriented Programming),其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。所谓 gadgets 就是以 ret 结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。
我们知道x86都是靠栈来传递参数的而x64换了它顺序是rdi, rsi, rdx, rcx, r8, r9,(这里6个寄存器可以被理解为Gadgets)如果多于6个参数才会用栈我们要先知道这个特性.
有的题,里面既没有现成的system也没有/bin/sh字符串,也没有提供libc.so给我们,那么我们要做的就是想办法泄露libc地址,拿到system函数和/bin/sh字符串;
我们就需要获取rdi, rsi, rdx, rcx, r8, r9它们的地址,首先要获取的是rdi的地址;
这就是 ROPgadget 的作用;
0x1 安装
安装命令
sudo apt-get install python-capstone
git clone https://github.com/JonathanSalwan/ROPgadget.git
cd ROPgadget
sudo python setup.py install
0x2 出错处理
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnL4kTN4ATM0UTM1EDMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
出错。。。
解决方案
先进目录
然后注意刚刚最后报错那一段,at后面引号里面那一段,他说缺那个目录。
然后输入
sudo cp -r scripts /home/wuangwuang/.local/lib/python2.7/site-packages/ROPGadget-6.3.dist-info
不要直接复制,用户、python版本啥的都不一样,那个 sudo cp -r scripts 然后再把刚说的引号里面的复制下去,搞定。
0x3 使用
64位汇编传参,当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。 > 当参数为7个以上时,
前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。
一.
命令: ROPgadget --binary 文件名 --only "pop|ret" | grep rdi
命令: ROPgadget --binary 文件名 --only "pop|ret" | grep rsi
命令: ROPgadget --binary 文件名 --only "pop|ret"
命令: ROPgadget --binary 文件名 --only 'int' 查找有int 0x80的地址
二.
该工具除了可以用来查找 ret/rdi的地址,还可以用来查找一些字符串的地址
命令: ROPgadget --binary 文件名 --sting '/bin/sh'
命令: ROPgadget --binary 文件名 --sting '/sh'
命令: ROPgadget --binary 文件名 --sting 'sh'
命令: ROPgadget --binary 文件名 --sting 'cat flag'
命令: ROPgadget --binary 文件名 --sting 'cat flag.txt'