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