Q. end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가?
; 1번 과정
[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]
; rsi+rcx = 0x400000 의 주소를 가지는 메모리의 값을 dl에 저장.
; BYTE 타입이므로 dl에 1byte 만큼인 0x67이 저장됨
2: xor dl, 0x30
; 두 값을 xor 연산한 결과인 0x57이 dl에 저장.
3: mov BYTE PTR[rsi+rcx], dl
; rsi+rcx = 0x400000 의 주소를 가지는 메모리 공간에 dl의 값을 저장
4: inc rcx
; rcx의 값이 1 증가한 1이됨
5: cmp rcx, 0x19
; 0x01과 0x19는 다르므로 ZF = 0
6: jg end
; 0x01 < 0x19 이므로 점프하지 못함.
7: jmp 1
; 2번 과정
[Register]
rcx = 0x01
rdx = 0
rsi = 0x400000
=======================
[Memory]
0x400000 | 0x57 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]
; rsi+rcx = 0x400001 의 주소를 가지는 메모리의 값을 dl에 저장.
; BYTE 타입이므로 dl에 1byte 만큼인 0x55이 저장됨
2: xor dl, 0x30
; 두 값을 xor 연산한 결과인 0x65이 dl에 저장.
3: mov BYTE PTR[rsi+rcx], dl
; rsi+rcx = 0x400001 의 주소를 가지는 메모리 공간에 dl의 값을 저장
4: inc rcx
; rcx의 값이 1 증가한 2가됨
5: cmp rcx, 0x19
; 0x02과 0x19는 다르므로 ZF = 0
6: jg end
; 0x02 < 0x19 이므로 점프하지 못함.
7: jmp 1
여기에서 같은 과정을 18번 반복하여 모든 값을 한번씩 바꾼다는 것을 눈치 챘고, 1씩 업데이트 되는 rcx에 따라 메모리의 주소를 +1 씩 하며, 그 자리에 위치한 값을 30과 xor 한 결과로 바꾸어주면 된다는 것을 알아서 바로 결과를 계산할수 있었다.
; 최종 결과
[Register]
rcx = 0x19
rdx = 0
rsi = 0x400000
=======================
[Memory]
0x400000 | 0x57 0x65 0x6c 0x63 0x6f 0x6d 0x65 0x20
0x400008 | 0x74 0x6f 0x20 0x61 0x73 0x73 0x65 0x6d
0x400010 | 0x62 0x6c 0x79 0x20 0x77 0x6f 0x72 0x6c
0x400018 | 0x64 0x21 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
; rcx = 0x1a 가 되면 위식의 결과가 ZF = 1
6: jg end
7: jmp 1
문제를 푸는 과정에서, jg를 jmp로 착각해서 조건 없이 만나면 무조건 점프를 하는 것으로 해석하는 바람에 문제를 푸는데 시간이 많이 소요됐다..ㅜㅜ
또한 이 문제를 풀면서 가장 헷갈렸던 부분이 메모리 구조에서 0x 가 나올때마다 주소가 +1 된다는 것이었다.
(ex. 0x400000이 존재하는 줄에서 처음에 주어진 메모리 내용기준으로 0x55는 0x400001)
앞으로 메모리가 저렇게 표기되면 어떻게 해석해야 하는지 배우게 된 문제인 것 같다..!!