總結:
1.第一道題是把flag藏在壓縮包中的做法,即在壓縮包的數據流中直接粘貼進去一段base64加密後的字段,這樣的方法會在解壓時提示壓縮包損壞(因爲其中有一段是沒壓縮過的直接加進去的),做這種題還是要熟悉文件頭;
2.第二道是一道逆向的題,需要注意的有:
①做逆向的題可以先shift+F12查找字符串,在通過X顯示字符串都出現在哪裏,最後F5反編譯開始做;
②在題中可以右鍵添加註釋;
③IDA中綠色是常量;
④strcpy是複製字符串,strlen是取字符串的長度;
⑤for循環中若沒有條件即本循環只能通過break終止循環;
⑥*(_BYTE *)(a1 + 9 * a2 + a3)是二維數組的取值方法,byte是取一個字節的數據;
⑦下次做這種題可以寫個程序把地圖畫出來;
⑧int是4個字節,char是1個。
下面是題:
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax@3
size_t v4; // ebx@5
size_t v5; // eax@6
char v6; // [sp+4h] [bp-50h]@1
char v7[50]; // [sp+13h] [bp-41h]@1
char v8[4]; // [sp+45h] [bp-Fh]@1
char v9; // [sp+4Bh] [bp-9h]@1
size_t i; // [sp+4Ch] [bp-8h]@1
sub_40D870();
sub_47C370((int)&dword_487F00, v7);
strcpy(v8, "xman{"); // xman是答案的開頭
v9 = 125; // 125的ASCII碼爲}
for ( i = 0; ; ++i )
{
v4 = i;
if ( v4 >= strlen(v8) )
break;
if ( v7[i] != v8[i] ) // v4是我的輸入值
{
sub_401500((int)"違うよ\n", v6);
return 0;
}
}
v5 = strlen(v7); // v2是v4的長度
if ( v7[v5 - 1] == v9 )
{
v7[strlen(v7) - 1] = 0;
sub_4015F3(&v7[5]);
result = 0;
}
else
{
sub_401500((int)"違うよ\n", v6);
result = 0;
}
return result;
}
// a1可能是我輸入的值中的數字
int __cdecl sub_4015F3(char *a1)
{
signed int v1; // eax@2
size_t v2; // ebx@17
int result; // eax@19
char v4; // [sp+4h] [bp-64h]@0
int v5; // [sp+1Ah] [bp-4Eh]@1
int v6; // [sp+1Eh] [bp-4Ah]@1
char v7; // [sp+22h] [bp-46h]@1
int v8; // [sp+23h] [bp-45h]@1
int v9; // [sp+27h] [bp-41h]@1
char v10; // [sp+2Bh] [bp-3Dh]@1
int v11; // [sp+2Ch] [bp-3Ch]@1
int v12; // [sp+30h] [bp-38h]@1
char v13; // [sp+34h] [bp-34h]@1
int v14; // [sp+35h] [bp-33h]@1
int v15; // [sp+39h] [bp-2Fh]@1
char v16; // [sp+3Dh] [bp-2Bh]@1
int v17; // [sp+3Eh] [bp-2Ah]@1
int v18; // [sp+42h] [bp-26h]@1
char v19; // [sp+46h] [bp-22h]@1
int v20; // [sp+47h] [bp-21h]@1
int v21; // [sp+4Bh] [bp-1Dh]@1
char v22; // [sp+4Fh] [bp-19h]@1
int v23; // [sp+50h] [bp-18h]@1
int v24; // [sp+54h] [bp-14h]@1
size_t i; // [sp+58h] [bp-10h]@1
char v26; // [sp+5Fh] [bp-9h]@1
v5 = 0x5202020;
v6 = 0x20202020;
v7 = 0; // char
v8 = 0x5200520;
v9 = 0x20050520;
v10 = 0; // char
v11 = 0x20050520;
v12 = 0x20200520; // char
v13 = 0;
v14 = 0x20200520;
v15 = 0x20052020;
v16 = 0; // char
v17 = 0x5200520;
v18 = 0x5050520;
v19 = 0; // char
v20 = 0x5202020;
v21 = 0x20202020;
v22 = 0; // char
v24 = 0;
v23 = 0;
v26 = 1;
for ( i = 0; ; ++i )
{
v2 = i;
if ( v2 >= strlen(a1) ) // strlen是取字符串的長度
break;
v1 = a1[i]; // 把a的第一個值給v1
if ( v1 == '2' )
{
v26 = sub_40157C((int)&v24, &v23); // 23=7? ++ v23<=6
goto LABEL_14;
}
if ( v1 > 50 )
{
if ( v1 == '3' )
{
v26 = sub_4015A4(&v24); // v24=0? -- v24>=1
goto LABEL_14;
}
if ( v1 == '4' )
{
v26 = sub_4015CB(&v24); // v24=7? 24++
goto LABEL_14;
}
}
else if ( v1 == '1' )
{
v26 = sub_401555((int)&v24, &v23); // 23=0? 23--
goto LABEL_14;
}
v26 = 0;
LABEL_14:
if ( (unsigned __int8)sub_401529((int)&v5, v24, v23) ^ 1 )// v24=3,v23=1或4
{
v26 = 0;
break;
}
}
if ( v26 == 1 ) // 如果v26不等於1,就會出現痛···
{
if ( v24 != 5 || v23 != 7 )
{
result = sub_401500((int)&unk_489033, v4);
}
else if ( strlen(a1) <= '\x10' )
{
result = sub_401500((int)"本當に 本當に よかった\n", v4);
}
else
{
result = sub_401500((int)&"ああ..疲れた....\n", v4);
}
}
else
{
result = sub_401500((int)"痛いQAQ\n", v4);
}
return result;
}