AAA CTF101 安全攻防实践短学期 Reverse Lab 1

实验指导

仅供参考。

Task 1

Part 1

位于 0x12cd 的函数接收 key 和字符串并加密,它调用两个函数:位于 0x10f0 的函数根据 key 生成 keystream,位于 0x11df 的函数做实际的加密操作。结构体与函数签名类似如下:

1
2
3
4
5
6
7
struct pstr {
int len;
char str[28];
};
void FUN_12cd_rc4(char *key, int keylen, uint8_t *dst, int dstlen);
void FUN_10f0_genkey(char *key, int keylen, uint8_t *box);
void FUN_11df_encr(uint8_t *box, uint8_t *dst, int dstlen);

密文为 \xfba\x07\x84\xef\n\xf4\xdb\xcbuYU\xb8\xda\xd1\x9f\x1a\x86
key 为 uwin@aaa

使用 CyberChef 解密 RC4 得到 flag

Part 2

直接解密会得到 AAA{th1s_1s_n0t_c0rr3ct}

0x151c 处存在 _INIT_1() 函数,其中对 key 和密文做了修改。
key 为 \xde\xad\xbe\xef\xca\xfe\xba\xbe

Task 2

Flag 长度为 30,key 长度为 5,根据前 4 字节 AAA{ 与最后 1 字节 } 得到 key 为 tDk\x02-

pseudo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import xor


sbox = [10, 6, 17, 28, 11, 27, 1, 25, 5, 26, 0, 21, 16, 22, 15,
23, 9, 2, 8, 29, 7, 4, 20, 12, 13, 24, 14, 18, 3, 19]
inv_sbox = [0] * 30
for i in range(30):
inv_sbox[sbox[i]] = i

ct = b'@<\x1e#CU\x05\x1drC5uXq^+\x1b*xP1\x114fr2\x14\x0fyB'
key = xor([ct[inv_sbox[i]] for i in [0, 1, 2, 3, 29]], b'AAA{}')
pt = xor(ct, key)
print(bytes(pt[inv_sbox[i]] for i in range(30)))

AAA CTF101 安全攻防实践短学期 Reverse Lab 1
https://heap.45gfg9.net/t/ZJU/2023-CTF101/c9961074781f/
作者
45gfg9
发布于
2023-07-11
许可协议