我目前正在尝试完成我的其中一个班级的作业,该作业需要由十个十六进制数字组成的序列才能使其不会崩溃。任务是找到这些数字并以正确的顺序输入它们,以扩散所谓的“炸弹”。我们获得了y86源代码(恰好还包含x86汇编代码)。

我的问题是,是否有任何一般性提示可用于在内存中查找这些数字或仅通过查看x86代码将部分代码转换为C代码?我了解每个单独的调用在做什么,只是不确定它涉及500行以上的汇编代码时该从哪里开始。被赞赏。谢谢!

评论

如果您拥有源代码,则应该能够对其进行汇编,然后使用调试器逐步调试二进制文件

#1 楼

有一个用于y86代码的基于Web的模拟器/模拟器/ js-y86 /

您可以在此
中逐步操作

评论


因此,我尝试了一下,结果发现该模拟器接受了源代码中的一些十六进制数字……我想我将不得不诉诸于代码本身。

– T. Pruden
18年5月4日在22:39

#2 楼

这些数字可以存储在内存中,也可以算术计算。当将它们定义为全局常量时,或者当代码生成这些值并将其在执行期间与输入序列进行比较之前的一段时间内将它们写入内存时,可能会发生前一种情况。另外,即使一个十六进制数字(我假设用“数字”表示一个数字,而不是无限数量的数字)仅需要4位即可表示,但实际上有许多不同的方式来表示10个十六进制数字。因此,可以使用4字节的寄存器来保存一位或多位数字。如您所见,有很多可能性。因此,直接查找数字并不是找出它们的最快方法,并且很容易被炸毁。与实际数字。基本上需要进行十次(或更少)比较。在第一个不等式上,很可能会跳至“炸弹爆炸”的代码。因此,我认为您应该首先检查所有jne指令(与x86相同)。检查周围的代码,看看是否存在循环结构或某种重复的比较。在循环中在mrmovl周围查找jne也是一个好主意,这表明这些数字是从内存中获取的。如果那使您无所适从,则可以检查jejmp周围的代码,它们也可以一起用于构造循环。请注意,如果您发现了一个可疑的循环,但没有mrmovl,那么该数字可能会在循环中进行算术计算。相对较少的jneje指令。检查它们每个只需要几分钟。

现在,一旦找到一段似乎在将十个数字与其他十个数字进行比较的代码,就可以将其追溯到程序的入口点,以确保要比较的是输入序列并且而不是一些伪造的代码或其他东西。通过使用某些工具构建程序的控制流程图,可以使此过程变得更容易。但是您的代码足够小,所以我想可以手动进行。