调试没有源代码的程序(Unix / GDB)

时间:2012-03-10 22:04:42

标签: debugging unix gdb

这是作业。只提示,请不要确切的答案。

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

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

挑战在于弄清楚正确的论点。到目前为止,我已经在GDB中运行程序并在main设置断点,但我真的不知道从那里去哪里。任何专业提示?

3 个答案:

答案 0 :(得分:2)

你确定要调试它吗?拆卸它会更容易。当您反汇编它时,请查找cmp

答案 1 :(得分:1)

  1. 不仅存在将X86二进制文件反编译为汇编程序代码清单的工具,还存在一些试图显示更高级别或可读列表的工具。尝试谷歌搜索,看看你找到了什么。我是具体的,但是,如果你的工作是学习一些逆向工程技能,那将会适得其反。

  2. 代码可能是这样的:如果Arg(1)='FOO',则打印“Success”。所以你可能根本不需要拆卸。相反,您可能只需要找到一个工具,该工具会转储可执行文件中看起来像ASCII字符序列的所有字符串。如果您要输入的序列不在键盘中容易输入的字符集中,则存在许多将执行此操作的实用程序。如果程序是经过精心构建的,那么如果那是“密码”,作者就不会留下“FOO”,但会试图掩盖它。

答案 2 :(得分:1)

我个人会从程序的ltrace开始,带有任意一组参数。然后我使用strings命令并猜测一些隐藏的参数文字可能是什么。 (暂时假设教授没有对字符串进行加密或混淆,并且它们在二进制文件中显示为文字)。然后再尝试一两个(或必要的数字,如果是数字)。

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

ltrace相结合,应该很容易看到strcmp()(或类似)调用的排序。当您看到与您的输入进行比较的字符串时,您可以突破整个过程并使用该参数重新调用gdb和程序,直到下一个跟踪,所以上。或者您可以学习一些更高级的gdb技巧并实际修改您的参数向量并从头开始重新启动main()

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