烧录准备工作 首先准备好一个esp32固件,一条数据线,一条母对母杜邦线,当然还得有一台电脑
连线 连接好线后插电的样子
此时可以线接一头GND,然后另一头线悬空一会接
查看esp32的COM端口
具体流程为在桌面win+x选择设备管理器,进入后查看端口即可
接下来到了烧录程序的环节,一般烧录一个程序需要知道以下三个内容地址,但是对于一般的挑战题来说。会给一个完整的二进制程序。通过xxd也可以检查到。直接进行烧录就行
引导程序 (bootloader.bin) - 地址 0x1000
分区表 (partition-table.bin) - 地址 0x8000
应用程序 (app.bin / 您的 1.bin) - 地址 0x10000
检查一下发现程序从00地址开始就是高电平,所以一个文件就可以完成烧录
执行命令
1 esptool.exe --chip esp32 --port COM5 --baud 460800 write_flash 0x0 1.b in
使用指令:
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参数需要手动复位一下
固件烧录完成
esp2官方推荐的调试环境及其说明:
ESP-IDF 入门教程 | 微雪文档平台
espressif/esp-idf: Espressif IoT Development Framework. Official development framework for Espressif SoCs.
也可以使用vscode的插件来观察
题目内容:
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 ) { 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 :2load :0x3fff0030 ,len :7172load :0x40078000 ,len :15532load :0x40080400 ,len :4load :0x40080404 ,len :3904entry 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,至此整个流程完成
也是拿下唯一解
拿下flag后就要进行最后一步:擦除esp32烧录的程序:
使用指令:
1 esptool.exe --chip esp32 --port COM5 --baud 460800 erase_flash