end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면?
[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
1: mov dl, BYTE PTR[rsi+rcx]
BYTE PTR은 한 바이트 크기의 데이터를 다루는 것이다.
rsi+rcx 의 메모리 주소에서 한 바이트 크기의 데이터를 읽어와서
dl 레지스터에 저장한다
따라서 dl = 0x67
2: xor dl, 0x30
dl과 0x30을 xor 해서 dl에 저장한다.
dl = 0x57
3: mov BYTE PTR[rsi+rcx], dl
BYTE PTR[rsi+rcx]에 즉 메모리 0x400000의 0x67자리에 dl 값이 저장된다.
따라서
0x400000 | 0x57 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10 이 된다.
4: inc rcx
5: cmp rcx, 0x19
6: jg end
7: jmp 1
rcx = rcx + 1하고
rcx와 0x19를 비교한다.
jg는 "jump if greater"의 약자로서, rcx가 0x19보다 큰 경우에 end로 이동합니다.
지금은 작으니 코드 7로 간다.
jmp 1: 여기서 1은 어떠한 주소나 레이블을 나타낸다. 따라서 jmp 1은 코드의 첫 번째 명령어로 점프한다.
[Memory]
0x400000 | 0x57 0x65 0x6c 0x63 0x6f 0x6d 0x65 0x20
0x400008 | 0x74 0x6f 0x20 0x61 0x73 0x73 0x75 0x6d
0x400010 | 0x72 0x6c 0x79 0x20 0x77 0x4f 0x72 0x6c
0x400018 | 0x64 0x21 0x30 0x30 0x30 0x30 0x30 0x30
메모리는 이렇게 바뀌고
이 값들을 아스키 문자로 변환한다면
Welcome to assembly world!가 나온다.