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