如何修复导致应用程序崩溃的代码指令
How to Fix the Instruction in Code which cause application crash
主应用程序文件崩溃,因为服务器在处理玩家昵称时受到格式字符串错误的影响,因为访问
无效的内存区域。
执行的指令是 "cmp [EAX], 00000000" 其中 EAX 包含 4
昵称中的字节数并导致服务器崩溃。
我调试发现在日志字符串传递给File_printf函数之前缺少“%s”。所以我尝试通过 IDA 调试器添加这个字符串并成功。输入这些字节后,服务器在崩溃之前显示消息 "server is not vulnerable" 并显示消息 "server is vulnerable"
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
测试服务器崩溃后,服务器崩溃并在测试工具中显示消息 "Server is not Vulnerable" 但已崩溃。
在调试器 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木马,它可能会损害你的电脑,但我可以根据要求分享测试工具的源代码。
该错误是由日志记录功能引起的 NetManager_LogMessage
获取要转储的文本,添加时间戳(使用 snprintf),然后
将整个字符串传递给函数 File_printf 而无需
格式参数 (%s),您需要使用值 05 而不是 04 来制作一个 ampty space 来愚弄该错误。这个技巧适用于许多游戏,祝你好运
主应用程序文件崩溃,因为服务器在处理玩家昵称时受到格式字符串错误的影响,因为访问 无效的内存区域。 执行的指令是 "cmp [EAX], 00000000" 其中 EAX 包含 4 昵称中的字节数并导致服务器崩溃。
我调试发现在日志字符串传递给File_printf函数之前缺少“%s”。所以我尝试通过 IDA 调试器添加这个字符串并成功。输入这些字节后,服务器在崩溃之前显示消息 "server is not vulnerable" 并显示消息 "server is vulnerable" 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
测试服务器崩溃后,服务器崩溃并在测试工具中显示消息 "Server is not Vulnerable" 但已崩溃。
在调试器 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木马,它可能会损害你的电脑,但我可以根据要求分享测试工具的源代码。
该错误是由日志记录功能引起的 NetManager_LogMessage 获取要转储的文本,添加时间戳(使用 snprintf),然后 将整个字符串传递给函数 File_printf 而无需 格式参数 (%s),您需要使用值 05 而不是 04 来制作一个 ampty space 来愚弄该错误。这个技巧适用于许多游戏,祝你好运