0

任何人都可以对以下汇编代码提供一些见解:

更多信息:

引导加载程序实际上是一个小的 16 位引导加载程序,它使用 Xor 解密,一个更大的引导加载程序,一个位于扇区 3 到 34 的 linux 引导加载程序。(该磁盘中的 1 个扇区是 512 字节)

整个事情是一个运行在嵌入式 Linux 上的 exec 的保护系统。

删除保护的版本已经破译了 linux 引导加载程序(我们可以使用 IDA 将其反转),因此我们假设 xor 密钥必须在没有保护的版本中仅使用零。

如果我们在删除保护的版本中查看偏移量 0x800 到 0x8FF,它不会填充零,因此这不能成为关键,否则无法加载此版本,它将异或纯数据并且只加载垃圾。

扇区 3->34 在原始版本中是加密的,在我们的版本中是明确的(保护已删除),但 MBR 代码(小型预引导加载程序)在两个版本中是相同的。

那么会不会是 MBR 的汇编代码中有一个小细节稍微改变了 xor 键的位置呢?

这只是我为了更好地理解汇编代码加载器而做的一个练习,我发现这是一个相当大的挑战。到目前为止,我感谢您的意见!

4

1 回答 1

0

好吧,阅读汇编代码是很多工作。我会坚持回答“钥匙”来自哪里。

  • BIOS 在 0000:7C00 加载 MBR,并将 DL 设置为从中加载它的驱动器。
  • 首先,您的 MBR 设置一个从 0000:7C00 向下增长的堆栈。
  • 然后,它将自身复制到 0000:0600-0000:07ff 并进行远跳转,我假设是到下一条指令,但是在复制的版本上,0000:061D。(编辑:这个副本对于 MBR 来说是一件非常标准的事情,通常到这个地址,它使上面的地址空间空闲)(编辑:它完全复制自己,我误读了)。
  • 然后,它尝试 5 次将扇区 2 读入 0000:0700-0000:08ff,如果失败(loc_78)则停止并显示错误消息。
  • 然后,它尝试 5 次从扇区 3 开始读取 32 个扇区到 2000:0-2000:3FFF(绝对地址 20000-23FFF,即 16kB 从 128kB 开始)。
  • 如果一切顺利,我们就在 loc_60 并且我们知道我们在内存中有什么。
  • loc_68 上的循环将使用保存这 32 个扇区的缓冲区作为目标。
  • 它将使用从 0000:0800 开始的缓冲区作为源(这是我们读入 0:0700-0:08ff 的缓冲区的第二个 256 字节,磁盘扇区 2 的第二个 256 字节)。
  • 在每次迭代中,LODSW 将 2 添加到 SI。
  • 当 SI 达到 840 时,通过 AND 将其设置回 800。因此,“key”缓冲区从 800 到 83F,即从磁盘扇区 2 的字节 256 开始的 64 个字节。
  • 我的印象是 XORing 短了一个字节……CX 应该设置为 4000h,而不是 3FFF。我认为这是代码中的错误。
  • 在物理地址 20000 处的 16kB 缓冲区与那个“关键”缓冲区循环异或之后,我们跳入它并跳到 2000:0。

对?合身吗?那里的钥匙?

于 2013-06-07T21:39:34.223 回答