陇原战”疫”2021网络安全大赛

最后还加了一道周末打的DASCTF比赛的re题目

findme

RC4加密

定位加密函数

在main函数之中是主逻辑

image-20220324193151182

通过里面比较的函数定位到对应的位置,发现是引用了strcmp这个函数

image-20220324193140351

可以看到这个函数可能被另外一个函数改动了,定位到这个函数,这一看到这个函数把strcmp指引到了另外一个函数

image-20220324193117669

RC4算法

S盒的生成

它的S盒是利用用户输入的密钥生成S盒

image-20220324193044135

利用密钥流进行加密的操作

image-20220324193028708

RC4加密的函数

image-20220324193322692

S盒的生成

S盒的生成的函数:sub_40164C((int)v9, (int)v7, v4);

image-20220324193416009

对输入进行加密的函数:sub_401767((int)v8, (int)v6, v10);

image-20220324193543255

所以将内存之中需要解密的数据dump出来

密文

需要解密的对象是:

1
[0xb7,0x52,0x85,0xc1,0x90,0xe9,0x07,0xb8,0xe4,0x1a,0xc3,0xbd,0x1d,0x8e,0x85,0x46,0x00,0x21,0x44,0xaf,0xef,0x70,0x32,0xb5,0x11,0xc6]

密钥

密钥是引用该函数输入的参数:

1
SETCTF2021

和密文进行异或的数组

输入的字符串和图中的数进行异或运算就得到加密的结果,所以我们可以输入26个字符(这里输入的是flag{11111111111111111111}),得到加密的结果

image-20220324205255817

利用这个加密的结果和输入的字符串对应进行异或运算,再和最后对比结果进行异或运算,就能够得到正确的flag

假flag异或运算得到的结果

image-20220324205611680

脚本

1
2
3
4
5
6
7
8
obj = [  0x82, 0x7B, 0xB0, 0xE5, 0xBF, 0x9E, 0x4D, 0xDD, 0xBD, 0x1A,
0x81, 0xD3, 0x45, 0x8A, 0xEB, 0x32, 0x03, 0x4F, 0x40, 0xEA,
0x8C, 0x22, 0x6E, 0xBD, 0x01, 0xC6]
obj2 = [0xb7,0x52,0x85,0xc1,0x90,0xe9,0x07,0xb8,0xe4,0x1a,0xc3,0xbd,0x1d,0x8e,0x85,0x46,0x00,0x21,0x44,0xaf,0xef,0x70,0x32,0xb5,0x11,0xc6]
str = 'flag{11111111111111111111}'
for i in range(len(obj)):
print(chr(obj[i]^obj2[i]^ord(str[i])),end='')
SETCTF{Th1s_i5_E2_5tRcm9!}

所以最后的flag是 SETCTF{Th1s_i5_E2_5tRcm9!}

这里如果使用RC4解密的问题是,最后对比的加密结果不能转换成char类型

power

这是一个arm汇编源文件

arm文件的编译

在linux之中使用 arm-linux-gnueabi-as power -o power.o 将其编译为elf文件,然后拖入ida32之中即可找到下面这段代码

1
arm-linux-gnueabi-as power -o power.o

image-20220324220844188

AES加密

得到的代码我们能够看出这里使用的是AES加密 ,从图中标记的地方知道,虽然这个地方用的函数是cbc加密模式,但是从循环语句,每次加密16个字符(128位),把32个字符的输入分成了前16个和后16个字符各为一组数据,这样的加密模式显示是ECB模式

image-20220324214742877

从上面我们能够知道加密的结果 hex类型的数据:1030a9254d44937bed312da03d2db9adbec5762c2eca7b5853e489d2a140427b

密钥是16字节的字符串:this_is_a_key!!!

偏移量是:this_is_a_key!!!

AES解密

故用在线解密软件得到解密的结果是:

image-20220324215149254

最后的flag是 flag{y0u_found_the_aes_12113112}

EasyRE_Revenge

通过字符串定位到关键代码

image-20220325122807647

先对输入的长度进行判断(32),再对输入进行变换

将跳转到另外一个函数,但是发现这个函数要去花指令之后才能反编译

加密输入,和加密结果进行对比的对象

1
2
3
4
0x42, 0xB0, 0xE8, 0xEE, 0x6C, 0xEE, 0xD0, 0x57, 0x32, 0x4B, 
0xF5, 0xF3, 0xD6, 0xB7, 0xF0, 0xD3, 0x89, 0xC3, 0x61, 0x0A,
0x40, 0xBA, 0xC7, 0x38, 0x2C, 0x9E, 0x3D, 0x0C, 0x84, 0x92,
0x4A, 0xD6

Eat_something

得到了一个页面,这里关键代码再wasm文件之中

wasm文件:

wasm 是 WebAssembly 的二进制文件,包含二进制字节码。 写网站基本上是用 JavaScript, 当 JavaScript 速度不够快时,某个模块就可以用 C/C++ 编写,再编译成 wasm,供 JS 调用

页面网络之中得到wasm文件,感觉源文件是类似于字节码的东西

image-20220326082218639

wasm文件的编译

将wasm文件转换成.o文件

使用[该文章](wasm一键转c - 『原创发布区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn)之中提供的软件将wasm的文件转换成.o格式的文件

image-20220328124110199

定位关键函数

将文件放入到ida之中,关注它反编译得到的函数名称

image-20220328124259347

定位到有特别含义的函数名称,定位到_w2c_checkright这个函数

image-20220328130246604

密文

定位到w2c_memory 偏移为1024赋值的函数

image-20220328130406773

image-20220328130634714

提取出其中的数据

1
2
3
4
5
6
enc =   [0x86, 0x8B, 0xAA, 0x85, 0xAC, 0x89, 0xF0, 0xAF, 0xD8, 0x69, 
0xD6, 0xDD, 0xB2, 0xBF, 0x6E, 0xE5, 0xAE, 0x99, 0xCC, 0xD5,
0xBC, 0x8B, 0xF2, 0x7D, 0x7A, 0xE3, 0x59, 0x6F, 0x75, 0x20,
0x61, 0x72, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x21,
0x00, 0x59, 0x6F, 0x75, 0x20, 0x61, 0x72, 0x65, 0x20, 0x77,
0x72, 0x6F, 0x6E, 0x67, 0x21, 0x00]

脚本

1
2
3
4
5
6
7
8
9
enc =   [0x86, 0x8B, 0xAA, 0x85, 0xAC, 0x89, 0xF0, 0xAF, 0xD8, 0x69,
0xD6, 0xDD, 0xB2, 0xBF, 0x6E, 0xE5, 0xAE, 0x99, 0xCC, 0xD5,
0xBC, 0x8B, 0xF2, 0x7D, 0x7A, 0xE3, 0x59, 0x6F, 0x75, 0x20,
0x61, 0x72, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x21,
0x00, 0x59, 0x6F, 0x75, 0x20, 0x61, 0x72, 0x65, 0x20, 0x77,
0x72, 0x6F, 0x6E, 0x67, 0x21, 0x00]
for i in range(len(enc)):
print(chr((enc[i]^i)//2),end='')
CETCTF{Th0nk_Y0u_DocTOr51}

最后的flag是CETCTF{Th0nk_Y0u_DocTOr51}

easyre-DACTF2022

用PE打开发现是ASpack的壳,使用Stripper脱壳(工具在 看雪论坛的工具之中搜ASpack,其中有脱该壳的工具,也有手动脱壳的方法)

将脱壳得到的文件放入到ida32之中

主程序

首先判断了长度 和 前六个字符

image-20220329125348507

判断的输入的主逻辑函数

image-20220329125735359

image-20220329125737500

动态提取dword_492940数组的过程

下断点

image-20220329125814919

按照基本的要求,字符串的长度是42,前六个字符是DASCTF,构造输入

image-20220329125913628

然后提取数据:

image-20220329125940909

image-20220329125950987

dword_492940:

1
[0x38,0x78,0xdd,0xe8,0x00,0xaf,0xbf,0x3a,0x6b,0xfb,0xb8,0x0c,0x85,0x35,0x5c,0xad,0xe6,0x00,0xe0,0x8a,0x1d,0xbd,0x46,0xd2,0x2b,0x00,0x15,0x24,0xc6,0xad,0xa1,0xc9,0x7b,0x12,0x28,0x00,0x05,0x00,0x72,0x3e,0x10,0xa1,0x00,0x00]

最后对比的数据:

1
[0xC3,0x80,0xD5,0xF2,0x9B,0x30,0x0B,0xB4,0x55,0xDE,0x22,0x83,0x2f,0x97,0xB8,0x20,0x1D,0x74,0xd1,1,0x73,0x1A,0xB2,0xc8,0xc5,0x74,0xc0,0x5B,0xf7,0xF,0xD3,1,0x55,0xB2,0xA4,0xAE,0x7B,0xAC,0x5c,0x56,0xbc,0x23]

脚本

1
2
3
4
5
6
7
8
para = [0x38,0x78,0xdd,0xe8,0x00,0xaf,0xbf,0x3a,0x6b,0xfb,0xb8,0x0c,0x85,0x35,0x5c,0xad,0xe6,0x00,0xe0,0x8a,0x1d,0xbd,0x46,0xd2,0x2b,0x00,0x15,0x24,0xc6,0xad,0xa1,0xc9,0x7b,0x12,0x28,0x00,0x05,0x00,0x72,0x3e,0x10,0xa1,0x00,0x00]
para2 = [0xC3,0x80,0xD5,0xF2,0x9B,0x30,0x0B,0xB4,0x55,0xDE,0x22,0x83,0x2f,0x97,0xB8,0x20,0x1D,0x74,0xd1,1,0x73,0x1A,0xB2,0xc8,0xc5,0x74,0xc0,0x5B,0xf7,0xF,0xD3,1,0x55,0xB2,0xA4,0xAE,0x7B,0xAC,0x5c,0x56,0xbc,0x23]
for i in range(len(para2)):
if para2[i] >71:
print(chr((para2[i] - 71) ^ para[i]), end="")
else:
print(chr((para2[i] +256 - 71) ^ para[i]), end="")
DASCTF{Welc0me-t0-j01n-SU-l0ve-suyug1eg1e}

最后的flag:DASCTF{Welc0me-t0-j01n-SU-l0ve-suyug1eg1e}

参考文章:

陇原战”疫”2021网络安全大赛_RE_WP | zsky’s Blog (zzzzsky.com)

陇原战”疫”2021网络安全大赛 - 翻车鱼 (shi1011.cn)