0

XCTF华为鸿蒙专场 HARMOFS01

 2 years ago
source link: https://xuanxuanblingbling.github.io/ctf/pwn/2020/12/30/harmony/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

XCTF华为鸿蒙专场 HARMOFS01

发表于 2020-12-30

| 分类于 CTF/Pwn

  • 解包工具:jefferson
  • 解包用法:jefferson rootfs.img -d ./xxx
  • 固件打包: mkfs.jffs2 -d ./xxx -o rootfs.img

尝试修改出一个可以进入shell然后执行题目的固件,主要是修改了/etc/init.cfg。故尝试使用这种方式上传一个静态编译的gdbserver企图进行用户态的gdb调试,但启动时失败,提如下:

OHOS # ./gdbserver
OHOS # [ERR]OsDoMmapFile 427, Failed to map a valid addr
[ERR]OsLoadELFSegment[947]
execve: Out of memory

接下来使用修改的后的固件进行说明:

进入系统之后可以使用telnet on命令开启telnet,使用提供带网络的配置启动qemu,官方手册,鸿蒙的ip地址为192.168.1.10:

OHOS # telnet on
'start telnet server successfully, waiting for connection.

然后在宿主机上telnet即可

➜  telnet 192.168.1.10
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.

OHOS # 

这样即可以一个窗口启动目标程序,一个窗口有shell进行操作

鸿蒙做了用户态和内核态的隔离,故也做了用户空间地址的隔离,可以在shell中使用vmm命令来看到程序的虚拟地址布局,首先启动目标程序:

OHOS # cd /bin
OHOS # ./harmofs
OHOS # Loading..........
Gift: 0x1ff06eb8
Gift: 0x26812d8

然后在另一个窗口中使用vmm命令即可看到程序的内存布局,可以看到跟漏洞程序打印的内存布局是相同的,main函数地址和libc的puts函数地址:

OHOS # vmm

 PID    aspace     name       base       size     pages 
 ----   ------     ----       ----       -----     ----
 10   0x403e674c harmofs    0x01000000 0x3e000000     180

	 region      name                base       size       mmu_flags      pages   pg/ref
	 ------      ----                ----       ----       ---------      -----   -----
	 0x403e6220  /bin/harmofs                     0x02680000 0x00001000  CH US RD          1       1
	 0x403e6908  /bin/harmofs                     0x02681000 0x00001000  CH US RD EX       1       1
	 0x403e310c  /bin/harmofs                     0x02682000 0x00001000  CH US RD          1       1
	 0x403e5a30                                   0x02683000 0x00001000  CH US RD WR       1       1
	 0x403fd42c  HEAP                             0x10280000 0x00020000  CH US RD WR      32      32
	 0x403ed494  /lib/libc.so                     0x1fe80000 0x00045000  CH US RD         23       5
	 0x403e3228  /lib/libc.so                     0x1fec5000 0x0005e000  CH US RD EX      38       8
	 0x403e3278  /lib/libc.so                     0x1ff23000 0x00001000  CH US RD WR       1       1
	 0x403e32c8                                   0x1ff24000 0x00001000  CH US RD WR       1       1
	 0x403e3318  MMAP                             0x1ff25000 0x00004000  CH US RD WR       4       4
	 0x403e3368  VDSO                             0x1ff29000 0x00002000  CH US RD EX       2       2
	 0x403d0804  /lib/libc++.so                   0x1ff2b000 0x00045000  CH US RD         49      10
	 0x403d0878  /lib/libc++.so                   0x1ff70000 0x00098000  CH US RD EX      18       4
	 0x403e6060  /lib/libc++.so                   0x20008000 0x00005000  CH US RD          5       5
	 0x403e60b0  /lib/libc++.so                   0x2000d000 0x00001000  CH US RD WR       1       1
	 0x403e6100  MMAP                             0x2000e000 0x00001000  CH US RD WR       1       1
	 0x403e33b8  MMAP                             0x3e880000 0x000ff000  CH US RD WR       0       0
	 0x40325a7c  STACK                            0x3e97f000 0x00001000  CH US RD WR       1       1

估计用户态gdbserver是没戏了,目前看来只能qemu-system级别调试,修改start_qemu.sh,在启动qemu时加入-S -s参数

sudo ./qemu-system-arm -S -s  -M hi3518  -kernel liteos.bin -nographic -net nic,vlan=0 -net tap,vlan=0,ifname=tap100

然后启动后qemu会卡住,本质是开了本机的tcp:1234等待gdb调试器连入,然后在开一个窗口,启动gdb-multiarch,设置如下指令即可进入调试:

➜  gdb-multiarch 
pwndbg> set architecture arm
The target architecture is assumed to be arm
pwndbg> set endian little 
The target is assumed to be little endian
pwndbg> target remote :1234

断在入口:

───────────────────────────────────[ DISASM ]───────────────────────────────────
 ► 0x40000000    b      #0x40000020
    ↓
   0x40000020    mrc    p15, #0, r0, c1, c0, #0
   0x40000024    bic    r0, r0, #0x1000
   0x40000028    bic    r0, r0, #5
   0x4000002c    mcr    p15, #0, r0, c1, c0, #0
   0x40000030    add    fp, pc, #0x338
   0x40000034    ldr    r0, [fp]
   0x40000038    sub    fp, fp, r0
   0x4000003c    sub    r4, pc, #0x44
   0x40000040    mov    r5, #0x40000000
   0x40000044    subs   ip, r4, r5
───────────────────────────────────[ STACK ]────────────────────────────────────
00:0000│ r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 sp  0 ◂— 0
... ↓
─────────────────────────────────[ BACKTRACE ]──────────────────────────────────
 ► f 0 40000000
────────────────────────────────────────────────────────────────────────────────
pwndbg> 

c继续执行,等待qemu起来,然后开telnet,在开一个窗口连进去。于是现在有三个窗口,俩shell,一个gdb。所以

  • 一个shell窗口起程序
  • 一个shell看vmm
  • gdb窗口control+c即可把程序打断

等待程序输出后:

OHOS # ./harmofs
OHOS # Loading..........
Gift: 0x2480feb8
Gift: 0x6f8a2d8

即可根据程序输出或者vmm结果对程序进行断点调试,比如我要断到每次打印提示符的时候:

.text:0000143C F3 00 00 EB                 BL              printf

此时基址是vmm结果:

 PID    aspace     name       base       size     pages 
 ----   ------     ----       ----       -----     ----
 10   0x403ee528 harmofs    0x01000000 0x3e000000     178

	 region      name                base       size       mmu_flags      pages   pg/ref
	 ------      ----                ----       ----       ---------      -----   -----
	 0x403ed39c  /bin/harmofs                     0x06f89000 0x00001000  CH US RD          1       1
	 0x403ed3ec  /bin/harmofs                     0x06f8a000 0x00001000  CH US RD EX       1       1
	 0x403ed43c  /bin/harmofs                     0x06f8b000 0x00001000  CH US RD          1       1
	 0x403dba18                                   0x06f8c000 0x00001000  CH US RD WR       1       1

即可打断,先control+c,然后设置断点:

pwndbg> b * 0x06f89000+0x0000143C
Breakpoint 2 at 0x6f8a43c
pwndbg> c

然后在程序窗口按回车即可断到:

Breakpoint 2, 0x06f8a43c in ?? ()
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
─────────────────────────────────[ REGISTERS ]──────────────────────────────────
 R0   0x6f8972a ◂— mcrlo  p8, #1, r6, c0, c3, #2 /* 0x3e206853; 'Sh > ' */
 R1   0x763a65c
 R2   0xe
 R3   0x0
 R4   0x6f8971e —▸ 0x74666947 ◂— 0
 R5   0x3a07699c —▸ 0x3a07680a ◂— 0x52483
 R6   0x6f8a2d8 ◂— push   {r4, r5, fp, lr} /* 0xe92d4830 */
 R7   0x6f89757 —▸ 0x63756f74 ◂— 0
 R8   0x3a076f44 —▸ 0x3a076fec —▸ 0x6d726168 ◂— 0
 R9   0x6f8c030 ◂— 0
 R10  0x6f8972a ◂— mcrlo  p8, #1, r6, c0, c3, #2 /* 0x3e206853; 'Sh > ' */
 R11  0x3a076da8 ◂— 0x0
 R12  0x3a076828 ◂— 0xe
 SP   0x3a076998 ◂— 0x0
 PC   0x6f8a43c ◂— bl     #0x6f8a810 /* 0xeb0000f3 */
───────────────────────────────────[ DISASM ]───────────────────────────────────
 ► 0x6f8a43c    bl     #0x6f8a810
 
   0x6f8a440    mov    r0, r5
   0x6f8a444    mov    r1, #0
   0x6f8a448    mov    r2, #0x10
   0x6f8a44c    bl     #0x6f8a850
 
   0x6f8a450    mov    r0, #0
   0x6f8a454    mov    r1, r5
   0x6f8a458    mov    r2, #0xf
   0x6f8a45c    bl     #0x6f8a830
 
   0x6f8a460    mov    r0, r5
   0x6f8a464    mov    r1, r7
───────────────────────────────────[ STACK ]────────────────────────────────────
00:0000│ sp  0x3a076998 ◂— 0x0
01:0004│ r5  0x3a07699c —▸ 0x3a07680a ◂— 0x52483
02:0008│     0x3a0769a0 ◂— 0x5
03:000c│     0x3a0769a4 ◂— 0x0
... ↓
05:0014│     0x3a0769ac —▸ 0x24917e90 —▸ 0x2482d880 ◂— 0
06:0018│     0x3a0769b0 —▸ 0x2482c8c0 —▸ 0x2482d990 ◂— 0
07:001c│     0x3a0769b4 —▸ 0x2482cc40 —▸ 0x2482d950 ◂— 0
─────────────────────────────────[ BACKTRACE ]──────────────────────────────────
 ► f 0  6f8a43c
────────────────────────────────────────────────────────────────────────────────
Breakpoint * 0x06f89000+0x0000143C
pwndbg> 

在000015EC地址处,有一段switch,patch后如下:

.text:000015EC 03 00 51 E3                 CMP             R1, #3
.text:000015F0 0A 00 00 8A                 BHI             loc_1620
.text:000015F4 33 00 00 0A                 BEQ             loc_16C8 ; Keypatch modified this from:
.text:000015F4                                                     ;   ADR R0, byte_1600
.text:000015F8 00 00 51 E3                 CMP             R1, #0  ; Keypatch modified this from:
.text:000015F8                                                     ;   LDR R1, [R0,R1,LSL#2]
.text:000015FC 03 00 00 0A                 BEQ             loc_1610 ; Keypatch modified this from:
.text:000015FC                                                     ;   ADD PC, R0, R1
.text:000015FC                                                     ; Keypatch modified this from:
.text:000015FC                                                     ;   BEQ dword_160
.text:00001600 01 00 51 E3                 CMP             R1, #1  ; Keypatch modified this from:
.text:00001600                                                     ;   DCB 0x10
.text:00001600                                                     ;   DCB 0, 0, 0
.text:00001604 16 00 00 0A                 BEQ             loc_1664 ; Keypatch modified this from:
.text:00001604                                                     ;   DCB 0x64
.text:00001604                                                     ;   DCB 0, 0, 0
.text:00001608 02 00 51 E3                 CMP             R1, #2  ; Keypatch modified this from:
.text:00001608                                                     ;   DCB 0x74
.text:00001608                                                     ;   DCB 0, 0, 0
.text:0000160C 18 00 00 0A                 BEQ             loc_1674 ; Keypatch modified this from:
.text:0000160C                                                     ;   DCB 0xC8
.text:0000160C                                                     ;   DCB 0, 0, 0
.text:00001610
.text:00001610             loc_1610                                ; CODE XREF: main+324↑j

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK