访问main之后定义的函数

时间:2014-12-12 12:06:22

标签: c assembly gdb buffer-overflow shellcode

我有一个C源文件,我不允许更改,定义如下:

int main(int argc, char *argv[])
{
    //doing something
    return 0
}

void __magic()
{
    __asm__("jmp %esp");
}

我的代码中没有使用fucntion __magic,它只是在main之后声明的。 我希望找到函数 __ magic 的地址。 如何在不必在main之前声明功能的情况下执行此操作? 我使用gdb进行调试。

P.S 我还想知道这个函数是否甚至保存在我的进程内存中,因为它没有声明/使用它。编译器可能只是没有添加该功能吗?

2 个答案:

答案 0 :(得分:1)

您需要通过“查找函数__magic的地址”来澄清您的具体含义。如果您只想查看地址是什么(即不在代码中使用它),那么您只需使用objdump来显示符号值。

但是,如果在编译时需要地址,那么就没有简单的方法可以做到。无法保证编译器会以任何特定的顺序放置函数的代码,即使这样做,也可能在函数之间存在未知量的填充。由于您使用的是%esp,我认为您的目标是32位x86 - 如果您的目标是64位,那么您还必须担心ASLR。

答案 1 :(得分:-1)

在main之前简单地为你的函数定义一个原型,这是专业人员用来总结他们努力的好方法

 void ___magic(); // it is a prototype definition 

 int main(int argc, char *argv[])
{
    //doing something
    return 0
}

void __magic()
{
  __asm__("jmp %esp");
}