..ããã®èšäºã§èª¬æãããŠããæ»æãèŠããšãã¯ãESP32ãããã®ãªããžã§ã³0ããã³1ã«é©çšãããããšã«æ³šæããŠãã ãããæ°ããESP32 V3ã¯ããã®æ»æã§äœ¿çšãããUARTããŒãããŒããŒç¡å¹åæ©èœããµããŒãããŸãã
UARTããŒãããŒããŒ
ESP32ã§ã¯ãUARTããŒãããŒããŒã¯ROMã³ãŒãã§å®è£ ãããŠããŸããããã«ããããšããããå€éšãã©ãã·ã¥ã¡ã¢ãªã«ããã°ã©ã ãæžã蟌ãããšãå¯èœã«ãªããŸãã ROMã«æ ŒçŽãããã³ãŒããšããŠUARTããŒãããŒããŒãå®è£ ããããšã¯äžè¬çãªè§£æ±ºçã§ãããã®ãããªã³ãŒãã¯ç°¡åã«ç Žæããªããããéåžžã«ä¿¡é Œæ§ããããŸãããã®æ©èœãå€éšãã©ãã·ã¥ã¡ã¢ãªã«ä¿åãããŠããã³ãŒãã«åºã¥ããŠããå Žåããã®ãããªã¡ã¢ãªãæå·ãããšããã€ã¯ãã³ã³ãã¥ãŒã¿ãå®å šã«åäœããªããªããŸãã
éåžžããã®ãããªæ©èœãžã®ã¢ã¯ã»ã¹ã¯ãããããç¹å¥ãªã¢ãŒããã€ãŸãããŒãã¢ãŒãã§ããŒãããããšãã«ç·šæãããŸãããã®ã¢ãŒãã®éžæã¯ãããã€ã¹ãåèµ·åããåã«åãä»ããããã³ã³ã¿ã¯ããžã£ã³ããŒïŒãŸãã¯ãžã£ã³ããŒïŒã䜿çšããŠå®è¡ãããŸãã ESP32ã¯ããã«ãã³ã䜿çšããŸã
G0
ã
UARTããŒãããŒããŒã¯å€ãã®èå³æ·±ããã®ããµããŒãããŠããŸãã¡ã¢ãªãšã¬ãžã¹ã¿ã®èªã¿åã/æžã蟌ã¿ãããã«ã¯SRAMããã®ããã°ã©ã ã®å®è¡ã«ã䜿çšã§ããåœä»€ã
âä»»æã®ã³ãŒãå®è¡
UARTããŒããŒã¯ãã³ãã³ãã䜿çšããä»»æã®ã³ãŒãã®ããŒããšå®è¡ããµããŒãããŠã
load_ram
ãŸããESP32 SDKã«ã¯ãSRAMããå®è¡ã§ããã³ãŒããã³ã³ãã€ã«ããããã«å¿
èŠãªãã¹ãŠã®ããŒã«ãå«ãŸããŠããŸããããšãã°ã次ã®ã³ãŒãã¹ããããã¯æååSRAM CODE\n
ãã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã«åºåããŸãã
void __attribute__((noreturn)) call_start_cpu0()
{
ets_printf("SRAM CODE\n");
while (1);
}
esptool.py
ESP32 SDKã®äžéšã§ãã
ããŒã«ã䜿çšããŠãã³ã³ãã€ã«ããããã€ããªãSRAMã«ããŒãã§ããŸãã次ã«ããããã®ãã¡ã€ã«ãå®è¡ã§ããŸãã
esptool.py --chip esp32 --no-stub --port COM3 load_ram code.bin
èå³æ·±ãããšã«ãUARTããŒãããŒããŒãç¡å¹ã«ããããšã¯ã§ããŸããããããã£ãŠãã»ãã¥ã¢ããŒããšãã©ãã·ã¥æå·åãæå¹ã«ãªã£ãŠããå Žåã§ããåžžã«ã¢ã¯ã»ã¹ã§ããŸãã
âè¿œå ã®ã»ãã¥ãªãã£å¯Ÿç
æããã«ãè¿œå ã®ã»ãã¥ãªãã£å¯Ÿçãè¬ããããªãéããUARTããŒãããŒããŒã®åžžæå¯çšæ§ã«ããããã©ãã·ã¥ã¡ã¢ãªã®ã»ãã¥ã¢ããŒãããã³æå·åã¡ã«ããºã ã¯å®è³ªçã«åœ¹ã«ç«ããªããªããŸãããããã£ãŠãEspressifã¯ãeFuseãã¯ãããžãŒã«åºã¥ãè¿œå ã®ã»ãã¥ãªãã£ã¡ã«ããºã ãå®è£ ããŠããŸãã
ãããã¯ãã»ãã¥ãªãã£ãã©ã¡ãŒã¿ãæ§æããããã«äœ¿çšããããããã§ãããOTPã¡ã¢ãªïŒã¯ã³ã¿ã€ã ããã°ã©ããã«ã¡ã¢ãªïŒãšåŒã°ããããšãå€ãç¹å¥ãªã¡ã¢ãªã«æ ŒçŽãããŸãããã®ãããªã¡ã¢ãªå ã®ãããã¯ã0ãã1ã«ã®ã¿å€æŽã§ããŸãããå察æ¹åã«ã¯å€æŽã§ããŸãããããã«ãããæ©èœãæå¹ã«ããããããèšå®ãããŠããå Žåããã®æ©èœãå床ã¯ãªã¢ãããããšã¯ãããŸãããESP32ãUARTããŒãããŒããŒã¢ãŒãã§åäœããŠããå ŽåãOTPã¡ã¢ãªã®æ¬¡ã®ãããã䜿çšããŠç¹å®ã®æ©èœãç¡å¹ã«ããŸãã
DISABLE_DL_ENCRYPT
: -.DISABLE_DL_DECRYPT
: -.DISABLE_DL_CACHE
: MMU- -.
DISABLE_DL_DECRYPT
ãã©ãã·ã¥ã¡ã¢ãªã«ä¿åãããŠããããŒã¿ã®ééçãªåŸ©å·åãç¡å¹ã«ãã
ãããOTPã¡ã¢ãªãããã«æãé¢å¿ããããŸãã
ãã®ããããèšå®ãããŠããªãå ŽåãUARTããŒãããŒããŒã䜿çšããŠãã€ã¯ãã³ã³ãã¥ãŒã¿ãŒãããŒããããšãã«ããã©ãã·ã¥ã¡ã¢ãªã«æ ŒçŽãããŠããããŒã¿ãžã®ç°¡åãªã¢ã¯ã»ã¹ãæŽçããéåžžã®ããã¹ããšåãããã«æäœã§ããŸãã
ãã®ããããèšå®ãããŠããå ŽåãUARTããŒãããŒããŒã䜿çšããããŒãã¢ãŒãã§ã¯ãæå·åãããããŒã¿ã®ã¿ãã¡ã¢ãªããèªã¿åãããšãã§ããŸããããŒããŠã§ã¢ã«å®å šã«å®è£ ãããããã»ããµã«å¯ŸããŠééçãªãã©ãã·ã¥æå·åæ©èœã¯ãESP32ãéåžžã¢ãŒãã§èµ·åããå Žåã«ã®ã¿æå¹ã«ãªããŸãã
ããã§èª¬æããŠããæ»æãå®è¡ãããšãããããã®ãããã¯ãã¹ãŠ1ã«èšå®ãããŸãã
ããã€ã¹ã®ããããªã»ããåŸãSRAMããŒã¿ãæç¶ãã
ESP32ãã€ã¯ãããã»ããµã§äœ¿çšãããSRAMã¯éåžžã«äžè¬çã§ããåãããšãå€ãã®ãããã§äœ¿çšãããŠããŸããããã¯éåžžROMãšçµã¿åãããŠäœ¿çšââããããã©ãã·ã¥ã¡ã¢ãªããæåã®ããŒãããŒããŒãèµ·åãã圹å²ãæãããŸãããã®ãããªã¡ã¢ãªã¯ã䜿çšããåã«äœãèšå®ããå¿ èŠããªããããããŒãã®åæ段éã§äœ¿çšãããšäŸ¿å©ã§ãã
以åã®èª¿æ»ã®çµéšã«ãããšãSRAMã«ä¿åãããŠããããŒã¿ã¯ãäžæžããããããã¡ã¢ãªã»ã«ã«é»åãäŸçµŠãããªããªããŸã§å€æŽãããŸããããããã®ã³ãŒã«ããªã»ããïŒã€ãŸããé»æºã®ãªã³/ãªããµã€ã¯ã«ïŒã®åŸãSRAMã®å 容ã¯ããã©ã«ãã®ç¶æ ã«ãªã»ãããããŸãããã®ãããªã¡ã¢ãªã®åãããã¯ãå€0ããã³1ã«èšå®ããããããã®äžæã®ïŒã»ãã©ã³ãã ãšèšãããšãããïŒç¶æ ã«ãã£ãŠåºå¥ãããŸãã
ãã ããããããªããŒãåŸãé»æºãåããã«ãããããªããŒããããšãSRAMã«ä¿åãããŠããããŒã¿ããã®ãŸãŸæ®ãå ŽåããããŸããããã次ã®å³ã«ç€ºããŸãã
ã³ãŒã«ããªããŒãïŒäžïŒãšããããªããŒãïŒäžïŒãSRAMã³ã³ãã³ãã«äžãã圱é¿
äžèšãESP32ã«åœãŠã¯ãŸããã©ããã確èªããããšã«ããŸãããããŒããŠã§ã¢ãŠã©ããããã°ã¿ã€ããŒã䜿çšããŠããœãããããããŒããå®è¡ã§ããããšãããããŸãããUARTããŒãããŒããŒã䜿çšããŠãããããããŒãã¢ãŒãã®å Žåã§ãããã®ã¿ã€ããŒã匷å¶çã«èµ·åã§ããŸãããã®çµæããã®ã¡ã«ããºã ã䜿çšããŠãESP32ãéåžžã®ããŒãã¢ãŒãã«ããããšãã§ããŸãã
SRAMã«ããŒããããUARTããŒãããŒããŒã䜿çšããŠå®è¡ããããã¹ãã³ãŒãã䜿çšããŠãSRAMå ã®ããŒã¿ã¯ããŠã©ããããã°ã¿ã€ããŒã«ãã£ãŠéå§ãããããããªã»ããåŸãå®éã«åç¶ããããšã確èªããŸãããããã¯ãSRAMã«å¿ èŠãªãã®ãèšé²ããåŸãéåžžã©ããESP32ãèµ·åã§ããããšãæå³ããŸãã
次ã«ããããã©ã®ããã«äœ¿çšã§ãããã«ã€ããŠã®è³ªåãç§ãã¡ã®åã«èµ·ãããŸããã
倱æãžã®é
æ»æã®ããã®ããããªããŒãåŸã«ããŒã¿ãSRAMã«ä¿åããããšããäºå®ãå©çšã§ããå¯èœæ§ããããšæ³å®ããŸãããæåã®æ»æã¯ãUARTããŒãããŒããŒã䜿çšããŠSRAMã«ã³ãŒããèšè¿°ãã次ã«ãŠã©ããããã°ã¿ã€ããŒã䜿çšããŠãããã€ã¹ã®ããããªããŒããå®è¡ããããšã§ããã次ã«ãéåžžã®èµ·åäžã«ROMã³ãŒãããã®ã³ãŒãããã©ãã·ã¥ããŒãããŒããŒã³ãŒãã§äžæžããããããå®è¡ããŠã¯ã©ãã·ã¥ããŸããã
以åã®å®éšã®éçšã§ããŒã¿è»¢éããã»ã¹ãã³ãŒãå®è¡ããã»ã¹ã«å€ããåŸããã®ã¢ã€ãã¢ãæãã€ããŸããã次ã«ãããŒãããŒããŒãã³ããŒãå®äºããåã«ãããããéå§ã¢ãã¬ã¹ããã³ãŒãã®å®è¡ãéå§ããããšã«æ°ä»ããŸããã
æã ãäœããéæããããã«ãããªãã¯ãããè©Šãå¿ èŠããããŸã...
âSRAMã«ããŒããããæ»æãå®è¡ããããã«äœ¿çšãããã³ãŒã
ããã¯ãUARTããŒãããŒããŒã䜿çšããŠSRAMã«æžã蟌ãã ã³ãŒãã§ãã
#define a "addi a6, a6, 1;"
#define t a a a a a a a a a a
#define h t t t t t t t t t t
#define d h h h h h h h h h h
void __attribute__((noreturn)) call_start_cpu0() {
uint8_t cmd;
ets_printf("SRAM CODE\n");
while (1) {
cmd = 0;
uart_rx_one_char(&cmd);
if(cmd == 'A') { // 1
*(unsigned int *)(0x3ff4808c) = 0x4001f880;
*(unsigned int *)(0x3ff48090) = 0x00003a98;
*(unsigned int *)(0x3ff4808c) = 0xc001f880;
}
}
asm volatile ( d ); // 2
"movi a6, 0x40; slli a6, a6, 24;" // 3
"movi a7, 0x00; slli a7, a7, 16;"
"xor a6, a6, a7;"
"movi a7, 0x7c; slli a7, a7, 8;"
"xor a6, a6, a7;"
"movi a7, 0xf8;"
"xor a6, a6, a7;"
"movi a10, 0x52; callx8 a6;" // R
"movi a10, 0x61; callx8 a6;" // a
"movi a10, 0x65; callx8 a6;" // e
"movi a10, 0x6C; callx8 a6;" // l
"movi a10, 0x69; callx8 a6;" // i
"movi a10, 0x7A; callx8 a6;" // z
"movi a10, 0x65; callx8 a6;" // e
"movi a10, 0x21; callx8 a6;" // !
"movi a10, 0x0a; callx8 a6;" // \n
while(1);
}
ãã®ã³ãŒãã¯ã以äžãå®è£ ããŸãïŒãªã¹ãé ç®çªå·ã¯ã³ã¡ã³ãã§æå®ãããçªå·ã«å¯Ÿå¿ããŸãïŒã
- ãŠã©ããããã°ã¿ã€ããŒããªã»ããããåäžã®ã³ãã³ãã³ãã³ããã³ãã©ãŒã
NOP
æ瀺ã«åºã¥ãã¢ããã°addi
ã- ã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã«æååãåºåããã¢ã»ã³ããªã³ãŒã
Raelize!
ã
âæ»æã®ã¿ã€ãã³ã°ã®éžæ
F
次ã®å³ã«ç€ºãããã«ã
æ¯èŒçå°ããªæ»æãŠã£ã³ããŠãèªç±ã«äœ¿çšã§ããŸããã以åã®å®éšããããã®æç¹ã§ããŒãããŒããŒã³ãŒãããã©ãã·ã¥ã¡ã¢ãªããã³ããŒãããŠããããšãããããŸããã
æ»æãŠã£ã³ããŠã¯Fã§è¡šãããŸã
ãSRAMã³ã³ãã³ãããã©ãã·ã¥ã¡ã¢ãªããã®æ£ããããŒãããŒããŒã³ãŒãã«ãã£ãŠå®å šã«äžæžããããåã«ãé害ãçºçããå¿ èŠããããŸãã
âæ»æãµã€ã¯ã«
åå®éšã§ã¯ãæ»æã®ã¢ã€ãã¢ãæ©èœããããšã確èªããããã«æ¬¡ã®æé ãå®è¡ããŸãããé害ã®æŽçãæåãããšãã·ãªã¢ã«åç·ã€ã³ã¿ãŒãã§ã€ã¹ã«åºåãããã¯ã
Raelize!
ã§ãã
- ãã³ã
G0
ããŒã«èšå®ããã³ãŒã«ãããŒããå®è¡ããŠUARTããŒãããŒããŒã¢ãŒãã«å ¥ããŸãã - ã³ãã³ã
load_ram
ã䜿çšããŠSRAMããæ»æã³ãŒããå®è¡ããŸãã - ããã°ã©ã
A
ãããããªããŒãã«éä¿¡ããéåžžã®ããŒãã¢ãŒãã«æ»ããŸãã - ROMããã®ã³ãŒãã䜿çšããŠãã©ãã·ã¥ã¡ã¢ãªããããŒãããŒããŒãã³ããŒããããã»ã¹ã§ã®é害ã®ç·šæã
âçµæ
ãã®å®éšã1æ¥ä»¥äžè¡ãã100äžå以äžè¡ã£ãŠãããŸã æåããŸããã§ããã
âäºæããªãçµæ
ããããç§ãã¡ãæãããšãéæããããšãã§ããªãã£ããšããäºå®ã«ãããããããç§ãã¡ã¯å®éšã®çµæãåæããŠãäºæããªãäœããçºèŠããŸããã
ããå®éšã§ã¯ãã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãé害ãäŸå€
IllegalInstruction
ïŒç¡å¹ãªåœä»€ïŒããããããããšã瀺ãããŒã¿ãå ±åããŸãããããã¯ãããã©ã®ããã«èŠãããã§ãïŒ
ets Jun 8 2016 00:22:57
rst:0x10 (RTCWDT_RTC_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:0x3fff0008,len:4
load:0x3fff000c,len:3220
load:0x40078000,len:4816
load:0x40080400,len:18640
entry 0x40080740
Fatal exception (0): IllegalInstruction
epc1=0x661b661b, epc2=0x00000000, epc3=0x00000000,
excvaddr=0x00000000, depc=0x00000000
ãããé害ãåŒãèµ·ããããšãããšããããã®äŸå€ãé »ç¹ã«çºçããŸããåãããšãESP32ã«ãåœãŠã¯ãŸããŸãããããã®äŸå€ã®ã»ãšãã©ã§ã¯ãã¬ãžã¹ã¿ã¯
PC
æåŸ
å€ã«èšå®ãããŸãïŒã€ãŸããæ£ããã¢ãã¬ã¹ãããã«ãããŸãïŒããã®PC
ãããªèå³æ·±ãæå³ãçŸããããšã¯ãã£ãã«ãããŸãããã¢ãã¬ã¹ã«æ£ããåœä»€ããªããã
ãäŸå€ã
IllegalInstruction
ã¹ããŒãããŸã0x661b661b
ããã®å€ã¯ã¬ãžã¹ã¿ãŒã®PC
ã©ããããååŸããå¿
èŠããããããèªäœã§ã¯ããã«è¡šç€ºã§ããªããšå€æããŸããã
説æãæ±ããŠãSRAMã«ããŒãããã³ãŒããåæããŸããã以äžã«ã¹ããããã瀺ããã€ããªã³ãŒãã衚瀺ããããšã§ã質åã«å¯Ÿããçãããã°ããèŠã€ããããšãã§ããŸãããã€ãŸããããã§æå³ãèŠã€ããã®ã¯ç°¡åã§ã
0x661b661b
..ãããã¯2ã€ã®åœä»€addi a6, a6, 1
ã§è¡šããããã®å©ããåããŠã¢ããã°ãã³ãŒãã«å®è£
ãããŸãNOP
ã
00000000 e9 02 02 10 28 04 08 40 ee 00 00 00 00 00 00 00 |....(..@........|
00000010 00 00 00 00 00 00 00 01 00 00 ff 3f 0c 00 00 00 |...........?....|
00000020 53 52 41 4d 20 43 4f 44 45 0a 00 00 00 04 08 40 |SRAM CODE......@|
00000030 50 09 00 00 00 00 ff 3f 04 04 fe 3f 4d 04 08 40 |P......?...?M..@|
00000040 00 04 fe 3f 8c 80 f4 3f 90 80 f4 3f 98 3a 00 00 |...?...?...?.:..|
00000050 80 f8 01 c0 54 7d 00 40 d0 92 00 40 36 61 00 a1 |....T}.@...@6a..|
00000060 f5 ff 81 fc ff e0 08 00 0c 08 82 41 00 ad 01 81 |...........A....|
00000070 fa ff e0 08 00 82 01 00 4c 19 97 98 1f 81 ef ff |........L.......|
00000080 91 ee ff 89 09 91 ee ff 89 09 91 f0 ff 81 ee ff |................|
00000090 99 08 91 ef ff 81 eb ff 99 08 86 f2 ff 5c a9 97 |.............\..|
000000a0 98 c5 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 3e 0c |...f.f.f.f.f.f>.|
000000b0 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
000000c0 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
000000d0 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
...
00000330 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
00000340 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
00000350 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
ãããã®åœä»€ã䜿çšããŠãå°å»ã¿ã«åãéšå±ããçšæãã
NOP
å¿
èŠã«ãªããŸã§ã³ãŒãã®å®è¡ãé
ãããããã«ãã³ãã³ãã®ã·ãŒã±ã³ã¹ããšã¯ã¹ããã€ãã§ãã䜿çšãããæ¹æ³ãšåæ§ã®æ¹æ³ã§äœ¿çšããŸããããããã®åœä»€ãã¬ãžã¹ã¿ãŒã«æ ŒçŽããããšã¯äºæ³ããŠããŸããã§ããPC
ã
ãããããã¡ãããç§ãã¡ã¯ããã䜿çšããããšã«å察ããŠããŸããã§ããã
PC
ãã©ãã·ã¥ã¡ã¢ãªããã®ããŒã¿ãROMã³ãŒãã䜿çšããŠã³ããŒããããšãã«çºçããã¯ã©ãã·ã¥æã«ãSRAMããã¬ãžã¹ã¿ã«ããŒã¿ãããŒãã§ãããšå€æããŸããã
ã»ãã¥ã¢ããŒããšãã©ãã·ã¥æå·åã·ã¹ãã ã1åã®ã°ãªããã§ãã€ãã¹ããæ»æãæºåããããã®ãã¹ãŠã®èŠçŽ ãæã£ãããšã«ããã«æ°ä»ããŸãããããã§ã¯ãåè¿°ã®æ»æã®å®è¡äžã«åŸãããçµéšã䜿çšããŸããã¬ãžã¹ã¿ãŒã®å¶åŸ¡ãååŸã§ãããšã
PC
ã
æåãžã®é
ãã®æ»æã§ã¯ãUARTããŒãããŒããŒã䜿çšããŠä»¥åã«SRAMã«ããŒããããã³ãŒãã®ã»ãšãã©ã䜿çšããŸãããã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã«æåãåºåããããã®ã³ãã³ãã®ã¿ããã®ã³ãŒãããåé€ãããŸãããããã¯ãã¬ãžã¹ã¿
PC
ãå¿
èŠãªå€ã«èšå®ããããšãã€ãŸãã·ã¹ãã ãå¶åŸ¡ã§ããããã«ããããšãç®æšã§ãã£ãããã§ãã
#define a "addi a6, a6, 1;"
#define t a a a a a a a a a a
#define h t t t t t t t t t t
#define d h h h h h h h h h h
void __attribute__((noreturn)) call_start_cpu0() {
uint8_t cmd;
ets_printf("SRAM CODE\n");
while (1) {
cmd = 0;
uart_rx_one_char(&cmd);
if(cmd == 'A') {
*(unsigned int *)(0x3ff4808c) = 0x4001f880;
*(unsigned int *)(0x3ff48090) = 0x00003a98;
*(unsigned int *)(0x3ff4808c) = 0xc001f880;
}
}
asm volatile ( d );
while(1);
}
ãã®ã³ãŒããã³ã³ãã€ã«ããåŸããã€ããªããŒãžã§ã³ã§ãåœä»€
addi
ãã¢ãã¬ã¹ã«çœ®ãæããŸãã0x4005a980
ããã®ã¢ãã¬ã¹ã«ã¯ãã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã«ããŒã¿ãåºåããROMå
ã®é¢æ°ããããŸãããã®é¢æ°ã®åŒã³åºããæåãããšãæ»æãæåããããšãããããŸãã
以åã®å®éšã§äŸå€ãåŒãèµ·ãããåå ãšäžèŽããé害ãåŠçããæºåãããŸãã
IllegalInstruction
ããã°ããããŠãPC
æå®ãããã¢ãã¬ã¹ãã¬ãžã¹ã¿ã«ããŒãããããã®ããã€ãã®å®éšãæ£åžžã«å®äºããããšãçºèŠããŸãããã±ãŒã¹ã³ã³ãããŒã«ã¯ãPC
ä»»æã®ã³ãŒããå®è¡ã§ããããšãæå³ããå¯èœæ§ãéåžžã«é«ãã§ãã
âãªããããå¯èœã§ããïŒ
ãã®ã»ã¯ã·ã§ã³ã®ã¿ã€ãã«ã«ã¯ãçããã®ãç°¡åã§ã¯ãªãè¯ã質åãå«ãŸããŠããŸãã
æ®å¿µãªãããæ確ãªçãã¯ãããŸããã確ãã«ãããŒã¿æäœã«ãã£ãŠã¬ãžã¹ã¿å¶åŸ¡ãå¯èœã«ãªããšã¯æã£ãŠããŸããã§ãã
PC
ãããã«ã€ããŠã¯ããã€ãã®èª¬æããããŸããããããã®ãããããçå®ã§ãããšå®å
šã«ç¢ºä¿¡ããããšã¯ã§ããŸããã
1ã€ã®èª¬æã¯ãé害æã«ãåœä»€ã®äž¡æ¹ã®ãªãã©ã³ãã
ldr
å€ãã«ããŒãããããã«äœ¿çšããããšããããša0
ã§ããããã¯ããã®æ»æã§èŠããã®ãšäŒŒãŠãPC
ãŸãããã®æ»æã§ã¯ãããŒã¿ãå€æŽããããšã§ã¬ãžã¹ã¿ãéæ¥çã«å¶åŸ¡ã§ããããã«ãªããŸããã
ããã«ãROMã«æ ŒçŽãããŠããã³ãŒãã«ããã®æ»æã®æåã«å¯äžããæ©èœãå«ãŸããŠããå¯èœæ§ããããŸããã€ãŸããé害ãçºçããããã«ãROMããæ£ããã³ãŒããå®è¡ã§ããŸããããã«ãããSRAMããã®ããŒã¿ãã¬ãžã¹ã¿ã«ããŒããã
PC
ãŸãã
äœããã®æ»æãå®è¡ã§ããããã«ãªã£ãã®ããæ£ç¢ºã«ç¥ãããã«ã¯ãããã«èª¿æ»ãè¡ãå¿ èŠããããŸãããããããããããããã³ã°ããããšã決ãã誰ãã®ç®ãéããŠåé¡ãèŠããšãã¬ãžã¹ã¿ãŒã«åœ±é¿ãäžããå¯èœæ§ã«åºã¥ããŠãšã¯ã¹ããã€ããäœæããã®ã«ååãªç¥èããããŸã
PC
ã
ãã©ãã·ã¥ã¡ã¢ãªã®å 容ããã¬ãŒã³ããã¹ããšããŠæœåºããŸã
PC
å¿
èŠãªãã®ã
ã¬ãžã¹ã¿ã«æžã蟌ãããšã¯ã§ããŸããããã©ãã·ã¥ã¡ã¢ãªã®å
容ããã¬ãŒã³ããã¹ããšããŠååŸããããšã¯ãŸã ã§ããŸããããã®ãããUARTããŒãããŒããŒæ©èœãå©çšããããšã«ããŸããã
ã€ãŸããããããéåžžã®ããŒãã¢ãŒãã®ãšãã«ãUARTããŒãããŒããŒã«çŽæ¥ç§»åããããšã«ããŸããããã®æ»æãå®è¡ããããã«ã
addi
代ããã«UARTããŒãããŒããŒã³ãŒãã®éå§ã¢ãã¬ã¹ïŒ0x40007a19
ïŒã䜿çšããŠãRAMã«ããŒããããã³ãŒãã®åœä»€ãæžãçŽããŸããã
UARTããŒãããŒããŒã¯ã以äžã«ç€ºãè¡ãã·ãªã¢ã«ã€ã³ã¿ãŒãã§ãŒã¹ã«åºåããŸãããã®äºå®ã䜿çšããŠãæ»æã®æåãå€æã§ããŸãã
waiting for download\n"
ãã®å®éšãæåãããããã
esptool.py
ã䜿çšããŠã³ãã³ããå®è¡read_mem
ãããã©ãã·ã¥ã¡ã¢ãªå
ã®ãã¬ãŒã³ããã¹ãããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸããããšãã°ã次ã®ã³ãã³ãã¯ãå€éšãã©ãã·ã¥ã¢ãã¬ã¹ã¹ããŒã¹ïŒ0x3f400000
ïŒãã4ãã€ããèªã¿åããŸãã
esptool.py --no-stub --before no_reset --after no_reset read_mem 0x3f400000
æ®å¿µãªããããã®ãããªã³ãã³ãã¯æ©èœããŸããã§ãããäœããã®çç±ã§ãããã»ããµã®å¿çã¯ã®ãã
0xbad00bad
ã«èŠããŸãããããã¯ãå²ãåœãŠãããŠããªãã¡ã¢ãªããããŒã¿ãèªã¿åãããšããŠããããšã瀺ããŠããŸãã
esptool.py v2.8
Serial port COM8
Connecting....
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Crystal is 40MHz
MAC: 24:6f:28:24:75:08
Enabling default SPI flash mode...
0x3f400000 = 0xbad00bad
Staying in bootloader.
UARTããŒãããŒããŒã®éå§æã«ããªãå€ãã®èšå®ãè¡ãããŠããããšã«æ°ã¥ããŸããããããã®èšå®ã¯MMUã«ã圱é¿ãäžããå¯èœæ§ããããšæ³å®ããŸããã
ä»ã®ããšãè©Šãããã«ãUARTïŒ
0x40007a4e
ïŒããŒãããŒããŒèªäœã®ã³ãã³ããã³ãã©ãŒã«çŽæ¥ç§»åããããšã«ããŸããããã³ãã©ãŒã«å
¥ããšãç¬ç«ããŠã³ãã³ãread_mem
ãã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã«çŽæ¥éä¿¡ã§ããŸãã
target.write(b'\xc0\x00\x0a\x04\x00\x00\x00\x00\x00\x00\x00\x40\x3f\xc0')
æ®å¿µãªããããã³ãã©ãŒã«çŽæ¥ç§»åãããšãUARTããŒãããŒããŒã«å ¥ã£ãåŸã«è¡šç€ºãããè¡ïŒã€ãŸã-
waiting for download\n
ïŒã¯è¡šç€ºãããŸããããã®ãããæåããå®éšãç¹å®ããããã®ç°¡åã§äŸ¿å©ãªæ¹æ³ã倱ãããŸãããã®çµæãæåãããã©ããã«é¢ä¿ãªãããã¹ãŠã®å®éšã§äžèšã®ã³ãã³ããéä¿¡ããããšã«ããŸããããã®ã¿ã€ã ã¢ãŠãã«é¢é£ããè¿œå ã®ã¿ã€ã ã¢ãŠããæå°éã«æããããã«ãéåžžã«çãã·ãªã¢ã«ã¿ã€ã ã¢ãŠãã䜿çšããŸãããããã¯ãã»ãšãã©ã®å Žåã«åœãŠã¯ãŸããŸãã
ãã°ããããŠãæåã®æåããå®éšã®çµæãèŠãŸããïŒ
çµæ
ãã®èšäºã§ã¯ãESP32ãžã®æ»æã«ã€ããŠèª¬æããŸããããã®æ»æã§ã¯ããã©ãã·ã¥ã¡ã¢ãªã®ã»ãã¥ã¢ããŒãããã³æå·åã·ã¹ãã ããã€ãã¹ãããã€ã¯ãããã»ããµã«1ã€ã®é害ã®ã¿ãé 眮ããŸããããã«ãæ»æäžã«æªçšãããè匱æ§ã䜿çšããŠãæå·åããããã©ãã·ã¥ã¡ã¢ãªã®å 容ããã¬ãŒã³ããã¹ãã§æœåºããŸãããFIRM
ã䜿çšããŠããã®æ»æãã¹ãããã¹ã«ãŒã§ããŸãã
æ»æã®é²è¡ç¶æ³
äžèšã®æ»æã®ããŸããŸãªã¹ãããã§äœãèµ·ãããã«ã€ããŠç°¡åã«èª¬æããŸãã
- ã¢ã¯ãã£ãåïŒæ»æãå®è¡ããããã®ããŒã«ã®éžæïŒ-ããã§ã¯ãRiscure InspectorFIã³ã³ãã¬ãã¯ã¹ã䜿çšãããŸãã
- æ³šå ¥ïŒæ»æïŒ-調æ»äžã®ãã€ã¯ãã³ã³ãã¥ãŒã¿ãŒã«å¯ŸããŠé»ç£å¹æãå®è¡ãããŸãã
- Glitch ( ) â , (, , ).
- Fault ( ) â , , , . , - .
- Exploit ( ) â UART , SRAM, . UART
PC
read_mem
. - Goal ( ) â - .
èå³æ·±ãããšã«ããã®æ»æã®æåã¯ãESP32ã®2ã€ã®åŒ±ç¹ã«äŸåããŠããŸããæåã®åŒ±ç¹ã¯ãUARTããŒãããŒããŒãç¡å¹ã«ã§ããªãããšã§ãããã®çµæããã€ã§ãå©çšã§ããŸãã 2çªç®ã®åŒ±ç¹ã¯ãããã€ã¹ã®ããããªã»ããåŸã®SRAMå ã®ããŒã¿ã®æ°žç¶æ§ã§ããããã«ãããUARTããŒãããŒããŒã䜿çšããŠSRAMã«ä»»æã®ããŒã¿ãå ¥åã§ããŸããæ»æã«ã€ããŠèšåããŠ
ããæ å ±ã¬ããŒãã§ãEspressif瀟ã¯ãæ°ããããŒãžã§ã³ã®ESP32ã«ã¯ããã®ãããªæ»æãäžå¯èœã«ããã¡ã«ããºã ããããšå ±åããŠããŸãã
ãã¹ãŠã®æšæºçãªçµã¿èŸŒã¿ã·ã¹ãã ã¯ãããã€ã¹ç Žå£æ»æã«å¯ŸããŠè匱ã§ãããããã£ãŠãESP32ãã€ã¯ãããã»ããµããµã€ããã£ãã«æ»æã«å¯ŸããŠãè匱ã§ããããšã¯é©ãã¹ãããšã§ã¯ãããŸããããã®ãããªãããã¯ããã®ãããªæ»æã«èããããã«èšèšãããŠããŸãããããããéèŠãªããšã«ãããã¯ãã®ãããªæ»æããªã¹ã¯ã䌎ããªãããšãæå³ãããã®ã§ã¯ãããŸããã
ç§ãã¡ã®èª¿æ»ã«ãããšããããã®åŒ±ç¹ãå©çšããããšã§ãæ»æãæ··ä¹±ãæåãããããšãã§ããŸãããªãŒãã³ãœãŒã¹ããåŠã¶ããšãã§ããã»ãšãã©ã®æ»æã¯ããã§ãã¯ã®ãã€ãã¹ã«äž»ãªçŠç¹ãåœãŠãããŠããåŸæ¥ã®ã¢ãããŒãã䜿çšããŠããŸããç§ãã¡ã説æãããããªæ»æã®å ±åã¯ããŸãèŠãããŸããã
ãã®ãããªæ»æã®å¯èœæ§ã«ã€ããŠã¯ããŸã ååã«æ€èšãããŠããªããšç¢ºä¿¡ããŠããŸããæè¿ãŸã§ãã»ãšãã©ã®ç 究è ã¯ãããã®åäœãäžæããæ¹æ³ïŒã¹ãããActivateãInjââectãGlitchïŒã®ã¿ãç 究ããŠããŸããããé害åŸã«è匱ãªããããæäœããå¯èœæ§ïŒã¹ãããFaultãExploitãGoalïŒãèæ ®ããŠãããã«é²ãã§ããŸãã
2020幎ãŸã§ã®ç 究ãš2020幎以éã®ç 究
æ°ãããããé害ã¢ãã«ãåµé çã«äœ¿çšããããšã§ãããŸããŸãªç®æšãéæããããã«èå³æ·±ãè匱æ§æŽ»çšæŠç¥ã䜿çšããæ»ææ¹æ³ãå¢ãããšç¢ºä¿¡ããŠããŸãã
ãã®è³æã§åãäžããããŠãããããã¯ã«èå³ãããå Žåã¯ãããããããããã§ãESP32ã®ç 究ã«ç¹åããä»ã®è³æãã芧ãã ããã
ãã®èšäºã§èª¬æããã®ãšåæ§ã®æ¹æ³ã§ããã€ã¹ããããã³ã°ããããšã«å®éã«ééããããšããããŸããïŒ