0%

实验室暑期CTF训练赛--第一周

只做了MISC和RE
题目和部分需要的工具链接:
链接:https://pan.baidu.com/s/1dwyK4jjlA44fFKZ3oQxQNg
提取码:1uat

MISC

MISC2

打开文件发现有一个音频,一个文件,文件记事本打开写着 H4vFunWTHthisMP3

一个音频加一串密钥的方式,所以使用MP3Steno
在这里插入图片描述
将音频放入MP3Steno的文件夹

cmd打开,输入命令
在这里插入图片描述
在这里插入图片描述
生成txt文件,打开有一串字符,包上flag即可

flag是:flag{07715d8b6390495daa744cc22a62e2ef}

timg_IN

在这里插入图片描述
只有一张图片,binwalk扫了一下没有隐藏两张,发现也没有改长度和高度

使用工具Stegsolve.jar

找到自己java安装地址,cmd窗口打开bin文件,在该目录下输入如下命令
在这里插入图片描述
即可打开Stegsolve
在这里插入图片描述
操作图中红框里的按键左右移动

Blue 0 通道有一个二维码,扫一扫,得到一串字符

1
+++++ +++++ [->++ +++++ +++<] >++.+ +++++ .<+++ [->-- -<]>- -.+++ +++.< ++++[ ->+++ +<]>+ +++.< ++++[ ->--- -<]>- ----- .<+++ ++++[ ->--- ----< ]>--- .<+++ ++++[ ->+++ ++++< ]>++. ++.<+ +++++ [->-- ----< ]>--- ----- ---.- ----- .++++ ++++. <++++ ++[-> +++++ +<]>+ +++++ +++.. .---- .+.-- .<+++ +++[- >---- --<]> ----- -.--- .<

利用这个网站
在这里插入图片描述

可以得到flag的前半段

通过观察我们发现图片的三色低像素通道都有一些像素块的样子
Green 0:
在这里插入图片描述
Red 0:
在这里插入图片描述
所以猜测是lsb

点这里
在这里插入图片描述
按下图设置,然后导出
在这里插入图片描述
Notepad++打开,左边还有不需要的东西,按住ctrl+alt,拉取删掉,密文中间的空格同理,去掉了每一行的回车
得到如下字符

1
2
3
4
5
6
7
8
9
10
11
12
..... ..... ..... ...!? !!.?. ..... ..... ..... ..?.? !.?.. ..... 
............ ..... ..... ..... !.!.. ..... !.?.. ..... ..... ...!? !!.?!
!!!!!..!!!!! !!!?. ?!.?! !!!!! !.?.. ..... ..... ...!? !!.?. ..... .....
...?...?!.?. ..... ..!.! !!.?. ..... ..... ....! ?!!.? !!!!! !!!!! !!!!?
.?!.?..!.?.. ..... ..... .!?!! .?... ..... ....? .?!.? ..... ..... .....
...........! .!.?. ..... ..... ....! ?!!.? !!!!! !!!!! !!!!? .?!.? !!!!!
.......!.... ..... !.?.. ..... ..... .!?!! .?... ..... ....? .?!.? .....
............ ..... !.?.. ..... ..... .!?!! .?!!! !!!!! !!!!? .?!.? !!!!!
!!!!!..!!!!! !!.?. ..... ..... ..!?! !.?.. ..... ..... ?.?!. ?.... .....
.........!.? ..... ..... ..... !?!!. ?!!!! !!!!! !!!!! ?.?!. ?!!!! !!!.?
............ ..... !?!!. ?.... ..... ..... ?.?!. ?..!. ?.... ..... ..!?!
!.?......... ...?. ?!.?. ...!. ?....

每过几个组就会有一个12个字符为一组的,12个的字符中间都是两个“..“,把他们换成空格
在这里插入图片描述
然后再取消换行,整理好之后的密文是

1
..... ..... ..... ...!? !!.?. ..... ..... ..... ..?.? !.?.. ..... ..... ..... ..... ..... ..... !.!.. ..... !.?.. ..... ..... ...!? !!.?! !!!!! !!!!! !!!?. ?!.?! !!!!! !.?.. ..... ..... ...!? !!.?. ..... ..... ...?. ?!.?. ..... ..!.! !!.?. ..... ..... ....! ?!!.? !!!!! !!!!! !!!!? .?!.? !.?.. ..... ..... .!?!! .?... ..... ....? .?!.? ..... ..... ..... ..... ....! .!.?. ..... ..... ....! ?!!.? !!!!! !!!!! !!!!? .?!.? !!!!! ..... !.... ..... !.?.. ..... ..... .!?!! .?... ..... ....? .?!.? ..... ..... ..... ..... !.?.. ..... ..... .!?!! .?!!! !!!!! !!!!? .?!.? !!!!! !!!!! !!!!! !!.?. ..... ..... ..!?! !.?.. ..... ..... ?.?!. ?.... ..... ..... ..!.? ..... ..... ..... !?!!. ?!!!! !!!!! !!!!! ?.?!. ?!!!! !!!.? ..... ..... ..... !?!!. ?.... ..... ..... ?.?!. ?..!. ?.... ..... ..!?! !.?.. ..... ...?. ?!.?. ...!. ?....

还是使用那个网站
在这里插入图片描述
合起来就是flag了
flag是:flag{e1df719fffbca74aad0ed3cc026d8d0b}

RE

ez_re

这题有一个虚假的flag,我们可以先来看一看
通过搜索字符串我们发现了Game start字符
来到main函数
在这里插入图片描述
想着这里有一个判断,便跟进去看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
v4 = 99;
v5 = 23;
v6 = 113;
v7 = 2;
v8 = 106;
v1 = a1 + 1;
v9 = 5;
v10 = 114;
v11 = 9;
v12 = 109;
v13 = 2;
v14 = 93;
v15 = 36;
v16 = 75;
v17 = 62;
v18 = 97;
v19 = 13;
v20 = 100;
v21 = 15;
v22 = 106;
v23 = 53;
v24 = 83;
v25 = 50;
v26 = 89;
v27 = 60;
v28 = 3;
v29 = 60;
v30 = 65;
do
{
v2 = *v1++; // v1是输入的字符串
*(v1 - 1) = ~(*(v1 - 2) & v2) & (*(v1 - 2) ^ v2);
} // 这段的逻辑就是,v1[i] = ~(v1[i-1]&v1[i])&(v1[i-1]^v1[i])
while ( Buf1 + 27 != v1 );
return memcmp(Buf1, Buf2, 0x1Bu) == 0; // 判断结果是否相等
}

感觉不错,写个脚本爆破,因为是与运算不容易逆回去

1
2
3
4
5
6
7
8
9
10
11
12
buf = [99, 23, 113, 2, 106, 5, 114, 9, 109, 2, 93, 36, 75, 62, 97, 13, 100, 15, 106, 53, 83, 50, 89, 60, 3, 60, 65]
result = [0] * 27
result[0] = buf[0]
print(len(buf))
for i in range(1, len(buf)):
for j in range(0,256):
tmp = ~(buf[i-1] & j) & (buf[i-1] ^ j)
if tmp == buf[i]:
result[i] = j
break
flag = ''.join(chr(i) for i in result)
print(flag)

得到ctfshow{do_you_like_fake??}

假的,都是假的,重新来过

那只能看main函数的第一个函数了,发现它没什么用
在这里插入图片描述
通过交叉引用,发现它还和这个函数有关。
在这里插入图片描述
跳转过去,F5
在这里插入图片描述
跟进上面红框中的函数
在这里插入图片描述
进入分析,发现有一个dword_402010,这里面有几个函数。
在这里插入图片描述
在这里插入图片描述
分析一下是经过改变的RC4
本来应该是i,这里改了
在这里插入图片描述
我们看一下sub_4012D0函数
在这里插入图片描述
onexit函数表示的是:在main函数结束之后还可以继续执行一段函数
在这里插入图片描述
将这个byte_403000中的数据拿出来,进行解密。然后再将每个值-7,即可得到flag
写脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<stdio.h>

void rc4_init(unsigned char*s,unsigned char*key, unsigned long Len)
{
int i=0,j=0;
unsigned char k[256]={0};
unsigned char tmp=0;
for(i=0;i<256;i++)
{
s[i]=256 - i;
k[i]=key[i%Len];
}
for(i=0;i<256;i++)
{
j=(j+s[i]+k[i])%256;
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}

void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len)
{
int i=0,j=0,t=0;
unsigned long k=0;
unsigned char tmp;
for(k=0;k<Len;k++)
{
i=(i+1)%256;
j=(j+s[i])%256;
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
t=(s[i]+s[j])%256;
Data[k]^=s[t];
}
}

int main()
{
unsigned char s[256]={0};
int i,j,k;
char key[256] = "keykeykey";
unsigned char data[] =
{
0xDC, 0x47, 0x7F, 0x6E, 0x9A, 0xD8, 0x60, 0x77, 0xF4, 0xB0,
0x8C, 0x54, 0xB0, 0xAA, 0x26, 0x23, 0x02, 0x42, 0x8E, 0xBA,
0x90, 0x8C, 0xAB, 0x86, 0x24, 0x6E, 0xF8
};
unsigned long data_len = 27;
unsigned long key_len = 9;


rc4_init(s,(unsigned char*)key,key_len);
rc4_crypt(s,(unsigned char*)data,data_len);
for(i=0;i<27;i++)
{
printf("0x%x ",data[i]);
}
return 0;
}

在这里插入图片描述
再做处理

1
2
3
4
5
6
buf2 = [0x6a,0x7b,0x6d,0x7a,0x6f,0x76,0x7e,0x82,0x80,0x37,0x7c,0x66,0x6e,0x37,0x7b,0x66,0x7b,0x3b,0x6c,0x66,0x3c,0x6c,0x6a,0x79,0x6c,0x7b,0x84]
buf = []
for i in range(len(buf2)):
buf.append(buf2[i] - 7)
flag = ''.join(chr(i) for i in buf)
print(flag)

flag是:ctfshow{y0u_g0t_t4e_5ecret}