+++ /dev/null
-= Ourosboros Flash Reader
-:revealjsdir: ./reveal.js-5.2.1/
-
-Patrick Schönberger
-
-16.07.2025
-
-== Structure
-
-- Problem
-- Solution
-- Implementation
-
-== Problem
-
-== Solution
-
-== Implementation
-
-structure: start with a problem and reproduce the work leading to the working solution
-
-access smart home hw on crime scenes
-many shelly devices are based on esp32/esp8266
-they dont contain any usable data but contain identifiable user data
-this can be used to inquire about the user account
-so we need to extract the content of the esp's flash memory
-we then also need to extract filesystems from the memory
-do it read-only, verifiably
-existing solutions (esptool, mos) can also write and erase memory
-they are also complex, making understanding and changing the code time consuming
-what about writing a custom extraction tool?
-what is the bare minimum needed to talk to the esp?
-- two modes: bootmode and runmode
-- decided by GPIO0 at start
-- the esp as well as the shelly devices expose uart pins (tx/rx)
-- in runmode they output logging information
-- in bootmode they listen to a custom serial protocol
-so we need a serial connection and the ability to enter boot mode!
-what can the serial protocol do?
-- sync
-- write ram/flash/registers
-- configuration etc.
-- on the esp32 it can read flash, but not on esp8266, esp32c3, esp32c6
-how do other tools read flash?
-- we cant directly read flash, but we can write ram
-- write a program, load it into ram, run it and then talk to it instead
-- flash loader/stub
-- esptool uses two different variants, c based and rust based
-- the c based one is older and getting replaced, but it is also dramatically simpler and also supports the esp8266
-- so we use the c based one and customize it (remove write and erase flash commands)
-technically this means we do have write access until the flash loader is activated
-the extraction tool is also small and runs a fixed number of commands
--> as sure as we can be
-how does the serial protocol work?
-- data is encoded using SLIP frames
-- the host sends a request and the target (esp) sends a response
-- steps to read flash:
- - sync
- - identify chip
- - read mac
- - (change baud)
- - upload stub
- - read flash
-modifying the flash loader
-- stub consists of 6 .c files:
- - miniz.c // compression
- - slip.c // slip
- - stub_commands.c // handle commands
- - stub_flasher.c // main program
- - stub_io.c // serial communication
- - stub_write_flash.c // write flash
-- so we remove stub_write_flash.c and modify stub_commands.c
-- additionally simplify the makefile
-compiling and uploading the flash loader
-- download toolchains
-- compile the stub using specific toolchains
-- this gives us an elf file
-- use a python script to extract the .text and .data sections from the elf
-- generate a header file and write the raw bytes to a `const unsigned char[]`
-- this header gets compiled with the extraction tool (host)
-- at runtime, after the chip is identified, upload .text and .data using MEM_ ram commands
-- addresses for the sections and for the entry point are in elf file and get written to header alongside the elf sections
-and how do we make the esp enter bootmode?
-- wire two gpio pins to RST and GPIO0
-- pull both low
- - RST low turns the esp off
- - GPIO0 has to be low when it is turned back on
-- pull RST high to turn it on
-- pull GPIO0 high after the esp has started
-overview:
-- bootmode/serial
-- serial protocol
-- flash loader
-differences between esp versions
-- identification:
- - ESP32-C3 and later use GET_SECURITY_INFO which contains a chip_id
- - previous models have a register with a magic value identifying the chip
-- mac address:
- - different registers
- - esp8266 mac has to be calculated
-- different flash loader versions
- - esp8266 has no data section
-different hosts:
-- linux (usb)
-- rpi (gpio)
-- esp (gpio)
-extracting the file system
-- esp8266
-- esp32
-interesting files
-- wifi credentials
-- certificates
-- jwt token
-
-
-DEMO!
-
-
-== cloc
-
-```sh
-$ cloc esp-flasher-stub/
- 38 text files.
- 34 unique files.
- 5 files ignored.
-
-github.com/AlDanial/cloc v 2.04 T=0.02 s (2259.9 files/s, 199599.0 lines/s)
------------------------------------------------------------
-Language files blank comment code
------------------------------------------------------------
-Rust 12 327 78 1863
-Logos 14 32 0 249
-YAML 3 34 12 214
-Markdown 1 34 0 89
-TOML 4 8 2 61
------------------------------------------------------------
-SUM: 34 435 92 2476
------------------------------------------------------------
-
-$ cloc esp-hal
- 742 text files.
- 718 unique files.
- 35 files ignored.
-
-github.com/AlDanial/cloc v 2.04 T=0.36 s (1978.1 files/s, 522278.6 lines/s)
------------------------------------------------------------
-Language files blank comment code
------------------------------------------------------------
-Rust 492 18739 26120 115809
-Linker Script 51 499 1404 11315
-Markdown 66 2014 12 5262
-TOML 43 505 412 4481
-Logos 44 229 15 1105
-YAML 13 151 67 1054
-Jinja Template 3 52 0 255
-JSON 2 0 0 48
-CSV 3 0 0 21
-SVG 1 0 0 4
------------------------------------------------------------
-SUM: 718 22189 28030 139354
------------------------------------------------------------
-
-$ cloc esptool-legacy-flasher-stub/
- 63 text files.
- 60 unique files.
- 4 files ignored.
-
-github.com/AlDanial/cloc v 2.04 T=0.06 s (952.9 files/s, 535446.8 lines/s)
------------------------------------------------------------
-Language files blank comment code
------------------------------------------------------------
-Linker Script 32 787 1188 18751
-C 6 1284 636 7689
-C/C++ Header 8 463 557 1687
-make 1 36 33 130
-YAML 4 19 0 114
-Python 2 25 21 80
-Markdown 3 58 0 76
-Bourne Shell 2 9 8 23
-TOML 1 1 0 20
-Jinja Template 1 4 2 14
------------------------------------------------------------
-SUM: 60 2686 2445 28584
------------------------------------------------------------
-```