ROP-Ret2reg详解
利用原理
Ret2reg,即攻击绕过地址混淆(ASLR),返回到寄存器地址。
一般用于开启ASLR
的ret2shellcode题型,在函数执行后,传入的参数在栈中传给某寄存器,然而该函数再结束前并为将该寄存器复位,就导致这个寄存器仍还保存着参数,当这个参数是shellcode
时,只要程序中存在jmp/call reg
代码片段时,即可拼接payload跳转至该寄存器
该攻击方法之所以能成功,是因为函数内部实现时,溢出的缓冲区地址通常会加载到某个寄存器上,在后在的运行过程中不会修改。
也就是说只要在函数ret之前将相关寄存器复位掉,便可以避免此漏洞。
利用思路
主要在于找到寄存器与缓冲区地址的确定性关系,然后从程序中搜索call reg/jmp reg这样的指令
- 分析和调试汇编,查看溢出函数返回时哪个寄存值指向传入的shellcode
- 查找call reg或jmp reg,将指令所在的地址填到EIP位置,即返回地址
- 再reg指向的空间上注入shellcode
例题
由于比较简单,这里就不再演示,需要复现,代码如下(具体步骤可参见底文链接)。
编译命令:
1 | gcc -Wall -g -o ret2reg ret2reg.c -z execstack -m32 -fno-stack-protector |
源代码
1 |
|
参考文章:https://blog.csdn.net/sinat_35695255/article/details/52031813
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 偏有宸机!
评论