【為美好CTF獻上祝福】 ISCTF2024 逆向筆記
很顯然,我并沒有參加ISCTF2024,去網上找套ISCTF2024的題,解壓出來發下只缺了Re的題。東拼西湊找到的這些題,所以題目順序包不是對的。
MIPS
題目提示:MIPS指令集編譯為可執行文件即可正常分析,魔改RC4
知識盲區了。
根據新生賽的教訓,先bdfs一下題目名字。
MIPS 是一種CPU性能指標?
MIPS架構。。。?
先放過這個題等等再回來做。
桀桀桀
抽象題目。
扔進ida后看到一堆函數,直接 shift+F12 查字符串。 果然一堆互動。

有理由懷疑這題是比賽的前幾道題,根據字符串追蹤到主函數。
稍微改改變量名,得到如下代碼:
點擊查看代碼
__int64 sub_411E40()
{
int v0; // edx
__int64 v2; // [esp-8h] [ebp-17Ch]
char v3; // [esp+0h] [ebp-174h]
char v4; // [esp+0h] [ebp-174h]
int i; // [esp+D0h] [ebp-A4h]
int j; // [esp+D0h] [ebp-A4h]
size_t k; // [esp+D0h] [ebp-A4h]
unsigned int Seed; // [esp+F4h] [ebp-80h]
int v9; // [esp+100h] [ebp-74h]
char a[4]; // [esp+10Ch] [ebp-68h] BYREF
__int16 v11; // [esp+110h] [ebp-64h]
char Str[4]; // [esp+11Ch] [ebp-58h] BYREF
int v13; // [esp+120h] [ebp-54h]
int v14; // [esp+124h] [ebp-50h]
int v15; // [esp+128h] [ebp-4Ch]
int v16; // [esp+12Ch] [ebp-48h]
int v17; // [esp+130h] [ebp-44h]
int v18; // [esp+134h] [ebp-40h]
int v19; // [esp+138h] [ebp-3Ch]
char v20; // [esp+13Ch] [ebp-38h]
_DWORD v21[10]; // [esp+148h] [ebp-2Ch]
int savedregs; // [esp+174h] [ebp+0h] BYREF
sub_411357(&unk_41D0A5);
v21[0] = 2063192753;
v21[1] = 592530563;
v21[2] = -1096176201;
v21[3] = 371522280;
v21[4] = -683475309;
v21[5] = -145612880;
v21[6] = -394232486;
v21[7] = 1866595368;
v21[8] = 0;
*(_DWORD *)Str = 0;
v13 = 0;
v14 = 0;
v15 = 0;
v16 = 0;
v17 = 0;
v18 = 0;
v19 = 0;
v20 = 0;
*(_DWORD *)a = 0;
v11 = 0;
Seed = 0;
puts("Hello Ctfer~~~~");
putchar();
puts("Welcome to ISCTF 2024!!!");
putchar();
puts("This is a easy challenge");
putchar();
puts("Just do it");
putchar();
puts("Now!Please send me what you think is the solution to the equation below.");
putchar();
scanf("%5s", (char)a);
if ( (a[1] * a[0]) << 10 == 6204416
&& (a[1] + 1) * (a[1] - 1) == 6888
&& a[2] + a[3] == 151
&& (a[2] << 11) - a[3] == 137132
&& a[3] + a[2] + a[1] + a[0] + (char)v11 == 377 )
{
puts("Yeah Yeah Yeah");
putchar();
puts("You are a qualified college student");
putchar();
puts("Something has changed........");
putchar();
for ( i = 0; i < 5; ++i )
Seed += a[i] ^ 0xA1;
sub_4110E1("Now,Give me what you think is right:", v3);
scanf("%32s", (char)Str);
j_strlen(Str);
for ( j = 0; j < 4; ++j )
sub_4111B3(&Str[8 * j], &dword_41B000);
srand(Seed);
putchar();
rand();
v9 = putchar();
sub_41128A(Str, v9);
for ( k = 0; k < j_strlen(Str) >> 2; ++k )
{
if ( !sub_41100A(*(_DWORD *)&Str[4 * k], v21[k]) )
{
sub_4110E1("Emmmmmm,It is not right........see you again~~~", v4);
goto LABEL_19;
}
}
puts("Good!!!");
putchar();
puts("Man! You've completed the challenge");
putchar();
puts("Welcome again to ISCTF2024");
putchar();
}
else
{
puts("Nononononono~~~");
putchar();
puts("You look like something is wrong");
putchar();
}
LABEL_19:
sub_411203(&savedregs, &dword_4122DC, 0, v0);
return v2;
}
a 是個長度為 5 的字符串。(合理猜測是 ISCTF )
發現他讓我們先解方程求出 a 。

(a[1]+1)*(a[1]-1) == 6888 ----> a[1] == 83 ---> a[1] 為 S
(a[1] *a[0]) <<10 == 6204416 -----> a[0]==73 ---> a[0] 為 I
還有 a[2],a[3] 的初中二元一次方程組,阿巴阿巴阿巴。
a[2] = 67 -----> C
a[3] = 84 ----T
V11=70 ----- > F
所以 a 為 ISCTF
接著計算 seed

支持C++腳本喵
點擊查看代碼
#include<bits/stdc++.h>
using namespace std;
int a[5]={73,83,67,84,70};
signed main(){
int seed=0;
for (int i=0;i<5;++i) {
seed+=a[i] ^ 0xA1 ;
}
cout<<seed;
return 0;
}
seed == 1176
再往后看,重頭戲來了,核心的加密部分。

先讓我們輸入一個長度為 32 的字符串 str
然后
for ( j = 0; j < 4; ++j )
sub_4111B3(&Str[8 * j], &dword_41B000);`
合理猜測這個函數是初始化。因為點進去看到的是這個。

再往后看。

這個函數,點進去后發現這函數是判斷相等的。


浙公網安備 33010602011771號