[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!
'DreamHack: System Hacking > F Stage 2' 카테고리의 다른 글
Quiz: x86 Assembly 2 (0) | 2023.03.31 |
---|---|
Background: x86 Assembly Essential Part(2) 스택, 프로시저, 시스템 콜 (0) | 2023.03.31 |
Background: x86 Assembly Essential Part(1) 어셈블리 명령어 (0) | 2023.03.31 |
Quiz: Linux Memory Layout (0) | 2023.03.31 |
Background: Linux Memory Layout (0) | 2023.03.31 |