간단한 Assembly 문제

현재·2023년 12월 24일

sys

목록 보기
5/9

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

1: mov dl, BYTE PTR[rsi+rcx]

BYTE PTR은 한 바이트 크기의 데이터를 다루는 것이다.

rsi+rcx 의 메모리 주소에서 한 바이트 크기의 데이터를 읽어와서
dl 레지스터에 저장한다

따라서 dl = 0x67

코드 2

2: xor dl, 0x30

dl과 0x30을 xor 해서 dl에 저장한다.

dl = 0x57

코드 3

3: mov BYTE PTR[rsi+rcx], dl

BYTE PTR[rsi+rcx]에 즉 메모리 0x400000의 0x67자리에 dl 값이 저장된다.
따라서
0x400000 | 0x57 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10 이 된다.

코드 4~7

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은 코드의 첫 번째 명령어로 점프한다.


따라서 이 코드는 rcx가 0x19보다 클때까지 실행되는 반복문인 것을 알 수 있다.
[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!가 나온다.

profile
개발자

0개의 댓글