re每天一題(20200527)
之前想要每天刷題被各種各樣的事情中斷了,重新撿起來這個吧。每天一題,會覆盤各比賽的題目,不過由於按照比賽來弄的話,一場比賽就會拖很長時間。就用每天一道題來約束吧,不一定是每天做一道,而是能夠保證平均每天可以發一道wp。
覆盤在我的github博客上,https://prowes5.github.io/
今天先從2020GKCTF開始
Check_1n
老樣子先載入IDA看下僞代碼。函數較多,靜態直接從頭分析看來不太可能,想辦法找到關鍵點吧。先運行一下康康。
可以看到出題人這裏寫了一個計算機(好閒)。。。需要找到開機密碼。看下字符串有沒有什麼東西吧
看看什麼地方使用了這個字符串。發現是在sub_4054F0
調用了。大概看一下這個函數。
char *__cdecl sub_4054F0(char *a1)
{
unsigned int v2; // ST50_4
char v3; // [esp+50h] [ebp-1Ch]
char *j; // [esp+54h] [ebp-18h]
size_t i; // [esp+58h] [ebp-14h]
unsigned int k; // [esp+58h] [ebp-14h]
char *v7; // [esp+5Ch] [ebp-10h]
char *v8; // [esp+60h] [ebp-Ch]
size_t v9; // [esp+64h] [ebp-8h]
size_t v10; // [esp+68h] [ebp-4h]
v10 = strlen(a1);
v9 = 3 * ((v10 >> 2) + 1);
v8 = malloc(3 * ((v10 >> 2) + 1));
v7 = &v8[v9];
for ( i = 0; i < v10; ++i )
{
v3 = byte_175E270[a1[i]];
if ( v3 < 0 )
{
sub_406B70(v8);
return 0;
}
for ( j = &v8[v9 - 1]; j >= v7; --j )
{
v2 = 58 * *j + v3;
*j = v2 % 0x100;
v3 = BYTE1(v2);
}
if ( v3 > 0 )
{
if ( --v7 < v8 )
{
sub_406B70(v8);
return 0;
}
*v7 = v3;
}
}
for ( k = 0; k < &v8[v9] - v7; ++k )
v8[k] = v7[k];
v8[k] = 0;
return v8;
}
通過密文的大致格式和算法,大體猜測一下爲base58。寫個腳本測試一下。
拿到flag