Simple Reverse - 0x14(2023 Lab - AssemblyDev)
Background
Tools Assembly x86 Emulator Compiler Explorer
Source code
:::spoiler arithmatic.py
1 |
|
::: :::spoiler data_movement.py
1 |
|
::: :::spoiler condition.py
1 |
|
:::
Recon
這一題有三小題,包含arithmatic.py
, data_movement.py
, 以及condition.py
,過關的條件是要自己寫assembly然後達帶這三個關卡的register或stack條件,我是直接用compiler explorer幫我把c code直接轉assembly然後再利用assembly x86 emulator做double check,速度應該會快很多
Exploit
- 題目一: 就是一般的運算(+-*/)
1
2
3
4
5
6
7
8let 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
:::spoiler 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
:::
- 題目二: 這邊是考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]
:::spoiler 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
:::
- 題目三: 需要考慮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
:::spoiler 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:
:::
1 |
|
:::spoiler 完整的輸出結果
1 |
|
:::
Flag: FLAG{c0d1Ng_1n_a5s3mB1y_i5_sO_fun!}