Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 调试没有源代码的程序(Unix/GDB)_Debugging_Unix_Gdb - Fatal编程技术网

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

Debugging 调试没有源代码的程序(Unix/GDB),debugging,unix,gdb,Debugging,Unix,Gdb,这是家庭作业。仅提示,请不要给出确切答案 我有一个接受命令行参数的编译程序(没有源代码)。给定数量的命令行参数的正确顺序将使程序打印出“成功”。给定错误的参数,程序将打印出“失败” 让我困惑的一件事是,说明中提到了两个系统工具(没有给出它们的名称),这将有助于找出正确的参数。我唯一熟悉的工具(除非我忽略了什么)是GDB,所以我相信我错过了这个挑战的一个关键部分 挑战在于找出正确的论点。到目前为止,我已经在GDB中运行了这个程序,并在main上设置了一个断点,但我真的不知道从那里可以走到哪里。有什

这是家庭作业。仅提示,请不要给出确切答案

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

让我困惑的一件事是,说明中提到了两个系统工具(没有给出它们的名称),这将有助于找出正确的参数。我唯一熟悉的工具(除非我忽略了什么)是GDB,所以我相信我错过了这个挑战的一个关键部分


挑战在于找出正确的论点。到目前为止,我已经在GDB中运行了这个程序,并在
main
上设置了一个断点,但我真的不知道从那里可以走到哪里。有什么专业提示吗?

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

您确定必须调试它吗?拆卸它会更容易。拆解时,请查找
cmp

  • 不仅存在将X86二进制文件反编译为汇编代码清单的工具,还有一些工具试图显示更高级别或可读性更强的清单。试试谷歌搜索,看看你发现了什么。我想说得具体一点,但如果你的工作是学习一些逆向工程技能,那将适得其反

  • 代码可能是这样的:如果Arg(1)=“FOO”,则打印“Success”。因此,您可能根本不需要拆解。相反,您可能只需要找到一个工具来转储可执行文件中看起来像ASCII字符序列的所有字符串。如果您应该输入的序列不在从键盘轻松输入的字符集中,那么有许多实用程序可以做到这一点。如果这个程序是非常仔细地构造的,那么作者就不会把“FOO”作为“密码”放在显眼的地方,而是会试图在某种程度上掩盖它

  • 不仅存在将X86二进制文件反编译为汇编代码清单的工具,还有一些工具试图显示更高级别或可读性更强的清单。试试谷歌搜索,看看你发现了什么。我想说得具体一点,但如果你的工作是学习一些逆向工程技能,那将适得其反

  • 代码可能是这样的:如果Arg(1)=“FOO”,则打印“Success”。因此,您可能根本不需要拆解。相反,您可能只需要找到一个工具来转储可执行文件中看起来像ASCII字符序列的所有字符串。如果您应该输入的序列不在从键盘轻松输入的字符集中,那么有许多实用程序可以做到这一点。如果这个程序是非常仔细地构造的,那么作者就不会把“FOO”作为“密码”放在显眼的地方,而是会试图在某种程度上掩盖它


  • 就我个人而言,我会从带有任意参数集的程序的
    ltrace
    开始。然后,我将使用
    strings
    命令,并由此猜测一些隐藏的参数文字可能是什么。(让我们假设,目前教授没有对字符串进行加密或模糊处理,它们以文本形式出现在二进制文件中)。然后用一个或两个(或必要的号码,如果是号码)再试一次

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

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


    这听起来很有趣,我可能会让我妻子为我准备一个简单的二进制文件来试用。它也可能会创建一个小程序来生成这种二进制文件。我想在提供“密码短语”的源代码中包含一些一个从/usr/dict/words中选择三到五个单词的make文件,从模板中生成包含文件,然后使用该序列编译二进制文件。

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

    如果您幸运的话,该程序是在没有运行
    strip
    的情况下编译并提供给您的。在这种情况下,您可能会有符号表提供帮助。然后您可以尝试单步执行该程序(阅读
    gdb
    手册)。这可能会很乏味,但有一些方法可以设置断点,并告诉调试器运行某些函数调用(如来自标准库的任何函数调用),然后在返回时停止。重复执行此操作(标识