[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까지의 데이터를 대응되는 아스키 문자로 변환하면?
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과 0x19값을 비교하여 (코드5번)
전자가 더크면 end로 점프(코드6번),
문제에서 end로 점프시 프로그램이 종료된다고 했으므로 전자가 더크면 프로그램 종료
그러나 전자가 더 크지 않을경우 코드 마저 진행. 7번 코드로 인해 다시 코드 1번으로 분기
조건을 충족시키지 못할경우 7번 코드로 인해 다시 1번부터 실행되므로 조건을 만족시킬때까지 반복되는 코드이다.
그리고 4번 코드로 인해 rcx값은 계속 올라가며 0x19는 10진수 25이므로 rcx값이 25가 될때까지 해당 코드 반복실행
0x400000 = 0x57
0x400001 = 0x55를 0x30과 xor연산한 값...
0x400002 = 0x5c와 0x30을 xor연산한 값...
.
.
.