烧录准备工作

首先准备好一个esp32固件,一条数据线,一条母对母杜邦线,当然还得有一台电脑

微信图片_20251101003359_140_54

连线

连接好线后插电的样子

d3873680baa5316a54ab44b78736d55e

此时可以线接一头GND,然后另一头线悬空一会接

查看esp32的COM端口

具体流程为在桌面win+x选择设备管理器,进入后查看端口即可

image.png

接下来到了烧录程序的环节,一般烧录一个程序需要知道以下三个内容地址,但是对于一般的挑战题来说。会给一个完整的二进制程序。通过xxd也可以检查到。直接进行烧录就行

  • 引导程序 (bootloader.bin) - 地址 0x1000
  • 分区表 (partition-table.bin) - 地址 0x8000
  • 应用程序 (app.bin / 您的 1.bin) - 地址 0x10000

检查一下发现程序从00地址开始就是高电平,所以一个文件就可以完成烧录

img

执行命令

1
esptool.exe --chip esp32 --port COM5 --baud 460800 write_flash 0x0 1.bin

img

使用指令:

1
esptool.exe --chip esp32 --port COM5 --baud 460800 write_flash -z 0x0 1.bin

这里解释一下这个指令

命令部分作用说明 中文解释 中文解释
esptool.exe 工具名称 运行 ESP32 的烧录工具。
–chip esp32 目标芯片 指定要操作的芯片类型为 ESP32。esptool 也支持 ESP8266、ESP32-S2/S3/C3 等,此参数确保命令针对正确的芯片执行。
–port COM5 串口端口 指定 ESP32 开发板连接到电脑的虚拟串口端口。这是您在设备管理器中确认的端口。
–baud 460800 通信波特率 设置烧录过程中,电脑与 ESP32 之间进行数据传输的速率(每秒位数)。460800 是一个常用的较高速度,以加快烧录时间。
write_flash 核心命令 esptool 接下来要执行的操作是写入 Flash 存储器(即烧录固件)
-z 可选参数 这是一个优化参数。它告诉 esptool 在数据传输完成后自动跳转到应用程序,避免手动按复位键,使程序烧录后能立即启动运行。
0x0 烧录起始地址 指定固件在 Flash 存储器中开始写入的十六进制地址。在您目前的 CTF 场景中,0x0 表示将 1.bin 作为完整的固件镜像烧录到 Flash 的最开始位置。
1.bin ``固件文件 指定要烧录的本地固件文件名。这是您编译或题目提供的应用程序二进制文件。

如果不选-z参数需要手动复位一下

固件烧录完成

image-20251101010612017

esp2官方推荐的调试环境及其说明:

ESP-IDF 入门教程 | 微雪文档平台

espressif/esp-idf: Espressif IoT Development Framework. Official development framework for Espressif SoCs.

也可以使用vscode的插件来观察

image-20251101010511134

题目内容:

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
#define TRIGGER_GPIO GPIO_NUM_19   // 触发引脚
#define DEBOUNCE_DELAY_MS 1000

static int hit = 0;


void app_main(void)
{
while (1) {
printf("[+] hardware task I : hit %d\n", hit);
int level = gpio_get_level(TRIGGER_GPIO);
if (level == 0) {
hit++;
} else {
hit = 0;
}

if (hit > 5 && gpio_get_level(TRIGGER_GPIO) == 0) { //完成得到flag
while (1) {
vTaskDelay(pdMS_TO_TICKS(1000));
}
}

vTaskDelay(pdMS_TO_TICKS(DEBOUNCE_DELAY_MS));
}
}

在这个模块启动的终端中使用指令:

1
platformio device monitor --port COM5 --baud 115200

由于刚刚才我们已经连好了线但是没有输出。我们先把GPIO引脚19接地,此时完成了题目中一直让19引脚保持低电平的条件。然后我们按下esp32板子上的EN按钮重启一下程序,此时就会可以得到完整的日志输出。

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
PS D:\platformio device monitor --port COM5 --baud 115200
--- Terminal on COM5 | 115200 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
ets Jun 8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:7172
load:0x40078000,len:15532
load:0x40080400,len:4
load:0x40080404,len:3904
entry 0x40080640
␛[0;32mI (29) boot: ESP-IDF v5.2 2nd stage bootloader␛[0m
␛[0;32mI (29) boot: compile time Sep 22 2025 19:32:39␛[0m
␛[0;32mI (29) boot: Multicore bootloader␛[0m
␛[0;32mI (33) boot: chip revision: v1.1␛[0m
␛[0;32mI (37) boot.esp32: SPI Speed : 40MHz␛[0m
␛[0;32mI (41) boot.esp32: SPI Mode : DIO␛[0m
␛[0;32mI (46) boot.esp32: SPI Flash Size : 2MB␛[0m
␛[0;32mI (50) boot: Enabling RNG early entropy source...␛[0m
␛[0;32mI (56) boot: Partition Table:␛[0m
␛[0;32mI (59) boot: ## Label Usage Type ST Offset Length␛[0m
␛[0;32mI (67) boot: 0 nvs WiFi data 01 02 00009000 00006000␛[0m
␛[0;32mI (74) boot: 1 phy_init RF data 01 01 0000f000 00001000␛[0m
␛[0;32mI (82) boot: 2 factory factory app 00 00 00010000 00100000␛[0m
␛[0;32mI (89) boot: End of partition table␛[0m
␛[0;32mI (93) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=09f14h ( 40724) map␛[0m
␛[0;32mI (116) esp_image: segment 1: paddr=00019f3c vaddr=3ffb0000 size=02254h ( 8788) load␛[0m
␛[0;32mI (119) esp_image: segment 2: paddr=0001c198 vaddr=40080000 size=03e80h ( 16000) load␛[0m
␛[0;32mI (128) esp_image: segment 3: paddr=00020020 vaddr=400d0020 size=145bch ( 83388) map␛[0m
␛[0;32mI (159) esp_image: segment 4: paddr=000345e4 vaddr=40083e80 size=0889ch ( 34972) load␛[0m
␛[0;32mI (179) boot: Loaded app from partition at offset 0x10000␛[0m
␛[0;32mI (179) boot: Disabling RNG early entropy source...␛[0m
␛[0;32mI (190) cpu_start: Multicore app␛[0m
␛[0;32mI (199) cpu_start: Pro cpu start user code␛[0m
␛[0;32mI (199) cpu_start: cpu freq: 160000000 Hz␛[0m
␛[0;32mI (199) cpu_start: Application information:␛[0m
␛[0;32mI (202) cpu_start: Project name: hit␛[0m
␛[0;32mI (207) cpu_start: App version: 1␛[0m
␛[0;32mI (211) cpu_start: Compile time: Sep 22 2025 19:32:35␛[0m
␛[0;32mI (217) cpu_start: ELF file SHA256: ed6b29e17...␛[0m
␛[0;32mI (223) cpu_start: ESP-IDF: v5.2␛[0m
␛[0;32mI (227) cpu_start: Min chip rev: v0.0␛[0m
␛[0;32mI (232) cpu_start: Max chip rev: v3.99 ␛[0m
␛[0;32mI (237) cpu_start: Chip rev: v1.1␛[0m
␛[0;32mI (242) heap_init: Initializing. RAM available for dynamic allocation:␛[0m
␛[0;32mI (249) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM␛[0m
␛[0;32mI (255) heap_init: At 3FFB2B18 len 0002D4E8 (181 KiB): DRAM␛[0m
␛[0;32mI (261) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM␛[0m
␛[0;32mI (267) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM␛[0m
␛[0;32mI (274) heap_init: At 4008C71C len 000138E4 (78 KiB): IRAM␛[0m
␛[0;32mI (282) spi_flash: detected chip: generic␛[0m
␛[0;32mI (285) spi_flash: flash io: dio␛[0m
␛[0;33mW (289) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
␛[0;32mI (303) main_task: Started on CPU0␛[0m
␛[0;32mI (313) main_task: Calling app_main()␛[0m
␛[0;32mI (313) gpio: GPIO[19]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 ␛[0m
[+] hardware task I : hit 0
[+] hardware task I : hit 1
[+] hardware task I : hit 2
[+] hardware task I : hit 3
[+] hardware task I : hit 4
[+] hardware task I : hit 5
[+] flag:flag{xxxxxxxxxxxx}
PS D:\>

可以看到提取到了flag,至此整个流程完成

iot1

也是拿下唯一解

image-20251101000816482

拿下flag后就要进行最后一步:擦除esp32烧录的程序:

使用指令:

1
esptool.exe --chip esp32 --port COM5 --baud 460800 erase_flash

image-20251101003136984