[Dreamhack - System Hacking] STAGE 2 : x86 Assembly 1 Quiz

eunee22·2023년 7월 1일

Dreamhack/SystemHacking

목록 보기
6/12

Q. end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가?

; 1번 과정

[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]
; rsi+rcx = 0x400000 의 주소를 가지는 메모리의 값을 dl에 저장.
; BYTE 타입이므로 dl에 1byte 만큼인 0x67이 저장됨
2: xor dl, 0x30
; 두 값을 xor 연산한 결과인 0x57이 dl에 저장.
3: mov BYTE PTR[rsi+rcx], dl
; rsi+rcx = 0x400000 의 주소를 가지는 메모리 공간에 dl의 값을 저장
4: inc rcx
; rcx의 값이 1 증가한 1이됨
5: cmp rcx, 0x19
; 0x01과 0x19는 다르므로 ZF = 0
6: jg end
; 0x01 < 0x19 이므로 점프하지 못함.
7: jmp 1
; 2번 과정

[Register]
rcx = 0x01
rdx = 0
rsi = 0x400000
=======================
[Memory]
0x400000 | 0x57 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]
; rsi+rcx = 0x400001 의 주소를 가지는 메모리의 값을 dl에 저장.
; BYTE 타입이므로 dl에 1byte 만큼인 0x55이 저장됨
2: xor dl, 0x30
; 두 값을 xor 연산한 결과인 0x65이 dl에 저장.
3: mov BYTE PTR[rsi+rcx], dl
; rsi+rcx = 0x400001 의 주소를 가지는 메모리 공간에 dl의 값을 저장
4: inc rcx
; rcx의 값이 1 증가한 2가됨
5: cmp rcx, 0x19
; 0x02과 0x19는 다르므로 ZF = 0
6: jg end
; 0x02 < 0x19 이므로 점프하지 못함.
7: jmp 1

여기에서 같은 과정을 18번 반복하여 모든 값을 한번씩 바꾼다는 것을 눈치 챘고, 1씩 업데이트 되는 rcx에 따라 메모리의 주소를 +1 씩 하며, 그 자리에 위치한 값을 30과 xor 한 결과로 바꾸어주면 된다는 것을 알아서 바로 결과를 계산할수 있었다.

; 최종 결과

[Register]
rcx = 0x19
rdx = 0
rsi = 0x400000
=======================
[Memory]
0x400000 | 0x57 0x65 0x6c 0x63 0x6f 0x6d 0x65 0x20
0x400008 | 0x74 0x6f 0x20 0x61 0x73 0x73 0x65 0x6d
0x400010 | 0x62 0x6c 0x79 0x20 0x77 0x6f 0x72 0x6c
0x400018 | 0x64 0x21 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
; rcx = 0x1a 가 되면 위식의 결과가 ZF = 1
6: jg end
7: jmp 1

문제를 푸는 과정에서, jgjmp로 착각해서 조건 없이 만나면 무조건 점프를 하는 것으로 해석하는 바람에 문제를 푸는데 시간이 많이 소요됐다..ㅜㅜ

또한 이 문제를 풀면서 가장 헷갈렸던 부분이 메모리 구조에서 0x 가 나올때마다 주소가 +1 된다는 것이었다.
(ex. 0x400000이 존재하는 줄에서 처음에 주어진 메모리 내용기준으로 0x550x400001)
앞으로 메모리가 저렇게 표기되면 어떻게 해석해야 하는지 배우게 된 문제인 것 같다..!!

profile
보안 공부하는 대학교 4학년 / 시리즈에서 더욱 편하게 글을 찾아보실 수 있습니다:)

0개의 댓글