了解参数如何传递给Assembly中的函数

时间:2017-03-31 05:16:19

标签: c assembly

我正在阅读此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

帮助将不胜感激!

2 个答案:

答案 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]