gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:35:47 25 4
gpt4 key购买 nike

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

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

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

该程序是针对 x86 编译的。

最佳答案

您需要了解的内容:

  • 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 上较低)

关于assembly - 如何使用缓冲区溢出攻击替换堆栈上的返回地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13173162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com