这是作业。只提示,请不要确切的答案。
我有一个编译程序(没有源代码),它接受命令行参数。给定数量的命令行参数的正确序列将使程序打印出“成功”。鉴于错误的论点,它将打印出“失败”。
让我感到困惑的一件事是,指令提到了两个系统工具(没有命名它们),这有助于找出正确的参数。我熟悉的唯一工具(除非我忽视了一些东西)是GDB,所以我相信我错过了这一挑战的关键组成部分。
挑战在于弄清楚正确的论点。到目前为止,我已经在GDB中运行程序并在main
设置断点,但我真的不知道从那里去哪里。任何专业提示?
答案 0 :(得分:2)
你确定要调试它吗?拆卸它会更容易。当您反汇编它时,请查找cmp
答案 1 :(得分:1)
不仅存在将X86二进制文件反编译为汇编程序代码清单的工具,还存在一些试图显示更高级别或可读列表的工具。尝试谷歌搜索,看看你找到了什么。我是具体的,但是,如果你的工作是学习一些逆向工程技能,那将会适得其反。
代码可能是这样的:如果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文件,然后使用该序列编译二进制文件。