看着都是 ez 题emm

ezRe

前面一个假的加密解出一个假的flag{how_is_the_weather_today},然后 SMC 进去解真flag,RC4,假flag是key

image-20240527224051565

image-20240527224147423

ezlogin

DES+base64,key从so里直接拿

image-20240527224324238

easy_iot

binwalk 解包,然后进squashfs-root,用 stat filename 查看时间戳

4da6da9e9b7cd7fc846cf002d4182859

bash的 modify时间是 2024-3-19,看起来是动过的,upx -d一下解密即可

stm32

ida 8.3 能把函数修的很好,但是没有 decompiler,只能用 ida7.7 对着一点点修emmm

用 ida 打开,调下参数把 format 变成 arm-littie_endian : armv7-M,这个架构默认的入口地址是 0x8000000,根据这个创建ROM段,选择其基址为 0x8000000

image-20240527230030089

看一下STM32的内存映射图

在这里插入图片描述

主要看的是 flash:0x08000000-0x0807FFFF, SRAM:0x20000000-0x3FFFFFFF, Peripherals:0x40000000-0x5FFFFFFF这三个段

flash 存储程序代码,SRAM 存放程序运算时的变量, Peripherals 是外设寄存器的映射地址,通过读写这些内存地址实现对外围设备的控制

先看程序段,OFFSET 为 4 的地方就是程序的入口地址了,也就是其main函数

image-20240527230857813

跟一下跳转可以来到这个函数

image-20240527231312069

进到后面那个函数可以把 v1 修成一个地址

image-20240527232039380

点进去发现是这个函数

image-20240527232049034

显然 v2 也对应着一个函数的地址,修好了以后我们进入对应 TASKFLAG 的地址

image-20240527232500581

先检查了格式然后调用了下面这个函数

image-20240527232618330

但是数据却怎么也找不到,这时候我们可以看到在执行 main 函数前(也就是 F4)进行了一段初始化

image-20240527233909363

image-20240527234619860

这个函数看起来贼抽象,应该是执行 sub_0x8009C0 这个函数,然后把前面三个作为参数填进去,得搞明白这个函数在干嘛

image-20240528011812084

看起来是对数据做了一些解包之类的处理,其实可以不用管直接上 idapython

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
import idaapi
data_addr = 0x8011F84
dest_addr = 0x20000000
len = 0x280

i = 0
j = 0
while i < len:
tByte = idaapi.get_byte(data_addr + i)
i += 1
low = tByte & 7
high = tByte >> 4
if low == 0:
low = idaapi.get_byte(data_addr + i)
i += 1
if high == 0:
high = idaapi.get_byte(data_addr + i)
i += 1
print(hex(tByte), hex(low), hex(high))
low -= 1
while low:
print(f"patch byte at {hex(dest_addr + j)} by {hex(data_addr + i)} : {hex(idaapi.get_byte(data_addr + i))}")
idaapi.patch_byte(dest_addr + j, idaapi.get_byte(data_addr + i))
i += 1
j += 1
low -= 1
if tByte & 8 != 0:
t = idaapi.get_byte(data_addr + i)
i += 1
t = idaapi.get_byte(dest_addr - t)
high_2 = high + 2
high_2 -= 1
while high_2 >= 0:
print(f"patch byte at {hex(dest_addr + j)} by {hex(data_addr + i)} : {hex(idaapi.get_byte(data_addr + i))}")
idaapi.patch_byte(dest_addr + j, idaapi.get_byte(data_addr + i))
i += 1
j += 1
high_2 -= 1
else:
high -= 1
while high >= 0:
print(f"patch byte at {hex(dest_addr + j)} by {hex(data_addr + i)} : {hex(idaapi.get_byte(data_addr + i))}")
idaapi.patch_byte(dest_addr + j, 0)
j += 1
high -= 1

执行一下,发现数据以及被初始化了,我们找到加密的地方,就能看到 enc 已经被写进去了

image-20240528011959859

写个脚本解密一下

1
2
3
4
enc = bytes.fromhex("66 6D 63 64 7F 57 37 4B 3C 7B 58 40 3A 70")
for i in range(14):
print(chr(enc[i] ^ i), end = '')
# flag{R1L4rRK6}