[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
end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료되었을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가?
- dl에 rsi+rcx가 가리키는 문자열을 1바이트만큼 대입
- rsi+rcx = 0x400000 → 0x67
- dl과 0x30 xor 연산
- 01100111, 00110000 xor → 01010111 → 0x57
- dl을 원 위치(rsi+rcx가 가리키는)에 다시 대입
- rcx+=1
- 0x19와 rcx를 비교하여
- 전자가 더 크면 end로 점프(즉, rcx가 0x19가 될 때까지 계속 반복)
- 아니라면 1로 점프
이를 무한 반복하면
57 65 6C 63 6F 6D 65 20 74 6F 20 61 73 73 65 6D 62 6C 79 20 77 6F 72 6C 64 21
이를 아스키 코드로 변환하면
Welcome to assembly world!