某新春杯
这个杯感觉是新手杯,re题比较简单,没啥意思,感觉白来了
一、RE Check In

1、 查壳

2、IDA静态分析

base64解密,拿到flag

3、拿到flag
flag{3f694fe5-8b6a-4512-ad6f-c9556341c011}
二、Easy RE

1、查壳

无壳
2、IDA静态分析

一个简单的异或加密
3、写出解密脚本
Dst = [ 0x74, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, ] str = '' for i in range(42): str +=chr(((Dst[i*4] + i)^0x12) % 256) print(str)
4、拿到flag
flag{bb071403-5bfe-442e-9ddf-03552b97a7bb}
三、Dynamic Reverse
名字叫动态逆向,实际上只靠IDA静态分析也能得到结果

1、查壳

无壳
2、IDA静态分析

查找字符串,交叉引用

简单的看一下代码逻辑,MD5Update与MD5Final函数一起完成md5加密
在整个程序逻辑中,我们需要输入8次正确的字符串(key),才能到达这里


v35与v8两个字符串的md5值作比较,相等的话即可输入下一个字符串

注意这里v3 = ch,点开ch

这里全是一些字符串

又注意到这里v3+=10 ,不难明白,程序每次循环后字符串数组指针向后移动10个字节
3、写出解密脚本
// Finaa.cpp : Defines the entry point for the console application. // #include <stdio.h> #include <windows.h> #include <iostream> using namespace std; int main(int argc, char* argv[]) { int v4 = 0; int v5; char v35; char v36; char v37; char v38; char v39; char v40; char v41; char v42; char v43; char * v6; BYTE test[0x100] ; memset(test,0,0x100); strcpy((char*)test,"12/4-."); strcpy((char*)(test+0xa),"745.30"); strcpy((char*)(test+0x14),"cdaf_`"); strcpy((char*)(test+0x1e),"42764/"); strcpy((char*)(test+0x28),"uyirp{"); strcpy((char*)(test+0x32),"fvigdm"); strcpy((char*)(test+0x3c),"€~exhl"); strcpy((char*)(test+0x46),"xzv{zbf"); char* v3 = (char*)test; while(1){ v5 = strlen(v3); if ( v5 ) { v35 = *v3 - v4; if ( v5 != 1 ) { v36 = (v3[1] + 1 - v4) ^ 1; if ( v5 != 2 ) { v37 = (v3[2] + 2 - v4) ^ 2; if ( v5 != 3 ) { v38 = (v3[3] + 3 - v4) ^ 3; if ( v5 != 4 ) { v39 = (v3[4] + 4 - v4) ^ 4; if ( v5 != 5 ) { v40 = (v3[5] + 5 - v4) ^ 5; if ( v5 != 6 ) { v41 = (v3[6] + 6 - v4) ^ 6; if ( v5 != 7 ) { v42 = (v3[7] + 7 - v4) ^ 7; if ( v5 == 9 ) v43 = (v3[8] + 8 - v4) ^ 8; } } } } } } } v6 = &v35 + v5; } else { v6 = &v35; } *v6 = 0; cout<<v35<<v36<<v37<<v38<<v39<<v40<<v41<<endl; v3 = (char*)(v3+10); v4++; if(v4 == 8) break; } return 0; }

获得8个字符串
123456
654321
abcdef
114514
qwerty
asdfgh
zxcvbn
qustsec

放在程序中也能正常运行
4、拿到flag

flag{61970f40f232b7d9dd1f0da5be56a124}
//记得转小写就行
四、总结
第三题还算有些难度,比赛还算是比较适合新手

浙公网安备 33010602011771号