【问题标题】:Buffer Overflow (Return address) [duplicate]缓冲区溢出(返回地址)[重复]
【发布时间】:2011-08-09 09:56:37
【问题描述】:

可能重复:
how to skip a line doing a buffer overflow in c

我在 RHEL5 上使用 gdb 反汇编了 main() 函数。基本上我想将返回地址更改为代码中的其他一些指令。

场景:

function(int a,int b)
{
    char buffer[16];
    //some operations here..
}

int main()
{
    int x = 12;
    int y =13;
    int p ;

    function(x,y);

    p = 100;

    printf("%d",p);
}

我想跳过 p = 100 并想跳过 printf 调用。! 在 GDB 中,我检查了函数调用的地址。

 something --> 0x0804827b

main()function() 的地址范围 --> 0x080.....某事。

但在程序中,当我尝试使用 &a 获取变量地址时,十六进制地址看起来像 0xbfeca... 的东西。

为什么会这样?我不明白这背后的原因,所以我什至无法获取返回地址或更改返回地址。我应该如何进行?可能是什么原因?

【问题讨论】:

标签: c assembly stack buffer-overflow


【解决方案1】:

a 变量被放入堆栈。它是一个局部变量来起作用。返回地址也存储在堆栈中。

地址 0xbf...... 是典型的堆栈,地址 0x080..... 是典型的代码段。

要替换返回地址,您应该检查(例如使用 gdb)&a 附近的内存以找到返回地址(应该是 0x080 之类的地址.....)。然后就可以更换了。

【讨论】:

    【解决方案2】:

    在 MSVC 下,您有 _AddressOfReturnAddress(不知道 GCC 等价物*)内在函数,您可以使用它通过添加要跳过的指令的大小来篡改返回地址。但是,对于 cdecl 函数或如果有任何重新排序,失败。在您的情况下,p = 100; 也会被优化。

    类似这样的 TBH 将是非常情景化的,可能需要在“着陆点”编写自定义程序集。对于您的情况,最好的选择是用无条件跳转到您的目标来替换分配。

    *但是,根据您所运行的系统(其 ABI)和使用的调用约定,您可以使用:

    void* pAddressOfReturn = (&a) - sizeof(void*);
    

    其中函数为__stdcall__cdecl

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2021-06-13
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多