
코드 분석
- mov dL, BYTE PTR[rsi+rcx]: rsi는 0x400000으로 주어졌으므로, 이 명령어는 rcx 레지스터 값을 기준으로 메모리 주소 0x400000 + rcx에 있는 바이트를 dL에 저장함
- xor dL, 0x30: dL에 저장된 값을 0x30(48)과 XOR 연산하여 변환함
- mov BYTE PTR[rsi+rcx], dL: 변환된 값을 다시 같은 메모리 위치로 저장함
- inc rcx: rcx 값을 1 증가시킴
- cmp rcx, 0x19: rcx 값을 0x19(25)와 비교하여, rcx가 25일 때 종료됨
- 루프를 통해 0x400000부터 0x400019까지의 메모리를 처리함
0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10
0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x55 0x5d
0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c
0x400018 | 0x54 0x11
메모리의 상태
각 메모리 값에 대하여 XOR 0x30 연산을 수행하면 정답이 나옴
0x67 XOR 0x30 = 0x57 ('W')
0x55 XOR 0x30 = 0x65 ('e')
0x5c XOR 0x30 = 0x6c ('l')
0x53 XOR 0x30 = 0x63 ('c')
0x5f XOR 0x30 = 0x6f ('o')
0x5d XOR 0x30 = 0x6d ('m')
0x55 XOR 0x30 = 0x65 ('e')
0x10 XOR 0x30 = 0x20 (' ') (공백 문자)
0x44 XOR 0x30 = 0x74 ('t')
0x5f XOR 0x30 = 0x6f ('o')
0x10 XOR 0x30 = 0x20 (' ') (공백 문자)
0x51 XOR 0x30 = 0x61 ('a')
0x43 XOR 0x30 = 0x73 ('s')
0x55 XOR 0x30 = 0x65 ('e')
0x5d XOR 0x30 = 0x6d ('m')
0x52 XOR 0x30 = 0x62 ('b')
0x5c XOR 0x30 = 0x6c ('l')
0x49 XOR 0x30 = 0x79 ('y')
0x10 XOR 0x30 = 0x20 (' ') (공백 문자)
0x47 XOR 0x30 = 0x77 ('w')
0x5f XOR 0x30 = 0x6f ('o')
0x42 XOR 0x30 = 0x72 ('r')
0x5c XOR 0x30 = 0x6c ('l')0x54 XOR 0x30 = 0x64 ('d')
0x11 XOR 0x30 = 0x21 ('!')
정답은 "Welcome to assembly world!"
