我正在阅读此writeup有关如何执行ret2libc
漏洞利用的信息。它声明传递给函数的参数存储在ebp+8
。
现在,如果我采用一个简单的C程序
#include <stdlib.h>
int main() {
system("/bin/sh");
}
编译它:
gcc -m32 -o test_sh test_sh.c
并查看它的反汇编
objdump -d -M intel test_sh
0804840b <main>:
804840b: 8d 4c 24 04 lea ecx,[esp+0x4]
804840f: 83 e4 f0 and esp,0xfffffff0
8048412: ff 71 fc push DWORD PTR [ecx-0x4]
8048415: 55 push ebp
8048416: 89 e5 mov ebp,esp
8048418: 51 push ecx
8048419: 83 ec 04 sub esp,0x4
804841c: 83 ec 0c sub esp,0xc
804841f: 68 c4 84 04 08 push 0x80484c4
8048424: e8 b7 fe ff ff call 80482e0 <system@plt>
8048429: 83 c4 10 add esp,0x10
804842c: b8 00 00 00 00 mov eax,0x0
8048431: 8b 4d fc mov ecx,DWORD PTR [ebp-0x4]
8048434: c9 leave
8048435: 8d 61 fc lea esp,[ecx-0x4]
8048438: c3 ret
8048439: 66 90 xchg ax,ax
804843b: 66 90 xchg ax,ax
804843d: 66 90 xchg ax,ax
804843f: 90 nop
该行
804841f: 68 c4 84 04 08 push 0x80484c4
按下字符串&#34; / bin / sh&#34;的地址到堆栈上。之后立即调用system@plt
函数。那么如何从上面的输出到达ebp+8
?
帮助将不胜感激!
答案 0 :(得分:2)
您没有,因为EBP + 8仅在创建新程序框架后系统@ plt中的序言之后才相关。
push ebp
mov ebp, esp
此时在system @ plt中,EBP + 8指向的内存位置内容将等于0x80484C4。
答案 1 :(得分:2)
传递给函数的参数存储在ebp + 8。
来自 调用 功能的观点,而不是 调用 强>功能的观点。调用函数在ebp+8
有自己的参数,而您的main()
不使用任何参数,因此,您在{{{{}}中看不到ebp+8
的使用1}}。
您可以按如下方式查看main()
:
尝试使用参数编写第二个函数,并从ebp+8
调用它,而不是调用main()
。您仍未在system()
内看到ebp+8
的使用情况,但您会在第二个功能中看到它被使用。
尝试声明您的main()
接受其main()
参数,然后尝试将char** argv
发送至argv[0]
。