【问题标题】:How to replace the return address on the stack using a buffer overflow attack如何使用缓冲区溢出攻击替换堆栈上的返回地址
【发布时间】:2012-10-21 19:25:34
【问题描述】:

对于家庭作业,我正在执行一系列缓冲区溢出攻击。我得到了一个反汇编程序,一个不正确调用gets()的函数的C源代码,以及我应该强制程序调用的其他几个函数的源代码。对于其中一项任务,我必须:

  • 注入一些改变值的代码,然后
  • 返回上述方法之一

主要是我不明白程序在确定返回位置时在堆栈中的位置。存储在堆栈中的方法的返回地址在哪里?

程序是为 x86 编译的。

【问题讨论】:

  • 首先您需要了解在 x86 机器代码中的函数调用中发生了什么。查看callret 指令。如果你明白了,你可以尝试了解什么是堆栈帧。

标签: assembly x86 buffer-overflow


【解决方案1】:

你需要知道的:

  • EIP 是指向下一条要执行的指令的寄存器。
  • 调用函数时,参数和 EIP(因此被调用的函数知道返回到哪里)保存在堆栈中。

  • 当编译器被告知(显式或隐式)使用帧指针时,它会将帧指针(在 EBP 寄存器中)保存在堆栈中(以便以后可以将帧指针恢复为调用函数),然后将帧指针设置为指向当前栈顶。这允许从已知的参考点(帧指针)轻松访问参数和局部变量,并大大简化了调试。

  • 然后,为局部变量保留空间,并执行函数。
  • 从函数返回时,恢复之前的帧指针和指令指针。

x86 上的函数调用类似于:

                                        ...
int main()                              add  $-0x8,%esp ; alignment
{                                       push $0x2       ; arg 2
        ...                             push $0x1       ; arg 1
        func(1, 2);                     call func       ; function call
        ...                             add  $0x10,%esp ; pop args from stack
}                                       ...

被调用的函数看起来像:

void func(int arg1, int arg2)           push %ebp       ;\
{                                       mov  %esp,%ebp  ;/ create stack frame
        int local1;                     sub  $0x18,%esp ; reserves space
        ...                             ...
}                                       mov  %ebp,%esp  ;\
                                        pop  %ebp       ;/ destroys frame
                                        ret             ; returns

因此,堆栈看起来类似于:

          :           :
          +-----------+
          : alignment :
          +-----------+
12(%ebp)  |   arg2    |
          +-----------+
 8(%ebp)  |   arg1    |
          +-----------+
 4(%ebp)  |    ret    | -----> return address
          +-----------+
  (%ebp)  |    ebp    | -----> previous ebp
          +-----------+
-4(%ebp)  |  local1   | -----> local vars
          +-----------+
          : alignment :
          +-----------+
          :           :

(ASCII-art 中较低的地址较低)

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2014-04-21
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多