c - 访问 main 之后定义的函数

标签 c assembly gdb buffer-overflow shellcode

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

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

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

我的代码中没有使用 __magic 函数,它只是在 main 之后声明。 我希望找到函数__magic的地址。 如何才能做到这一点而不必在 main 之前声明函数? 我使用 gdb 进行调试。

附注 我还想知道这个函数是否保存在我的进程内存中,因为没有声明/使用它。编译器可能不会添加该函数吗?

最佳答案

您需要澄清“查找函数 __magic 的地址”到底是什么意思。如果您只想查看地址是什么(即不在代码中使用它),那么您可以使用 objdump 来显示符号值。

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

关于c - 访问 main 之后定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27443326/

相关文章:

c - c程序中的asm指令替代

c++ - 使用制表符完成打印变量时 gdb 卡住

c++ - 从函数获取 char* 后的条件 gdb 断点

c - 如何在 gcc 4.9.2 中创建字符串常量?

c - 返回指向多维数组的指针

C 打印形状 : Unable to add back slash

arrays - 内存中表示的未定义 vector 元素是什么?

c - 无分支溢出处理

assembly - 使用手写汇编调用 native 代码

eclipse - 无法通过 Eclipse 在 Genymotion 中调试 native Android 应用程序