[BJDCTF2020]easy
Start
开局看到这个:
int __cdecl main(int argc, const char **argv, const char **envp)
{
__time32_t Time; // [esp+10h] [ebp-3F0h] BYREF
struct tm *v5; // [esp+3FCh] [ebp-4h]
__main();
time(&Time);
v5 = localtime(&Time);
puts("Can you find me?\n");
system("pause");
return 0;
}
运行,啥都没有:
IDA中找了一圈,发现:
int ques()
{
int v0; // edx
int result; // eax
int v2[50]; // [esp+20h] [ebp-128h] BYREF
int v3; // [esp+E8h] [ebp-60h]
int v4[10]; // [esp+ECh] [ebp-5Ch]
int j; // [esp+114h] [ebp-34h]
__int64 v6; // [esp+118h] [ebp-30h]
int v7; // [esp+124h] [ebp-24h]
int v8; // [esp+128h] [ebp-20h]
int i; // [esp+12Ch] [ebp-1Ch]
v3 = 2147122737;
v4[0] = 140540;
v4[1] = -2008399303;
v4[2] = 141956;
v4[3] = 139457077;
v4[4] = 262023;
v4[5] = -2008923597;
v4[6] = 143749;
v4[7] = 2118271985;
v4[8] = 143868;
for ( i = 0; i <= 4; ++i )
{
memset(v2, 0, sizeof(v2));
v8 = 0;
v7 = 0;
v0 = v4[2 * i];
LODWORD(v6) = *(&v3 + 2 * i);
HIDWORD(v6) = v0;
while ( v6 > 0 )
{
v2[v8++] = v6 % 2;
v6 /= 2LL;
}
for ( j = 50; j >= 0; --j )
{
if ( v2[j] )
{
if ( v2[j] == 1 )
{
putchar('*');
++v7;
}
}
else
{
putchar(32);
++v7;
}
if ( !(v7 % 5) )
putchar(32);
}
result = putchar(10);
}
return result;
}
并且:
基本可以猜测这个就是能够解出flag的函数了,大概分析了一下,发现这个函数中不断的打印*
以及并且总共应该是打印了五行的内容,猜测应该是打印出字母或者可能是一条迷宫直接放到VS中,打印看看。
直接复制会出现LODWORD和HIDWORD未定义的问题,原因是这两个类型是IDA中自定义的类型,位于IDA/plugins/defs.h中,所以把这个头文件导入即可
打印,可以看到前面三个字母为HAC
,后面不知道为啥打印出问题了,不过也可以肯定这里就是通过这个函数打印出flag
将程序放入x32dbg中,这里由于程序正常的执行流程并未调用到那个函数,所以需要将EIP指到函数的起始位置,那么需要先找到函数的首地址,这里还是比较简单,没有开ASLR,所以直接通过IDA找然后到x32dbg找对应的即可:
修改EIP为00401520:
直接运行得到结果:
HACKIT4FUN