【问题标题】:Access EBP register from C shellcode从 C shellcode 访问 EBP 寄存器
【发布时间】:2020-07-02 10:49:13
【问题描述】:

我正在尝试理解一些汇编代码,以便我可以在 C 中使用它。假设以下 NASM 代码

get_entry_point:
    %define STACK_LIMIT 8
    %define return_val [ebp-4]
    %define base_ptr [ebp-8]

ebp 寄存器是简单地访问函数的参数并将它们存储在base_ptrreturn_val 中,还是在做其他事情?

void __stdcall get_entry_point(unsigned long return_val, unsigned long base_ptr);

关于以下代码

push ebp
mov ebp, esp
sub esp, STACK_LIMIT
pushad

在上面的原型 C 函数中会是什么样子?

【问题讨论】:

  • 这段代码看起来像{
  • @user253751 哈哈,很有趣。可能对代码本身提供更深入的解释?就像我理解代码设置堆栈一样,但这是否是说 C 编译器会自动执行此操作并汇编其手册?但是 %define 符号呢……它假设变量已经在堆栈的 ebp 内……它们是如何开始的?
  • ebp 的负偏移量通常是局部变量。这似乎也是这里的情况。 STACK_LIMIT 是所有变量的大小。 [ebp-4]return_val变量的地址,占栈帧的4个字节。
  • 请注意,您的示例并未初始化这两个变量。既没有参数也没有其他任何东西。 (从技术上讲,确切地说,它们的堆栈槽将保存可能从其他函数调用/堆栈用户的先前堆栈帧中遗留下来的伪随机数值。)
  • @ecm 啊,非常感谢 :) 这更有意义!

标签: c assembly nasm


【解决方案1】:

是ebp指令

ebp 不是指令,它是一个寄存器。它是一个变量的程序集等价物。

%define return_val [ebp-4] 也不是指令。这只是意味着,无论代码中写着return_val,汇编器都会将其视为您编写[ebp-4]

关于下面的代码......在上面的原型 C 函数中会是什么样子?

这是编译器在需要时添加到每个函数开头的标准代码。

它看起来像函数开头的{,因为它是自动插入到函数开头的。

【讨论】:

  • 但是 ebp 是如何知道将哪些值放置在位置 -4、-8 等的变量中的呢?我的意思是,它们是像传递给函数的变量还是一些全局值?
  • @randomuser843 负数ebp 偏移量通常是指函数中的局部变量或编译器溢出到堆栈上的临时值。 ebp 没有感知力,它什么都不知道。它只是一个寄存器(baseframe 指针),保存堆栈中当前堆栈帧的开始。
  • @randomuser843 ebp 具有特定值,因为mov ebp, esp 基本上是ebp = esp;。那么为什么 esp-4、-8 等处的变量呢?这是因为调用者函数把它们放在那里。
  • (实际上这些必须是像fuz所说的局部变量,因为参数将是esp+something而不是esp-something。)
猜你喜欢
  • 2012-01-11
  • 2012-12-08
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 2016-06-07
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多