GDB调用不在main中的函数

时间:2018-02-04 12:38:20

标签: c assembly x86 gdb

我的教授给了我们一个任务,通过使用GDB查找密码的c程序生成的x86指令。我们的工作是经历6个阶段,并找到隐藏在x86指令中某处的密码。我能够通过所有这些,但最后我注意到在x86文件中,有一个名为secret_phase的函数。我的理解是,如果我们完成了secret_phase,我们会得到额外的信用。问题是,secret_phase永远不会从主函数调用,所以我不知道如何访问它。有没有办法从GDB调用secret_phase函数?

1 个答案:

答案 0 :(得分:3)

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

break main
run
call ((void(*)()) secret_phrase)()

在这里你指定要调用的函数原型,猜测是它不带参数并且什么都不返回。如果你期望它,例如要将char*作为print ((char*(*)()) secret_phrase)() 返回密码,您可以尝试:

break main
run
break secret_phrase
jump secret_phrase

或任何其他返回类型,但这是猜测。

更严格的方法是跳转到该功能,可以在任何执行点完成:

stepi

(注意第二次休息,没有它执行将立即进行,并且很可能程序将崩溃,因为你跳转到函数,而不是它被调用)。确认调试器将在secret_phrase开始时停止。小心地继续retn,一旦执行disassemble secret_phrase指令,程序可能会崩溃。但是你有机会仔细研究这个功能。

除此之外你可能应该从import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.OneToMany; @Entity public class Kunde { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "kunde") // property name in your bean Verlauf private List<Verlauf> verlauf; } import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.ManyToOne; import javax.persistence.JoinColumn; @Entity public class Verlauf { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "kunde_id") // column name in your database table used for Verlauf entity private Kunde kunde; } 开始寻找线索。