如何使用缓冲区溢出攻击替换堆栈上的返回地址

4
为了完成一项作业任务,我正在执行一系列缓冲区溢出攻击。我被提供了一个需要反汇编的程序,其中包括一个C语言函数的源代码,该函数错误地调用了gets(),以及其他几个函数的源代码,我应该迫使程序调用这些函数。对于其中一个任务,我必须:
  • 注入一些修改值的代码,然后
  • 返回到前面提到的某些方法中之一
我不理解的主要问题是当程序决定返回到哪里时,程序在堆栈中查找的位置。一个方法的返回地址存储在哪里?
该程序是为x86编译的。

2
首先,您需要了解在x86机器代码中函数调用发生了什么。看一下callret指令。如果您理解了这些内容,可以尝试学习堆栈帧是什么。 - David J
1个回答

13

需要了解的内容:

  • 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艺术中,较低的地址在下方)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接