我一直在准备编码竞赛,并在互联网上遇到了这个问题:
#include <stdio.h>
void a();
void b();
void c();
int main() { a(); printf("\n"); return 0; }
void a() { b(); printf("hi "); }
void b() { c(); printf("there "); }
void c()
{
int x;
// code here and nowhere else
}
Run Code Online (Sandbox Code Playgroud)
解决方案是编写将打印出"hi there"而不是"there hi"的代码(不能使用额外的打印功能,代码只能放在注释块中).
由于我已经完成了一些基本的汇编代码,我意识到这可以通过使用整数x作为基础的堆栈操作来完成.
我试图用gdb找到的函数的返回地址,然后交换的返回地址a和b.编译器抛出了一个分段错误,因此我假设我没有使用正确的返回地址.
如何正确计算偏移量以找到返回地址?gdb上的信息框架命令没有帮助,因为使用给定的堆栈地址值不起作用.
我在Linux上使用gcc运行它.
c ×1