Ret2reg,即攻击绕过地址混淆(ASLR),返回到寄存器地址。
一般用于开启ASLR
的ret2shellcode题型,在函数执行后,传入的参数在栈中传给某寄存器,然而该函数再结束前并为将该寄存器复位,就导致这个寄存器仍还保存着参数,当这个参数是shellcode
时,只要程序中存在jmp/call reg
代码片段时,即可拼接payload跳转至该寄存器
该攻击方法之所以能成功,是因为函数内部实现时,溢出的缓冲区地址通常会加载到某个寄存器上,在后在的运行过程中不会修改。
也就是说只要在函数ret之前将相关寄存器复位掉,便可以避免此漏洞。
主要在于找到寄存器与缓冲区地址的确定性关系,然后从程序中搜索call reg/jmp reg这样的指令
由于比较简单,这里就不再演示,需要复现,代码如下(具体步骤可参见底文链接)。
gcc -Wall -g -o ret2reg ret2reg.c -z execstack -m32 -fno-stack-protector
#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