본문 바로가기

DreamHack: System Hacking/F Stage 2

Quiz: x86 Assembly 1

문제: 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

 

*풀이

1st loop(rcx==0):


1번 코드 실행 시, dl에 'rsi+rcx'==0x400000 주소에 있는 데이터값인 0x67이 들어가게 된다
2번 코드 실행 시, dl에 들어있는 값인 0x67과 0x30을 xor 한 값인 0x57(87)이 dl에 저장된다
3번 코드 실행 시, 'rsi+rcx'==0x400000 주소에 있는 데이터값이 0x57로 바뀐다
4번 코드 실행 시, rcx==1로 바뀌고
5번 코드 실행 시, rcx(1)<0x19(25)이므로 jg end는 실행되지 않고
7번 코드가 실행 돼, 1번 코드로 돌아가게된다

2nd loop(rcx==1):
0x55와 0x30을 xor한 값이 0x400001에 저장된다.

 

loop를 계속 진행하게 되면 rcx == 0x20이 되는 순간 loop는 종료되고
loop의 실행 결과로 저장되는 데이터는 0x400000~0x400019까지만 데이터가 저장되며, 저장되는 데이터는 다음과 같다, (괄호 속 숫자는 십진수이다)

0x400000 | 0x67(103).. 0x55(85).. 0x5c(92).. 0x53(83).. 0x5f(95).. 0x5d(93).. 0x55(85).. 0x10(16)..
0x400008 | 0x44(68).. 0x5f(95).. 0x10(16).. 0x51(81).. 0x43(67).. 0x43(67).. 0x55(85).. 0x5d(93)..
0x400010 | 0x52(82).. 0x5c(92).. 0x49(73).. 0x10(16).. 0x47(71).. 0x5f(95).. 0x42(66).. 0x5c(92)
0x400018 | 0x54(84) 0x11(17)


이후 반복하면 0x19(25)까지 0x30(48)과 xor 결과는 다음과 같다(10진수)

87, 101, 108, 99, 111, 109, 101, 32
116, 111, 32, 97, 115, 115, 101, 109
98, 108, 121, 32, 119, 111, 114, 108
100, 33

이를 ASCII 코드표에 대입시켜보면 다음과 같은 문구가 나타난다
Welcome to assembly world!