2022-06-30对齐极速赛车平台官网

对齐极速赛车平台官网,以便我们的密码从行首显示。为此,将 8 添加到当前地址 0xCF2100 - 要偏移的字符数。这将是他的实际地址。让我们检查一下我们的假设:

 

有联系方式!让我们再想一想:为了检查用户输入的密码的正确性,保护显然必须将其与原始密码进行比较。如果是这样,通过在地址 0xCF2108 读取内存时设置断点,我们将通过尾部捕获比较机制。

说到做到。让我们放一个硬件中断,因为软件会给我们一个内存访问错误,这是由于尝试写入只读部分(.rdata)而发生的。软件中断需要修改内存。

 

  • 第一个参数是访问类型(r是读取);
  • 第二个参数是要进行操作的字节数;
  • 最后一个参数是地址。

在 g 命令上,继续调试并输入任何想到的密码,例如 KPNC ++。调试器会立即弹出:

由于 Intel 处理器的架构特性,break 是在执行“creep”的指令之后触发的,即 EIP 指向下一个要执行的命令。在我们的例子中,jne passCompare1!main+0x62,因此指令 cmp dl, byte ptr [ecx] 寻址内存。dl里有什么?让我们再查找一行 - dl, byte ptr [eax]。

可以假设 ECX 包含一个指向原始密码字符串的指针(因为它导致调试器弹出),对此的确认是清单的第一行,其中偏移量 0xCF2108 放置在该寄存器中,我们记得, 是参考密码。在 EAX 中,在这种情况下,会有一个指针指向用户输入的密码。让我们检查一下我们的假设。

事实上,这个猜测被证明是正确的。现在的问题是:如何破解它?在这里,假设可以将 JNE 更改为 JE。甚至更原始 - 用 ECX 替换 EAX。然后将原始密码与自己进行比较!

让我们继续跟踪并使用 t 命令遍历条件分支(或函数内部)。我们立即看到将 Wrong Password 推入栈顶的指令:

熟悉的地方!还记得我们如何使用反汇编程序访问它们吗?在此指令之后,调用 printf 函数。如果我们查找三行,我们会找到 test eax, eax 指令,它执行匹配检查。动作的算法是相同的——我们记住 TEST 命令的地址,以便随后用 XOR 替换它,或者我们写下一个字节序列。

等待!不要这么着急!是否可以确定这些字节将位于这些相同地址的可执行文件中?在 Windows XP 及其之前的版本中,在绝大多数情况下,这至少是希望的,但检查并不是多余的,因为尽管系统加载程序将模块放置在预定地址,但有一些棘手的保护机制会加载相同的模块同时位于两个不同的地址。在“十”这样的伎俩不起作用,Windows 看到这是同一个模块,并且只将它放在内存中一次。

然而,在“十”中,我们甚至不能希望在调试器的帮助下在内存中找到的位于某些地址的字节将位于磁盘上文件的相同地址。对于在Vista及后续系统中,ASLR(地址空间布局随机化)机制开始发挥作用,它随机改变进程地址空间中重要数据结构的位置。在某些情况下,ASLR 在处理缓冲区溢出、库返回和其他类型的攻击方面非常成功。陷入困境的麻烦开始了!