打开之后弹乱码
第一步还是查壳,没有。
第二步拖入IDA,直接看伪代码吧
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
int v3; // ecx
CHAR *lpMem; // [esp+8h] [ebp-Ch]
HANDLE hHeap; // [esp+10h] [ebp-4h]
hHeap = HeapCreate(0x40000u, 0, 0);
lpMem = (CHAR *)HeapAlloc(hHeap, 8u, MaxCount + 1);
memcpy_s(lpMem, MaxCount, &unk_409B10, MaxCount);
if ( sub_40102A() || IsDebuggerPresent() )
{
__debugbreak();
sub_401000(v3 + 4, lpMem);
ExitProcess(0xFFFFFFFF);
}
MessageBoxA(0, lpMem + 1, "Flag", 2u);
HeapFree(hHeap, 0, lpMem);
HeapDestroy(hHeap);
ExitProcess(0);
}
最开始看到了IsDebuggerPresent
,我以为要跳过这个检测,所以没有管它。注意到memcpy_s(lpMem, MaxCount, &unk_409B10, MaxCount);
,然后看看&unk_409B10
,结果发现这个就是乱码。
然后点开sub_40102A
,发现这个函数永远return 0
,if
判断永远不成立,推测if
里面的这个函数sub_401000
,很有可能出flag
,我们看看这个函数。
unsigned int __fastcall sub_401000(int a1, int a2)
{
int v2; // esi
unsigned int v3; // eax
unsigned int v4; // ecx
unsigned int result; // eax
v2 = dword_409B38;
v3 = a2 + 1 + strlen((const char *)(a2 + 1)) + 1;
v4 = 0;
result = ((v3 - (a2 + 2)) >> 2) + 1;
if ( result )
{
do
*(_DWORD *)(a2 + 4 * v4++) ^= v2;
while ( v4 < result );
}
return result;
}
但是我搞不清楚a1
的值,也就是外面v3
的值为多少,所以用OD直接跑一跑。
我们首先在IDA中rebase program
,方便查看。在OD里面查看e模块,得到基址,然后在IDA中修改。
我们先在OD里面找这个if在哪
可以看到在
1221096
附近,我们ctrl+g
在OD中跳转。
在上方
JNZ
处下一个断点,让程序跑到这。je
会跳转,但是我们想要运行下面的函数,所以不让它跳。int3
也要nop
掉,不然程序会中断。
然后我们进入关键的函数
在retn
上面下一个断点。直接运行,查看EDX中的值
可知flag。