Mysterious解题
题目难度:2
题目描述:
自从报名了CTF竞赛后,小明就辗转于各大论坛,但是对于逆向题目仍是一知半解。有一天,一个论坛老鸟给小明发了一个神秘的盒子,里面有开启逆向思维的秘密。小明如获至宝,三天三夜,终于解答出来了,聪明的你能搞定这个神秘盒子么?(答案为flag{XXX}形式)

1.是个带GUI的程序,提示让我们输入正确的密码,才会有flag吧先用IDA看下。
2.打开后按F5进入伪代码,然后双击进入WinMian函数内。

3.我看过了在这个函数里,相关函数自行百度哦本文章不细讲。

4.再进一层,就看到主代码了。

int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4)
{
char v5; // [esp+50h] [ebp-310h]
CHAR Text[4]; // [esp+154h] [ebp-20Ch]
char v7; // [esp+159h] [ebp-207h]
__int16 v8; // [esp+255h] [ebp-10Bh]
char v9; // [esp+257h] [ebp-109h]
int v10; // [esp+258h] [ebp-108h]
CHAR String; // [esp+25Ch] [ebp-104h]
char v12; // [esp+25Fh] [ebp-101h]
char v13; // [esp+260h] [ebp-100h]
char v14; // [esp+261h] [ebp-FFh]
memset(&String, 0, 0x104u);
v10 = 0;
if ( a2 == 16 )
{
DestroyWindow(hWnd);
PostQuitMessage(0);
}
else if ( a2 == 273 )
{
if ( a3 == 1000 )
{
GetDlgItemTextA(hWnd, 1002, &String, 260);
strlen(&String);
if ( strlen(&String) > 6 )
ExitProcess(0);
v10 = atoi(&String) + 1;
if ( v10 == 123 && v12 == 120 && v14 == 122 && v13 == 121 )
{
strcpy(Text, "flag");
memset(&v7, 0, 0xFCu);
v8 = 0;
v9 = 0;
_itoa(v10, &v5, 10);
strcat(Text, "{");
strcat(Text, &v5);
strcat(Text, "_");
strcat(Text, "Buff3r_0v3rf|0w");
strcat(Text, "}");
MessageBoxA(0, Text, "well done", 0);
}
SetTimer(hWnd, 1u, 0x3E8u, TimerFunc);
}
if ( a3 == 1001 )
KillTimer(hWnd, 1u);
}
return 0;
}5.itoa函数的作用是把整数转换成字符串,相当于 v10 给了v5所以等于 123,strcat是字符拼接,所以拼接起来就是了。
flag{123_Buff3r_0v3rf|0w}insanity解题
题目难度:3
题目描述: 菜鸡觉得前面的题目太难了,来个简单的缓一下

1.都提示了,肯定不会很难先用记事本看下,搜索flag好家伙直接发现了,还是用IDA看下内部。

2.用IDA打开,先看main函数F5进入伪代码,当然你也可以分析反汇编代码。


3.直接见flag,提交下看看。
flag:9447{This_is_a_flag}

Shuffle解题
题目难度:2

1.直接用IDA打开,一般题目都不加壳,能看到main主函数就没壳,题目有说找到字符串在随机化之前,意思就是字符在之前是完整的,之后就会加密打乱什么的。

2.说明flag在之前不会加密,运行初始化之后才会加密,我们先进入main函数分析下,看了会那些字符就是了,通过转ASCII拼接就是完整flag,开始写脚本。

byte = [
83, 69, 67, 67, 79, 78, 123, 87,
101, 108, 99, 111, 109, 101, 32,
116, 111, 32, 116, 104, 101, 32,
83, 69, 67, 67, 79, 78, 32, 50,
48, 49, 52, 32, 67, 84, 70, 33, 125
]
for i in range(len(byte)):
print(chr(byte[i]) ,end="")flag:SECCON{Welcome to the SECCON 2014 CTF!}3.直接在IDA转换char也是可以的,自己拼接上就行。

simple-unpack解题
题目难度:3

1.题目有说过加壳了,先查壳是个UPX压缩壳,UPX自带脱壳的参数 -d 就是了,先脱个壳先,从信息看到是个64位ELF文件,用64位IDA(废话)。


2.脱好壳再查看下,没壳了可以用IDA分析了。

3.不用分析了,直接见flag。
4.后面用文本查看也可以见flag。

Game解题
题目难度:3

1.老规矩查壳,看下木有壳扔IDA分析下。

2.其实直接运行按顺序输入1-8的数,就出现flag了,目的似乎达到了,但还是想看下内部逆向下先。

3.找到主函数 main,搜索下就好了,再按F5生成伪代码。

4.双击进入main_0函数看下。

5.找关键,我看过了在这个函数里sub_457AB4()

6.再进一层双击进入sub_45E940()函数里,在这里面。


7.一直往下翻,可以看到关键进行运算代码段,v2,v58进行两次异或处理 v59,v115 进行异或 再与0x13异或,flag 应该是和v2,v58的字符变量有关。
sub_45A7BE((int)"done!!! the flag is ", v1);
v60 = 18;
v61 = 64;
v62 = 98;
v63 = 5;
v64 = 2;
v65 = 4;
v66 = 6;
v67 = 3;
v68 = 6;
v69 = 48;
v70 = 49;
v71 = 65;
v72 = 32;
v73 = 12;
v74 = 48;
v75 = 65;
v76 = 31;
v77 = 78;
v78 = 62;
v79 = 32;
v80 = 49;
v81 = 32;
v82 = 1;
v83 = 57;
v84 = 96;
v85 = 3;
v86 = 21;
v87 = 9;
v88 = 4;
v89 = 62;
v90 = 3;
v91 = 5;
v92 = 4;
v93 = 1;
v94 = 2;
v95 = 3;
v96 = 44;
v97 = 65;
v98 = 78;
v99 = 32;
v100 = 16;
v101 = 97;
v102 = 54;
v103 = 16;
v104 = 44;
v105 = 52;
v106 = 32;
v107 = 64;
v108 = 89;
v109 = 45;
v110 = 32;
v111 = 65;
v112 = 15;
v113 = 34;
v114 = 18;
v115 = 16;
v116 = 0;
v3 = 123;
v4 = 32;
v5 = 18;
v6 = 98;
v7 = 119;
v8 = 108;
v9 = 65;
v10 = 41;
v11 = 124;
v12 = 80;
v13 = 125;
v14 = 38;
v15 = 124;
v16 = 111;
v17 = 74;
v18 = 49;
v19 = 83;
v20 = 108;
v21 = 94;
v22 = 108;
v23 = 84;
v24 = 6;
v25 = 96;
v26 = 83;
v27 = 44;
v28 = 121;
v29 = 104;
v30 = 110;
v31 = 32;
v32 = 95;
v33 = 117;
v34 = 101;
v35 = 99;
v36 = 123;
v37 = 127;
v38 = 119;
v39 = 96;
v40 = 48;
v41 = 107;
v42 = 71;
v43 = 92;
v44 = 29;
v45 = 81;
v46 = 107;
v47 = 90;
v48 = 85;
v49 = 64;
v50 = 12;
v51 = 43;
v52 = 76;
v53 = 86;
v54 = 13;
v55 = 114;
v56 = 1;
v57 = 117;
v58 = 126;
v59 = 0;
for ( i = 0; i < 56; ++i )
{
*(&v3 + i) ^= *(&v60 + i);
*(&v3 + i) ^= 0x13u;
}
return sub_45A7BE((int)"%s\n", (unsigned int)&v3);
}{/collapse-item}
解题代码
byte1 = [
123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0
]
byte2 = [
18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65,32, 12, 48, 65, 31, 78, 62, 32, 49, 32, 1,57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3,44, 65, 78, 32, 16,97,54,16,44,52,32,64,89, 45,32,65,15,34,18,16,0
]
for i in range(len(byte1)):
ch = chr(byte1[i]^byte2[i]^0x13)
print(ch,end="")flag:zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
Hello CTF解题
题目难度:4

1.老规矩看下有壳没,没壳直接拖入IDA进行分析。


2.运行后是要求输入正确的flag,我们肯定是没有的需要逆向出来,这些提示就是突破的关键,用IDA打开发现是个32位程序,直接进main函数分析。

3.按F5进入伪代码,找关键代码做突破口。
int __cdecl main(int argc, const char **argv, const char **envp)
{
int i; // ebx
char v4; // al
int result; // eax
int v6; // [esp+0h] [ebp-70h]
int v7; // [esp+0h] [ebp-70h]
char Buffer[2]; // [esp+12h] [ebp-5Eh] BYREF
char v9[20]; // [esp+14h] [ebp-5Ch] BYREF
char v10[32]; // [esp+28h] [ebp-48h] BYREF
__int16 v11; // [esp+48h] [ebp-28h]
char v12; // [esp+4Ah] [ebp-26h]
char v13[36]; // [esp+4Ch] [ebp-24h] BYREF
strcpy(v13, "437261636b4d654a757374466f7246756e");
while ( 1 )
{
memset(v10, 0, sizeof(v10)); // 对v10进行了初始化
v11 = 0;
v12 = 0;
sub_40134B(aPleaseInputYou, v6);
scanf("%s", v9);
if ( strlen(v9) > 0x11 )
break;
for ( i = 0; i < 17; ++i )
{
v4 = v9[i];
if ( !v4 )
break;
sprintf(Buffer, "%x", v4);
strcat(v10, Buffer); // 进行了拼接处理
}
if ( !strcmp(v10, v13) ) // 进行了字符串比较,如果v10的值等于v13的值会输出Success
sub_40134B(aSuccess, v7);
else
sub_40134B(aWrong, v7);
}
sub_40134B(aWrong, v7);
result = --Stream._cnt;
if ( Stream._cnt < 0 )
return _filbuf(&Stream);
++Stream._ptr;
return result;
}4.v13的值已经在strcpy这里出现了 437261636b4d654a757374466f7246756e,现在只要知道v10是怎么出来的就行,往上开始分析,分析结果:依次取出用户输入字符串的字符,把字符值的 ASCII 码值转成 16 进制的形式拼接到v10中,v10的值等于v13的值,需将字符串v13中的值两个一组,当作16进制的值,换算成ASCII码并转成对应的字符即可,这样就得到了flag,没有多复杂就看做是把 437261636b4d654a757374466f7246756e 转换成字符串。


解题代码
str1 = "437261636b4d654a757374466f7246756e"
gather = ""
count = 0
while count < len(str1):
gather += chr(int(str1[count:count + 2], 16))
count += 2
print(gather)flag:CrackMeJustForFun
动态调试

1.ctrl + G 搜索 401000 跳到这个程序起始的代码段上,往下看。

2.找到关键提示,正确和错误肯定就在下面了。

3.找到了成功的代码段,和错误的代码段。

4.好了再往上滑找到这个地址,401065 看到是个判断,我们在这里下断点。



crackme解题
题目难度:3

1.老规矩先查壳,有软件自动脱壳的工具,这里我手动脱下壳。

2.可以发现用IDA看下什么都没有,main函数也没有只能脱壳在分析了,其实可以让软件运行起来附加内存,也是能看到脱壳后的代码的。
ESP定律脱壳

1.拖入软件因为有壳,我们不能运行,按F8单步到2下call这个地址上。

2.右键ESP寄存器,下个硬件访问断点,下好了按F9运行。

3.再按F8运行两次,会跳到这个jump指令指向00401336这个地址上 。

4.右键选择分析,从模块中删除分析。

5.再右键选择这个脱壳选项。

6.开始脱壳然后保存壳就脱了。
静态分析

1.可以发现这是我脱好壳的程序,能看到main函数了代码也完整了,可以进一步分析了。

2.按F5查看伪代码,进入byte_402130这个函数里看下。

3.观察while循环可以发现,(&Buf + v4) ^ byte_402130[v4 % 16]),什么和什么异或了进入函就是这些。
解题代码
str1="this_is_not_flag"
byte=[0x12, 4, 8, 0x14, 0x24, 0x5C, 0x4A, 0x3D, 0x56, 0x0A, 0x10, 0x67, 0,
0x41, 0, 1, 0x46, 0x5A, 0x44, 0x42, 0x6E, 0x0C, 0x44, 0x72, 0x0C, 0x0D,
0x40, 0x3E, 0x4B, 0x5F, 2, 1, 0x4C, 0x5E, 0x5B, 0x17, 0x6E, 0x0C,
0x16, 0x68, 0x5B, 0x12]
flag=""
for i in range(len(byte)):
flag+=chr(byte[i]^ord(str1[i%16]))
print(flag)flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}

IgniteMe解题
题目难度:2

1.让你输入正确的flag,先用IDA静态分析下。

2.PE查壳工具看下有没有壳,看到是.txt并没有,一般我直接拖入IAD分析,查不查壳都一样,C++ 写的目测是易语言。


3.百度下就知道是32位的,用32位的IDA打开进行分析。

4.找到关键成功的地方,发现判断的对象是sub_4011C0(),如果等于真就成立执行成功的代码,我们可以进sub_4011C0()这个函数内看看,写的是什么逻辑。


5.把数组中大写字母转为小写字母,小写字母转为大写字母。然后把数组与0x55异或后+72,然后再与数组byte_4420B0异或,和GONDPHyGjPEKruv{{pj]X@rF进行比较,判断出执行结果为GONDPHyGjPEKruv{{pj]X@rF,如果相同则正确。

bytes = [
13, 19, 23, 17, 2, 1, 32, 29, 12, 2, 25,
47, 23, 43, 36, 31, 30, 22, 9, 15, 21, 39,
19, 38, 10, 47, 30, 26, 45, 12, 34, 4
]
v7 = []
str2 = 'GONDPHyGjPEKruv{{pj]X@rF'
band = ''
for i in range(24):
v7.append(bytes[i] ^ ord(str2[i]))
v7[i] = (v7[i] - 72) ^ 0x55
band = band + chr(v7[i]).lower()
print("EIS{%s}" % band)flag: EIS{wadx_tdgk_aihc_ihkn_pjlm}
lucknum解题
题目难度:1

1.没有后缀的文件,直接用IDA打开看看,加载的时候发现是个64位程序,
进入直接F5查看伪代码,直接见flag,解毕!
1000Click解题
题目难度:1
最简单的一个逆向题目,软件运行不破解点1000次也可以获得flag,
但这样太不符合我的习惯,逆向不走常规路。

方法1
1.利用cheat engine 修改内存点击次数到999

方法2
1.利用OD根据错误提示找反汇编代码 push压栈 就是flag
2.也可以用过IDA进行逆向分析,解毕!
评论 (0)