【问题标题】:Determine what parameters were passed to a function确定传递给函数的参数
【发布时间】:2015-10-24 15:58:37
【问题描述】:

下面是反汇编代码:

=> 0x08048d62 <+0>:     sub    $0x2c,%esp 
  0x08048d65 <+3>:     lea    0x1c(%esp),%eax 
  0x08048d69 <+7>:     mov    %eax,0xc(%esp) 
  0x08048d6d <+11>:    lea    0x18(%esp),%eax 
  0x08048d71 <+15>:    mov    %eax,0x8(%esp) 
  0x08048d75 <+19>:    movl   $0x804a681,0x4(%esp) 
  0x08048d7d <+27>:    mov    0x30(%esp),%eax 
  0x08048d81 <+31>:    mov    %eax,(%esp) 
  0x08048d84 <+34>:    call   0x80488d0 <__isoc99_sscanf@plt> 
  0x08048d89 <+39>:    cmp    $0x2,%eax 
  0x08048d8c <+42>:    jne    0x8048d95 <phase_4+51> 
  0x08048d8e <+44>:    cmpl   $0xe,0x18(%esp) 
  0x08048d93 <+49>:    jbe    0x8048d9a <phase_4+56> 
  0x08048d95 <+51>:    call   0x8049385 <explode_bomb> 
  0x08048d9a <+56>:    movl   $0xe,0x8(%esp) 
  0x08048da2 <+64>:    movl   $0x0,0x4(%esp) 
  0x08048daa <+72>:    mov    0x18(%esp),%eax 
  0x08048dae <+76>:    mov    %eax,(%esp) 
  0x08048db1 <+79>:    call   0x8048d05 <func4> 
  0x08048db6 <+84>:    cmp    $0x25,%eax 
  0x08048db9 <+87>:    jne    0x8048dc2 <phase_4+96> 
  0x08048dbb <+89>:    cmpl   $0x25,0x1c(%esp) 
  0x08048dc0 <+94>:    je     0x8048dc7 <phase_4+101> 
  0x08048dc2 <+96>:    call   0x8049385 <explode_bomb> 
  0x08048dc7 <+101>:   add    $0x2c,%esp 
  0x08048dca <+104>:   ret  

我知道大多数汇编指令的作用,但是我通过一些互联网搜索知道 func4 中的参数是 (x, 0, 14)

而且参数似乎存储在$esp中。

我们如何根据汇编代码知道参数在哪里加载?它总是在 $esp 中吗?

【问题讨论】:

  • 您询问的详细信息由架构的 ABI 定义。你可以通过研究为你的架构找到这个。在 x86 上,参数通常被压入堆栈,但 x86 有各种调用约定。

标签: c debugging assembly gdb


【解决方案1】:

https://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions 从地址看,它看起来像一个32位系统。对于 linux/x86,参数在堆栈中,esp 是帮助您检索它们的堆栈指针。

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 2012-02-14
    • 2019-07-21
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2021-04-18
    相关资源
    最近更新 更多