Dreamhack x86 Assembly 강의를 듣고 푼 Quiz를 정리하였습니다.
# Quiz
# 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Register]
rcx = 0
rdx = 0
rsi = 0x400000
=======================
[Memory]
0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10
0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d
0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c
0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00
=======================
[code]
1: mov dl, BYTE PTR[rsi+rcx]
2: xor dl, 0x30
3: mov BYTE PTR[rsi+rcx], dl
4: inc rcx
5: cmp rcx, 0x19
6: jg end
7: jmp 1
📌code 1 :
rsi + rcx
의 주소를 참조한 값을dl
레지스터에 복사dl : RDX(Extended Data Register), DX(Data Register)의 하위 8bit 레지스터
Result :
dl = 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10
📌code 3 :
dl
레지스터 값을rsi + rcx
주소 참조 값에 복사Result :
0x400000 <= 0x57 0x65 0x6C 0x63 0x6F 0x6D 0x65 0x20
📌code 4 :
rcx
값 1 증가Result :
rcx = 0x1
- 📌code 5 :
rcx
값과0x19
크기 비교
📌code 6 :
rcx
값이0x19
보다 크면 end로 jumpResult :
0x1 > 0x19
(False)
- 📌code 7 : 1로 jump
미루어 보아, rcx
는 1씩 증가하고 rsi + rcx
는0x400000
부터 0x400019
까지 접근하며 xor 연산을 할 것이다. 따라서 네 메모리 공간에 모두 xor 연산을 한 결과를 ASCII로 변환하면 원하는 문자열을 얻어낼 수 있을 것이다!
Result
0x400000
~ 0x400019
=> Convert Hex to ASCII using Online tool
1
2
3
4
5
6
7
8
9
10
11
[Before Memory]
0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10 : gU\S_]U
0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d : D_QCCU]
0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c : R\IG_B\
0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00 : T
[After Memory]
0x400000 | 0x57 0x65 0x6C 0x63 0x6F 0x6D 0x65 0x20 : Welcome
0x400008 | 0x74 0x6F 0x20 0x61 0x73 0x73 0x65 0x6D : to assem
0x400010 | 0x62 0x6C 0x79 0x20 0x77 0x6F 0x72 0x6C : bly worl
0x400018 | 0x64 0x21 0x30 0x30 0x30 0x30 0x30 0x30 : d!000000