【问题标题】:change return value of function with buffer overflow使用缓冲区溢出更改函数的返回值
【发布时间】:2015-08-26 12:03:27
【问题描述】:

x86 系统

我正在尝试更改函数的返回值。例如

int foo(){
   char buffer[12]; 
   gets(buffer);
   return 1;
}

int main(){
   int value;
   value = foo();
   return 0;
}

foo() 总是返回 1。我知道函数的返回值存储到 %eax(所以 1 存储到 %eax)。有什么方法可以达到并更改 %eax 值? 我认为这不可能发生,因为 %eax 没有出现在堆栈中!我说的对吗?

【问题讨论】:

  • foo 总是返回1,因为你是return 1;。找出你想要返回的内容,然后return the_value;。在 x86 汇编中,参数在堆栈上提供给被调用方,返回值在 EAX 中(不在堆栈上)返回给调用方。
  • 我认为他是在尝试破解现有程序,而不是重新编写代码。
  • 再看一遍。我认为你是对的。感谢您的澄清。
  • 我不想“修复”我的代码。我正在尝试使用缓冲区溢出来更改 foo 运行时的返回值

标签: c buffer-overrun


【解决方案1】:

由于您推测的原因,您将无法通过缓冲区溢出修改该函数中EAX 的值。但是,如何可能会接管程序执行,因为您可以覆盖整个堆栈帧,包括保存的帧指针和返回地址。

如何做到这一点似乎超出了您的问题范围,但这将取决于是否正在使用 ASLR、是否正在使用堆栈金丝雀、是否有一个不可执行的堆栈等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2011-08-09
    • 2013-10-08
    相关资源
    最近更新 更多