如何修复导致应用程序崩溃的代码指令

时间:2019-05-23 17:10:50

标签: c++ assembly x86 ida

主应用程序文件崩溃是因为在访问播放器昵称时,服务器受到格式字符串错误的影响,原因是访问 无效的存储区。 执行的指令是“ cmp [EAX],00000000”,其中EAX包含4 昵称中的字节数不足并导致服务器崩溃。

我进行了调试,发现在将日志字符串传递给File_printf函数之前,缺少“%s”。因此,我尝试通过IDA调试器添加此字符串并成功。输入这些字节后,现在服务器崩溃,并显示消息“服务器不易受攻击”,然后崩溃,并显示消息“服务器易受攻击” CODE 我输入的用于修补应用程序的字节:

RVA
    00400000

OFFSET
    0041dfad    cc  68          ; push 0061d0dc
           +    cc  |0061d0dc

           +    cc  e8          ; call 0040d270
           +    cc  ^0040d270

           +    cc  83          ; add esp,04
           +    cc  c4
           +    cc  04

           +    cc  e9          ; jmp 0041e059
           +    cc  ^0041e059

    0041e054    e8  e9          ; jmp 0041dfad
           +    ??  ^0041dfad

0055DD63 cmp     dword ptr [eax], 0

 /*source*/
if ( *(_DWORD *)a1 )
    a1 = sub_445D50();
  if ( v2 )
  {
    --*(_DWORD *)(v2 + 4);
    *(_DWORD *)a1 = *(_DWORD *)(v2 + 20);
    *(_DWORD *)(v2 + 20) = a1;
  }
  else
  {
    v3 = *(_DWORD *)((a1 - 4) & 0xFFFFFFFC);
    --dword_798ABD0;
    sub_445D50();
    memset(*(void **)(v3 + 8), 0xCDu, *(_DWORD *)(v3 + 16));
    free((void *)v3);
  }
}

/ 十六进制值 / 0055DD63 83 38 00

在测试服务器崩溃之后,服务器崩溃,并在测试工具“服务器不是易受攻击的”中显示消息,但是该服务器崩溃了。

然后在Debugger IDA中,我得到带有详细消息的结果:

55dd63: The Instruction at 0x55DD63 referenced memory at 0x61616161, The memory could not be read -> 61616161 (exc.code c0000005, tid 4692)

Image 1

Image 2

Image 3

Image 4

Image 5

我也可以共享测试工具,但不能在此处共享,因为该测试工具具有.simplese木马,它可能会损害您的PC,但是我可以应要求共享测试工具的源代码。

1 个答案:

答案 0 :(得分:2)

该错误是由日志记录功能NetManager_LogMessage引起的 将文本转储,添加时间戳(使用snprintf),然后 将整个字符串传递给函数File_printf而不需要 格式化参数(%s),则需要使用值05而不是04来创建足够的空间来掩盖该错误。这个技巧适用于许多游戏,祝你好运