无源代码调试程序(Unix/GDB)

问题描述:

这是作业。提示只,没有确切的答案请。无源代码调试程序(Unix/GDB)

我有一个编译的程序(无源代码),它接受命令行参数。有一个给定数量的命令行参数的正确序列,将使程序打印出“成功”。鉴于错误的论据,它会打印出“失败”。

有一件令我困惑的事情是,指令提到两个系统工具(不会命名它们),这将有助于找出正确的参数。我熟悉的唯一工具(除非我忽略了一些东西)是GDB,所以我相信我错过了这个挑战的关键部分。

挑战是找出正确的论点。到目前为止,我已经在GDB中运行该程序,并在main处设置了一个断点,但我真的不知道该从哪里去。任何专业提示?

+0

什么操作系统(精确)? – jlliagre 2012-03-11 09:17:04

您确定要调试吗?拆解它会更容易。当你拆开它寻找cmp

  1. 存在着不仅工具进行反编译X86二进制文件汇编代码列表,但也有一些它试图展现更高层或可读上市。尝试使用Google,看看你找到了什么。我会具体的,但是,如果你的工作是学习一些逆向工程技能,那将会适得其反。

  2. 有可能代码是这样的:如果Arg(1)='FOO',然后打印“成功”。所以你可能根本不需要反汇编。相反,您可能只需找到一个工具,该工具将可执行文件中的所有字符串转储为ASCII字符序列。如果您要输入的序列不在从键盘轻松输入的一组字符中,则存在许多将执行此操作的实用程序。如果程序的构造非常小心,作者将不会留下“FOO”,如果那是明显的“密码”,但会试图掩盖它。

就我个人而言,我会从该程序的ltrace开始,使用任意任意一组参数。然后,我会使用strings命令,并从中猜出隐藏的参数文字可能是什么。 (暂时假设教授没有对字符串进行加密或混淆,并且它们以文字形式出现在二进制文件中)。然后再试一次或两次(或必要的号码,如果是号码)。

如果幸运的话,程序将被编译并提供给您,而不会运行strip。在这种情况下,您可能需要符号表来提供帮助。然后你可以尝试单步执行程序(阅读gdb手册)。它可能很乏味,但有一些方法可以设置一个断点并告诉调试器通过一些函数调用(比如标准库中的任何函数)运行,并在返回时停止。重复执行此操作(确定将它调入标准或外部库的位置,在返回后为下一条指令设置断点,让gdb通过调用运行该流程,然后检查代码正在执行的操作)

耦合与ltrace应该很容易看到strcmp()(或类似的)调用的顺序。当你看到你的输入被比较的字符串时,你可以跳出整个过程并重新调用gdb和程序用这一个参数追踪下一个等等,或者你可以学习一些更高级的技巧,并且实际上修改你的参数向量并从头开始重新启动main()

它实际上听起来很有趣,我可能会让我的妻子为我尝试一个简单的二进制文件。它也可能创建一个小程序来生成这种二进制文件。我正在考虑提供参数“密码”的源代码中的#INCLUDE,以及从/ usr/dict/words中选择三到五个单词的make文件,从模板生成#INCLUDE文件,然后编译使用该序列的二进制文件。