C GDB调用不在main中的函数

C GDB调用不在main中的函数,c,assembly,x86,gdb,C,Assembly,X86,Gdb,我的教授给我们布置了一个任务,让我们一步一步地通过使用GDB的c程序生成的x86指令来查找密码。我们的工作是经过6个阶段,找到x86指令中隐藏的密码。我能看完所有这些,但最后我注意到在x86文件中,有一个名为secret_phase的函数。我的理解是,如果我们完成秘密阶段,我们将获得额外的学分。问题是,从未从主函数调用secret_阶段,所以我甚至不知道如何访问它。有没有办法从GDB调用secret_phase函数 如果你是一个乐观主义者,并且希望这个秘密短语,比如说,只是在屏幕上打印出秘密短语

我的教授给我们布置了一个任务,让我们一步一步地通过使用GDB的c程序生成的x86指令来查找密码。我们的工作是经过6个阶段,找到x86指令中隐藏的密码。我能看完所有这些,但最后我注意到在x86文件中,有一个名为secret_phase的函数。我的理解是,如果我们完成秘密阶段,我们将获得额外的学分。问题是,从未从主函数调用secret_阶段,所以我甚至不知道如何访问它。有没有办法从GDB调用secret_phase函数

如果你是一个乐观主义者,并且希望这个秘密短语,比如说,只是在屏幕上打印出秘密短语,那么就做:

break main
run
call ((void(*)()) secret_phrase)()
这里您指定要调用的函数原型,猜测是它不接受任何参数,也不返回任何内容。如果您希望返回密码,例如,以
char*
的形式返回密码,您可以尝试:

print ((char*(*)()) secret_phrase)()
或任何其他返回类型,但这只是猜测

更严格的方法是跳转到该函数,可以在任何执行点执行:

break main
run
break secret_phrase
jump secret_phrase
(注意第二个中断,如果没有它,执行将立即进行,并且最有可能的程序将崩溃,因为您跳转到函数,而不是调用它)。确认后,调试器将在密码短语的开头停止。小心执行
stepi
,一旦执行
retn
指令,程序可能会崩溃。但您将有机会仔细检查函数


除此之外,您可能应该从
反汇编secret\u短语开始,以寻找线索。

尝试
调用secret\u phase()
它告诉我-“secret\u phase”的返回类型未知;将调用转换为其声明的返回类型只需在汇编程序中调用即可。@MartinJames:“just”假设OP知道如何将新代码链接到已链接的可执行文件中。它们没有对象文件。有一件事是可行的(如果初学者具备可用工具的知识),那就是将反汇编复制/粘贴到asm源文件中,并将其与调用者重新组装。(使用类似的反汇编程序,使反汇编可以重新组装,在分支目标上有标签。)或使用十六进制编辑器编辑二进制炸弹中的
调用
指令之一,以调用
密码短语
,而不是
阶段1
。而不是
跳转
,您可以
设置$pc=secret\u短语来修改EIP/RIP,而无需继续执行。顺便说一句,我建议在
phase1
或其他位置停止时执行此“跳转”,因此当它返回时将返回到
main
。尽管您可能在这两种情况下都很好,但if
secret\u phrase
会自己提示输入,而不是查找main传递的参数。