利用原理

Ret2reg,即攻击绕过地址混淆(ASLR),返回到寄存器地址。

一般用于开启ASLR的ret2shellcode题型,在函数执行后,传入的参数在栈中传给某寄存器,然而该函数再结束前并为将该寄存器复位,就导致这个寄存器仍还保存着参数,当这个参数是shellcode时,只要程序中存在jmp/call reg代码片段时,即可拼接payload跳转至该寄存器

该攻击方法之所以能成功,是因为函数内部实现时,溢出的缓冲区地址通常会加载到某个寄存器上,在后在的运行过程中不会修改。

也就是说只要在函数ret之前将相关寄存器复位掉,便可以避免此漏洞。

利用思路

主要在于找到寄存器与缓冲区地址的确定性关系,然后从程序中搜索call reg/jmp reg这样的指令

  1. 分析和调试汇编,查看溢出函数返回时哪个寄存值指向传入的shellcode
  2. 查找call reg或jmp reg,将指令所在的地址填到EIP位置,即返回地址
  3. 再reg指向的空间上注入shellcode

例题

由于比较简单,这里就不再演示,需要复现,代码如下(具体步骤可参见底文链接)。

编译命令:

1
gcc -Wall -g -o ret2reg ret2reg.c -z execstack -m32 -fno-stack-protector

源代码

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>    
#include <string.h>    
void evilfunction(char *input) {    
    char buffer[512];    
    strcpy(buffer, input);    
}    
int main(int argc, char **argv) {    
    evilfunction(argv[1]);    
    return ;    

参考文章:https://blog.csdn.net/sinat_35695255/article/details/52031813