标签:heapalloc center tca editable tin 修改 textarea add wrap
先运行一下程序,发现flag是一串乱码,还好知道这个re题,不然又是一顿乱操作(爬。
很快找到主函数,F5反编译。
xxxxxxxxxx
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);//win32函数创建堆
lpMem = (CHAR *)HeapAlloc(hHeap, 8u, MaxCount + 1);//win32为堆申请空间
memcpy_s(lpMem, MaxCount, &unk_409B10, MaxCount);//猜测将unk_409b10赋值给堆lpMem
if ( sub_40102A() || IsDebuggerPresent() )//第二个函数是判断是否被调试如果被调试就返回非零。
{
__debugbreak();//暂停程序执行,打开调试器,进入调试模式。(不知道做什么用的)
sub_401000(v3 + 4, lpMem);
ExitProcess(0xFFFFFFFF);
}
MessageBoxA(0, lpMem + 1, "Flag", 2u);//win32释放一个标题为“Flag”,内容为lpMem+1的文本框
HeapFree(hHeap, 0, lpMem);//释放空间
HeapDestroy(hHeap);//销毁对象
ExitProcess(0);
}
不妨看一下其他的函数。
xxxxxxxxxx
int sub_40102A()
{
char v0; // t1
?
v0 = *(_BYTE *)(*(_DWORD *)(__readfsdword(0x18u) + 48) + 2);
return 0;
}//一定返回0
那么正常打开的情况下条件语句中的代码没有被执行。那么我们不妨直接看一下lpMem(即unk_409b10)的内容:
显然是符合乱码的。
接下来看一下分支语句中的函数:
xxxxxxxxxx
unsigned int __fastcall sub_401000(int a1, char *a2)
{
int v2; // esi
char *v3; // eax
unsigned int v4; // ecx
unsigned int result; // eax
?
v2 = dword_409B38;
v3 = &a2[strlen(a2 + 1) + 2];
v4 = 0;
result = ((unsigned int)(v3 - (a2 + 2)) >> 2) + 1;
if ( result )
{
do
*(_DWORD *)&a2[4 * v4++] ^= v2;//划重点!!!
while ( v4 < result );
}
return result;
}
这里对lpMem的内容进行了修改,应该就是解密函数。所以我们需要做的就是让这一步运行。
这里我们启用OD(ollydebug)。
先用中文搜索引擎+智能搜索选择"Flag“来快速定位到我们的函数(直接到达的位置应为00C810A7,向上翻即可)
接下来我们应该做什么?修改程序运行流程,做如下图所示的三处修改:
1.抹除判断语句的跳转
2.抹除int3的异常
3.跳入第二个MassageBox()
Finally,you get it!
另外附上使用IDA调试的方法。
标签:heapalloc center tca editable tin 修改 textarea add wrap
原文地址:https://www.cnblogs.com/BlankSpace/p/14357898.html