Debugging 调试没有源代码的程序(Unix/GDB)
这是家庭作业。仅提示,请不要给出确切答案 我有一个接受命令行参数的编译程序(没有源代码)。给定数量的命令行参数的正确顺序将使程序打印出“成功”。给定错误的参数,程序将打印出“失败” 让我困惑的一件事是,说明中提到了两个系统工具(没有给出它们的名称),这将有助于找出正确的参数。我唯一熟悉的工具(除非我忽略了什么)是GDB,所以我相信我错过了这个挑战的一个关键部分Debugging 调试没有源代码的程序(Unix/GDB),debugging,unix,gdb,Debugging,Unix,Gdb,这是家庭作业。仅提示,请不要给出确切答案 我有一个接受命令行参数的编译程序(没有源代码)。给定数量的命令行参数的正确顺序将使程序打印出“成功”。给定错误的参数,程序将打印出“失败” 让我困惑的一件事是,说明中提到了两个系统工具(没有给出它们的名称),这将有助于找出正确的参数。我唯一熟悉的工具(除非我忽略了什么)是GDB,所以我相信我错过了这个挑战的一个关键部分 挑战在于找出正确的论点。到目前为止,我已经在GDB中运行了这个程序,并在main上设置了一个断点,但我真的不知道从那里可以走到哪里。有什
挑战在于找出正确的论点。到目前为止,我已经在GDB中运行了这个程序,并在
main
上设置了一个断点,但我真的不知道从那里可以走到哪里。有什么专业提示吗?您确定要调试它吗?拆卸它会更容易。当您拆解它时,请查找cmp
您确定必须调试它吗?拆卸它会更容易。拆解时,请查找cmp
就我个人而言,我会从带有任意参数集的程序的
ltrace
开始。然后,我将使用strings
命令,并由此猜测一些隐藏的参数文字可能是什么。(让我们假设,目前教授没有对字符串进行加密或模糊处理,它们以文本形式出现在二进制文件中)。然后用一个或两个(或必要的号码,如果是号码)再试一次
如果幸运的话,该程序是在不运行strip
的情况下编译并提供给您的。在这种情况下,您可能需要符号表的帮助。然后您可以尝试单步执行程序(阅读gdb
手册)。这可能会很乏味,但有一些方法可以设置断点并告诉调试器运行某些函数调用(例如来自标准库的任何函数调用)并在返回时停止。重复执行此操作(确定它调用标准库或外部库的位置,为返回后的下一条指令设置断点,让gdb在调用过程中运行进程,然后检查代码除此之外正在执行的操作
再加上ltrace
,应该很容易看到strcmp()
(或类似)的顺序调用。当您看到与您的输入进行比较的字符串时,您可以中断整个过程,使用该参数重新调用gdb
和程序,跟踪到下一个参数,依此类推。或者您可以学习一些更高级的gdb
技巧,实际修改参数向量并重新启动main()
从头开始
这听起来很有趣,我可能会让我妻子为我准备一个简单的二进制文件来试用。它也可能会创建一个小程序来生成这种二进制文件。我想在提供“密码短语”的源代码中包含一些一个从/usr/dict/words中选择三到五个单词的make文件,从模板中生成包含文件,然后使用该序列编译二进制文件。我个人会从带有任意参数集的程序的
ltrace
开始这就是一些隐藏的参数文字可能是什么。(让我们暂时假设教授没有加密或混淆字符串,并且它们在二进制文件中显示为文字)。然后用一个或两个(或者必要的数字,如果是数字)再试一次
如果您幸运的话,该程序是在没有运行strip
的情况下编译并提供给您的。在这种情况下,您可能会有符号表提供帮助。然后您可以尝试单步执行该程序(阅读gdb
手册)。这可能会很乏味,但有一些方法可以设置断点,并告诉调试器运行某些函数调用(如来自标准库的任何函数调用),然后在返回时停止。重复执行此操作(标识