一般 x86 转 C 的技巧?

逆向工程 拆卸 部件 x86
2021-07-04 04:18:52

我目前正在尝试完成我的一个课程的作业,该作业需要十个十六进制数的序列才能不爆炸。任务是找到这些数字并以正确的顺序输入它们以扩散所谓的“炸弹”。我们得到了 y86 源代码(巧合的是它也包含 x86 汇编代码)。

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

我知道提供此类一般性建议可能很困难,但我们感谢您提供任何帮助。谢谢!

2个回答

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

你可以通过这个

在此处输入图片说明

这些数字可以存储在内存中,也可以进行算术计算。前一种情况可能发生在它们被定义为全局常量时,或者当代码生成这些值并将它们在执行期间的某个时间写入内存时,然后再与输入序列进行比较。此外,即使单个十六进制数字(我假设“数字”是指单个数字,而不是无限数量的数字)只需要 4 位来表示,但实际上有许多不同的方式来表示 10 个十六进制数字。因此,一个 4 字节的寄存器可用于保存一位或多位数字。如您所见,有很多可能性。因此,直接查找数字并不是找出它们的最快方法,而且您可能会被炸毁。

但是,代码必须包含一系列指令,这些指令基本上以某种方式将输入序列与实际数字进行比较。基本上需要执行十次(或更少)比较。很可能在第一个不等式上,将跳转到“炸毁炸弹”的代码。因此,我认为您应该首先检查所有jne指令(在 x86 中相同)。检查周围的代码,看看是否有循环结构或某种重复比较。在循环中mrmovl四处寻找也是一个好主意jne,表明正在从内存中获取数字。如果这使您无处可去,那么您可以检查je周围的代码jmp,它们也可以一起用于构造循环。请注意,如果您发现可疑循环,但没有mrmovl,那么这些数字可能会在循环中进行算术计算。

这样一来,即使给你几十万条汇编代码,还是会比较少jneje指令少。检查它们中的每一个应该只需要几分钟。

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