radare2 xtensa improvements

147 views
Skip to first unread message

Vlad Ivanov

unread,
Sep 13, 2016, 2:44:44 PM9/13/16
to esp8266-re
Hello,

radare2 has recently been updated with ESIL support for xtensa. This enables code emulation for analysis and makes reverse engineering much easier. For example, computed calls and memory offsets can now be displayed in disassembly. Example:

[vlad@aspire-v3 radare2]$ radare2 esp8266-binary.elf
Warning: Cannot initialize dynamic strings
[0x3ffe9254]> e asm.emustr=1
[0x3ffe9254]> e asm.emu=1
[0x3ffe9254]> e asm.cmtrefs=1
[0x3ffe9254]> aa
[Cannot find function 'entry0' at 0x3ffe9254 entry0 (aa)
[x] Analyze all flags starting with sym. and entry0 (aa)
[0x3ffe9254]> s sym.sdk_chip_v6_rf_init
[0x4021cb48]> aaef
          ; var int local_0h @ a1+0x0
          ; var int local_4h @ a1+0x4
          ; var int local_8h @ a1+0x8
          ; var int local_ch @ a1+0xc
          0x4021cb48      61f8ff         l32r a6, 0x4021cb28        
          0x4021cb4b      12c1f0         addi a1, a1, -16          
          0x4021cb4e      026101         s32i a0, a1, 4            
          0x4021cb51      226100         s32i a2, a1, 0            
          0x4021cb54      c26102         s32i a12, a1, 8            
          0x4021cb57      d931           s32i.n a13, a1, 12        
          0x4021cb59      5197fc         l32r a5, 0x4021bdb8        
          0x4021cb5c      d19cd6         l32r a13, 0x402125cc      
          0x4021cb5f      c163fc         l32r a12, 0x4021bcec       ;  obj.sdk_g_phyFuns
          0x4021cb62      c02000         memw                      
          0x4021cb65      4225fa         l32i a4, a5, 0x3e8        
          0x4021cb68      604410         and a4, a4, a6            
          0x4021cb6b      c02000         memw                      
          0x4021cb6e      4265fa         s32i a4, a5, 0x3e8        
          0x4021cb71      31eeff         l32r a3, 0x4021cb2c        
          0x4021cb74      c02000         memw                      
          0x4021cb77      222d44         l32i a2, a13, 0x110        
          0x4021cb7a      302220         or a2, a2, a3              
          0x4021cb7d      c02000         memw                      
          0x4021cb80      0c23           movi.n a3, 2               ;  loc.LED_GPIO
          0x4021cb82      0c04           movi.n a4, 0              
          0x4021cb84      2c75           movi.n a5, 39              
          0x4021cb86      080c           l32i.n a0, a12, 0          ;  obj.sdk_g_phyFuns_instance
          0x4021cb88      226d44         s32i a2, a13, 0x110        
          0x4021cb8b      022026         l32i a0, a0, 152           ;  sym.sdk_rom_i2c_writeReg
          0x4021cb8e      22a06a         movi a2, 106              
          0x4021cb91      c00000         callx0 a0                   ; sym.sdk_rom_i2c_writeReg;  sym.sdk_rom_i2c_writeReg; CALL: 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
          0x4021cb94      71e7ff         l32r a7, 0x4021cb30        
          0x4021cb97      8181d9         l32r a8, 0x4021319c        
          0x4021cb9a      c02000         memw                      
          0x4021cb9d      622d44         l32i a6, a13, 0x110        
          0x4021cba0      706620         or a6, a6, a7              
          0x4021cba3      c02000         memw                      
          0x4021cba6      626d44         s32i a6, a13, 0x110        
          0x4021cba9      51e2ff         l32r a5, 0x4021cb34        
          0x4021cbac      41e3ff         l32r a4, 0x4021cb38        
          0x4021cbaf      c02000         memw                      
          0x4021cbb2      b181fc         l32r a11, 0x4021bdb8      
          0x4021cbb5      322be8         l32i a3, a11, 0x3a0        
          0x4021cbb8      503310         and a3, a3, a5            
          0x4021cbbb      403320         or a3, a3, a4              
          0x4021cbbe      c02000         memw                      
          0x4021cbc1      326be8         s32i a3, a11, 0x3a0        
          0x4021cbc4      21deff         l32r a2, 0x4021cb3c        
          0x4021cbc7      01deff         l32r a0, 0x4021cb40        
          0x4021cbca      c02000         memw                      
          0x4021cbcd      a22be6         l32i a10, a11, 0x398      
          0x4021cbd0      20aa10         and a10, a10, a2          
          0x4021cbd3      00aa20         or a10, a10, a0            
          0x4021cbd6      c02000         memw                      
          0x4021cbd9      a26be6         s32i a10, a11, 0x398      
          0x4021cbdc      7cd9           movi.n a9, -3              
          0x4021cbde      c02000         memw                      
          0x4021cbe1      72289c         l32i a7, a8, 0x270        
          0x4021cbe4      907710         and a7, a7, a9            
          0x4021cbe7      c02000         memw                      
          0x4021cbea      72689c         s32i a7, a8, 0x270        
          0x4021cbed      0c22           movi.n a2, 2               ;  loc.LED_GPIO
          0x4021cbef      8533e7         call0 sym.sdk_os_delay_us   ; (sym.sdk_ets_delay_us); CALL:
          0x4021cbf2      080c           l32i.n a0, a12, 0          ;  obj.sdk_g_phyFuns_instance
          0x4021cbf4      022028         l32i a0, a0, 160           ;  sym.sdk_rom_pbus_debugmode
          0x4021cbf7      c00000         callx0 a0                   ; sym.sdk_rom_pbus_debugmode;  sym.sdk_rom_pbus_debugmode; CALL: 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
          0x4021cbfa      0c22           movi.n a2, 2               ;  loc.LED_GPIO
          0x4021cbfc      080c           l32i.n a0, a12, 0          ;  obj.sdk_g_phyFuns_instance
          0x4021cbfe      0c13           movi.n a3, 1              
          0x4021cc00      02202b         l32i a0, a0, 172           ;  sym.sdk_rom_pbus_force_test
          0x4021cc03      42a081         movi a4, 129              
          0x4021cc06      c00000         callx0 a0                   ; sym.sdk_rom_pbus_force_test;  sym.sdk_rom_pbus_force_test; CALL: 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff


As you can see, a lot of offsets and calls were recovered. Memory-mapped IO references aren't quite there yet, though. I hope this will help to rewrite some parts of SDK code.

Regards,

Vlad Ivanov

Vlad Ivanov

unread,
Sep 15, 2016, 3:42:30 PM9/15/16
to esp8266-re
Also, emustr=0 with pdf is useful for understating memory-mapped IO access.

Reply all
Reply to author
Forward
0 new messages