Simple Reverse - 0x14(2023 Lab - AssemblyDev)
Background
Tools
Source code
- arithmatic.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41#!/usr/bin/python from module.checker import * from module.math import * from sys import argv challenge_info = f''' let a = MEM[RSP+0x0:RSP+0x4] let b = MEM[RSP+0x4:RSP+0x8] let c = MEM[RSP+0x8:RSP+0xc] EAX = a + b EBX = a - b ECX = -c EDX = 9*a + 7 ''' a = get_rand(4) b = get_rand(4) c = get_rand(4) init_list = [ (RSP_DEFAULT + 0x0, a, 4), (RSP_DEFAULT + 0x4, b, 4), (RSP_DEFAULT + 0x8, c, 4), ] ans_list = [ ("eax", add(a, b, 4)), ("ebx", sub(a, b, 4)), ("ecx", neg(c, 4)), ("edx", add(mul(a, 9, 4), 7, 4)), ] if __name__ == "__main__": if len(argv) < 2: print(f"{C.BLUE}[+]{C.NC} Usage: python3 {__file__} <path_to_asm_file>") print(challenge_info) exit(0) code = open(argv[1], 'r').read() Checker(init_list, ans_list, code) - data_movement.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55#!/usr/bin/python from module.checker import * from module.math import * from sys import argv challenge_info = f''' {C.BLUE}# Modify register value{C.NC} RAX += 0x87 RBX -= 0x63 RCX, RDX = RDX, RCX {C.BLUE}# Modify memory value{C.NC} MEM[RSP+0x0:RSP+0x4] += 0xdeadbeef MEM[RSP+0x4:RSP+0x8] -= 0xfaceb00c MEM[RSP+0x8:RSP+0xc], MEM[RSP+0xc:RSP+0x10] = MEM[RSP+0xc:RSP+0x10], MEM[RSP+0x8:RSP+0xc] ''' _rax = get_rand() _rbx = get_rand() _rcx = get_rand() _rdx = get_rand() mem = list() for i in range(4): mem.append(get_rand(4)) init_list = [ ("rax", _rax), ("rbx", _rbx), ("rcx", _rcx), ("rdx", _rdx), (RSP_DEFAULT + 0x0, mem[0], 4), (RSP_DEFAULT + 0x4, mem[1], 4), (RSP_DEFAULT + 0x8, mem[2], 4), (RSP_DEFAULT + 0xc, mem[3], 4), ] ans_list = [ ("rax", add(_rax, 0x87)), ("rbx", sub(_rbx, 0x63)), ("rcx", _rdx), ("rdx", _rcx), (RSP_DEFAULT + 0x0, add(mem[0], 0xdeadbeef, 4), 4), (RSP_DEFAULT + 0x4, sub(mem[1], 0xfaceb00c, 4), 4), (RSP_DEFAULT + 0x8, mem[3], 4), (RSP_DEFAULT + 0xc, mem[2], 4), ] if __name__ == "__main__": if len(argv) < 2: print(f"{C.BLUE}[+]{C.NC} Usage: python3 {__file__} <path_to_asm_file>") print(challenge_info) exit(0) code = open(argv[1], 'r').read() Checker(init_list, ans_list, code) - condition.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64#!/usr/bin/python from module.checker import * from module.math import * from sys import argv challenge_info = f''' let a = MEM[RSP+0x0:RSP+0x4] let b = MEM[RSP+0x4:RSP+0x8] let c = MEM[RSP+0x8:RSP+0xc] let d = MEM[RSP+0xc:RSP+0x10] {C.BLUE}# a, b -> signed 4 btyes integer{C.NC} if a >= b: EAX = a else: EAX = b {C.BLUE}# c, d -> unsigned 4 btyes integer{C.NC} if c < d: EBX = c else: EBX = d if c is an odd number: ECX = c // 8 else: ECX = c * 4 ''' a = get_rand(4) b = get_rand(4) c = get_rand(4) d = get_rand(4) init_list = [ (RSP_DEFAULT + 0x0, a, 4), (RSP_DEFAULT + 0x4, b, 4), (RSP_DEFAULT + 0x8, c, 4), (RSP_DEFAULT + 0xc, d, 4), ] a = u2signed(a, 4) b = u2signed(b, 4) _eax = (a if a >= b else b) & mask(4) _ebx = (c if c < d else d) & mask(4) _ecx = div(c, 8, 4) if is_odd(c) else mul(c, 4, 4) ans_list = [ ("eax", _eax), ("ebx", _ebx), ("ecx", _ecx), ] if __name__ == "__main__": if len(argv) < 2: print(f"{C.BLUE}[+]{C.NC} Usage: python3 {__file__} <path_to_asm_file>") print(challenge_info) exit(0) code = open(argv[1], 'r').read() Checker(init_list, ans_list, code)
Recon
這一題有三小題,包含arithmatic.py, data_movement.py, 以及condition.py,過關的條件是要自己寫assembly然後達帶這三個關卡的register或stack條件,我是直接用compiler explorer幫我把c code直接轉assembly然後再利用assembly x86 emulator做double check,速度應該會快很多
Exploit
- 題目一: 就是一般的運算(+-*/)
let a = MEM[RSP+0x0:RSP+0x4] let b = MEM[RSP+0x4:RSP+0x8] let c = MEM[RSP+0x8:RSP+0xc] EAX = a + b EBX = a - b ECX = -c EDX = 9*a + 7- Solution
mov r8d, dword [rsp] ; mov r9d, dword [rsp + 4] ; mov r10d, dword [rsp + 8] ; ; EAX = a + b mov eax, r8d add eax, r9d ; EBX = a - b mov ecx, r8d sub ecx, r9d mov ebx, ecx ; ECX = -c mov ecx, r10d neg ecx ; EDX = 9 * a + 7 mov edx, DWORD [rsp] sal edx, 3 add edx, DWORD [rsp] add edx, 7
- Solution
- 題目二: 這邊是考register和stack之間的搬運和運算
1
2
3
4
5
6
7
8
9# Modify register value RAX += 0x87 RBX -= 0x63 RCX, RDX = RDX, RCX {C.BLUE}# Modify memory value MEM[RSP+0x0:RSP+0x4] += 0xdeadbeef MEM[RSP+0x4:RSP+0x8] -= 0xfaceb00c MEM[RSP+0x8:RSP+0xc], MEM[RSP+0xc:RSP+0x10] = MEM[RSP+0xc:RSP+0x10], MEM[RSP+0x8:RSP+0xc]- Solution
; Modify register value add rax, 0x87 sub rbx, 0x63 mov r8, rcx mov rcx, rdx mov rdx, r8 ; MEM[RSP+0x0:RSP+0x4] += 0xdeadbeef mov r8d, dword [rsp] add r8d, 0xdeadbeef mov dword [rsp], r8d ; MEM[RSP+0x4:RSP+0x8] -= 0xfaceb00c mov r8d, dword [rsp+4] sub r8d, 0xfaceb00c mov dword [rsp+4], r8d ; MEM[RSP+0x8:RSP+0xc], MEM[RSP+0xc:RSP+0x10] = MEM[RSP+0xc:RSP+0x10], MEM[RSP+0x8:RSP+0xc] mov r8d, dword [rsp+8] mov r9d, dword [rsp+0xc] mov dword [rsp+8], r9d mov dword [rsp+0xc], r8d
- Solution
- 題目三: 需要考慮condition,然後看要跳轉到哪邊,重點是jump有分signed和unsigned,而仔細看source code他只有考慮unsinged,所以我們要特別挑選jump的類別
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21let a = MEM[RSP+0x0:RSP+0x4] let b = MEM[RSP+0x4:RSP+0x8] let c = MEM[RSP+0x8:RSP+0xc] let d = MEM[RSP+0xc:RSP+0x10] # a, b -> signed 4 btyes integer if a >= b: EAX = a else: EAX = b # c, d -> unsigned 4 btyes integer{C.NC} if c < d: EBX = c else: EBX = d if c is an odd number: ECX = c // 8 else: ECX = c * 4- Solution
; if a >= b: ; EAX = a ; else: ; EAX = b mov eax, DWORD [rsp] cmp eax, DWORD [rsp+4] jl L2 mov eax, DWORD [rsp] jmp L3 L2: mov eax, DWORD [rsp+4] ; if c < d: ; EBX = c ; else: ; EBX = d L3: mov edi, DWORD [esp+0x8] mov esi, DWORD [esp+0xc] cmp edi, esi jae L4 mov ebx, DWORD [esp+0x8] jmp L5 L4: mov ebx, DWORD [esp+0xc] ; if c is an odd number: ; ECX = c // 8 ; else: ; ECX = c * 4 L5: mov edi, DWORD [esp+0x8] and edi, 1 cmp edi, 1 jne L6 mov ecx, dword [esp+0x8] sar ecx, 3 jmp L7 L6: mov ecx, dword [esp+0x8] sal ecx, 2 L7:
- Solution
1 | |
完整的輸出結果
1 | |
Flag: FLAG{c0d1Ng_1n_a5s3mB1y_i5_sO_fun!}