2024_BaseCTF_re

2024_BaseCTF

[Week1] You are good at IDA

首先打开 IDA,用 F5 看一眼,OK,可以看到红圈里的第一段 flag,根据提示,应该是有3段 flag。打开字符串看一眼并没有发现 IDA 找到字符串,猜测是通过 section 处理

w1_goodatIDA

好,直接看它的汇编内容部分,一眼 flag,点击就送

以下是第二、第三段,整合一下就好

part_2

part_3

1
BaseCTF{Y0u_4Re_900d_47_id4}

[Week1] UPX mini

OK,标题就有一个明显的提示,用了 UPX 壳,让它进 DIE 过一圈。可以看到 64 位+UPX,IDA 走起

DIE

哦,不好意思忘记脱壳了

1
upx -d 文件名

tuoke

好了现在可以放心的打开 IDA 了,看看它说了什么。好极了,除了黄字部分全是废话。把黄字单独拎出来看下

ida_aft_tuoke

1
QmFzZUNURntIYXYzX0BfZzBvZF90MW0zISEhfQ==

一眼 base64,这么明显的等号,小工具秒了

1
BaseCTF{Hav3_@_g0od_t1m3!!!}

[Week1] Base

蹭一道 misc 的题目,首先看题干,提示是 base

1
KFWUM6S2KVHFKUTOOQZVUVCGNJGUOMLMLAZVE5SYGJETAYZSKZVGIR22HE======

直接丢到小工具里试,第一个 base36

1
QmFzZUNURnt3ZTFjMG1lX3RvX2I0c2VjdGZ9

看起来还有一个加密,尝试出来 base64

1
BaseCTF{we1c0me_to_b4sectf}

[Week1] BasePlus

首先查壳,64位,没壳

进 IDA 看到经过加密之后验证字符串,所以只要解密字符串就行

ida_main

1
lvfzBiZiOw7<lhF8dDOfEbmI]i@bdcZfEc^z>aD!

打开 Encode 看看怎么事儿。嚯,还挺长,把它拆分一下进行分析

p1

p2

p3

大概就是这三部分,接下来按照这个写一个解密脚本吧

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
def decode(encoded_str, secret):
output = []
encoded_len = len(encoded_str)

i = 0
while i < encoded_len:
# 每 4 个字符一组进行解密
block = [0] * 4
for j in range(4):
if i < encoded_len:
# 逆向异或操作
block[j] = ord(encoded_str[i]) ^ 0xE
i += 1

# 逆向字符映射:找到 secret 中字符的位置
decoded_block = [
secret.index(chr(block[0])) << 2 | secret.index(chr(block[1])) >> 4,
(secret.index(chr(block[1])) & 0xF) << 4 | secret.index(chr(block[2])) >> 2,
(secret.index(chr(block[2])) & 0x3) << 6 | secret.index(chr(block[3]))
]

# 添加到输出列表
for byte in decoded_block:
if byte != 0: # 跳过填充的空字节
output.append(chr(byte))

return ''.join(output)

secret = "/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC"
encoded_str = "lvfzBiZiOw7<lhF8dDOfEbmI]i@bdcZfEc^z>aD!"

# 进行解密
decoded_output = decode(encoded_str, secret)
print(f"Decoded output: {decoded_output}")

从 Secret 里得到 密钥,和被加密的字符串一起带入脚本

key

1
2
3
secret = "/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC"

encoded_str = "lvfzBiZiOw7<lhF8dDOfEbmI]i@bdcZfEc^z>aD!"

带入脚本即可得到正确的 flag

1
BaseCTF{BA5e_DEcoD1N6_sEcr3t}

[Week1] 人生苦短,我用Python

心血来潮写道 misc。前面的14道都比较简单,直接丢进openai里就能把答案反出来,我直接把答案放在注释里了,最开始的答案是乱写的,也是蒙对了一部分,其实问题不大,最后都能改回正确答案

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
import base64
import hashlib

def abort(id):
print('You failed test %d. Try again!' % id)
exit(1)
print('Hello, Python!')
flag = input('Enter your flag: ')
if len(flag) != 38:
abort(1)
if not flag.startswith('BaseCTF{'):
abort(2)
if flag.find('Mp') != 10: # BaseCTF{this_is_mey_flag_yesddddddd3x}
abort(3)
if flag[-3:] * 8 != '3x}3x}3x}3x}3x}3x}3x}3x}': # BaseCTF{thMp_is_mey_flag_yesddddddd3x}
abort(4)
if ord(flag[-1]) != 125:
abort(5)
if flag.count('_') // 2 != 2:
abort(6)
if list(map(len, flag.split('_'))) != [14, 2, 6, 4, 8]: # BaseCTF{thMpsi_sm_eyflag_yesd_ddddd3x}
abort(7)
if flag[12:32:4] != 'lsT_n': # BaseCTF{thMpli_ss_eyTlag_yesn_ddddd3x}
abort(8)
if '😺'.join([c.upper() for c in flag[:9]]) != 'B😺A😺S😺E😺C😺T😺F😺{😺S': # BaseCTF{ShMpli_ss_eyTlag_yesn_ddddd3x}
abort(9)
if not flag[-11].isnumeric() or int(flag[-11]) ** 5 != 1024: # BaseCTF{ShMpli_ss_eyTlag_ye4n_ddddd3x}
abort(10)
if base64.b64encode(flag[-7:-3].encode()) != b'MG1QbA==': # BaseCTF{ShMpli_ss_eyTlag_ye4n_d0mPl3x}
abort(11)
if flag[::-7].encode().hex() != '7d4372733173':# BaseCTF{S1Mpli_ss_eyTlar_ye4n_C0mPl3x}
abort(12)
if set(flag[12::11]) != {'l', 'r'}:
abort(13)
if flag[21:27].encode() != bytes([116, 51, 114, 95, 84, 104]): # BaseCTF{S1Mpli_ss_eyTt3r_Th4n_C0mPl3x}
abort(14)

15道可以使用遍历脚本来完成

1
2
if sum(ord(c) * 2024_08_15 ** idx for idx, c in enumerate(flag[17:20])) != 41378751114180610:
abort(15) # BaseCTF{S1Mpli_ss_BeTt3r_Th4n_C0mPl3x}

脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def replace_char(s, position, new_char):
if position < 0 or position >= len(s):
raise ValueError("Position out of range")
return ''.join(new_char if i == position else c for i, c in enumerate(s))

flag = 'BaseCTF{S1Mpli_ss_eyTt3r_Th4n_C0mPl3x}'

for i in range(48,123):
new_string = replace_char(flag, 18, chr(i))
for j in range(48, 123):
new_string2 = replace_char(new_string, 19, chr(j))
if((sum(ord(c) * 2024_08_15 ** idx for idx, c in enumerate(new_string2[17:20]))) == 41378751114180610):
print(new_string2)

后面的也很简单,直接简单修改即可

1
2
3
4
5
6
7
if not all([flag[0].isalpha(), flag[8].islower(), flag[13].isdigit()]):
abort(16)
if '{whats} {up}'.format(whats=flag[13], up=flag[15]).replace('3', 'bro') != 'bro 1':
abort(17)
if hashlib.sha1(flag.encode()).hexdigest() != 'e40075055f34f88993f47efb3429bd0e44a7f479':
abort(18)
print('🎉 You are right!')

得到的 flag:

1
BaseCTF{s1Mpl3_1s_BeTt3r_Th4n_C0mPl3x}

2024_BaseCTF_re
http://example.com/2024/09/11/2024-BaseCTF-re/
作者
Tsglz
发布于
2024年9月11日
许可协议