드림핵 시스템 해킹 강의를 보다,
중간 퀴즈가 나와 문제 풀이를 정리하고자 한다.
문제
Q1. 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
문제 접근
일단 code를 따라가보면서 이해해보자 !
# code
1: mov dl, BYTE PTR[rsi+rcx]
- rsi + rcx -> 0x400000로 시작
- dl -> 0x400000위치에 있는 0x67
# code
2: xor dl, 0x30
- dl = 0x67
-> 0x67 XOR 0x30 = 0x57
# code
3: mov BYTE PTR[rsi+rcx], dl
- dl에 0x57 저장
# code
4: inc rcx
- rcx값 1 증가: 0 -> 1
# code
5: cmp rcx, 0x19
6: jg end
- (rcx 값 = 0x1)과 0x19 비교하고, 왼쪽이 더 크면 end로 이동
-> 왼쪽이 작으므로 6번 줄 실행 x
# code
7: jmp 1
- code의 1번 줄로 이동
정리
- 1 ~ 4번 라인을 19번 (0에서 19) 반복하는 코드이다
- (메모리의 0x400000 부터 0x400019까지의 각 값) XOR 0x30
해결
0x67 XOR 0x30 = 0x57 (W)
0x55 XOR 0x30 = 0x65 (e)
0x5c XOR 0x30 = 0x6c (l)
0x53 XOR 0x30 = 0x63 (c)
0x5f XOR 0x30 = 0x6f (o)
0x5d XOR 0x30 = 0x6d (m)
0x55 XOR 0x30 = 0x65 (e)
0x10 XOR 0x30 = 0x20 ( )
0x44 XOR 0x30 = 0x74 (t)
0x5f XOR 0x30 = 0x6f (o)
0x10 XOR 0x30 = 0x20 ( )
0x51 XOR 0x30 = 0x61 (a)
0x43 XOR 0x30 = 0x73 (s)
0x43 XOR 0x30 = 0x73 (s)
0x55 XOR 0x30 = 0x65 (e)
0x5d XOR 0x30 = 0x6d (m)
0x52 XOR 0x30 = 0x62 (b)
0x5c XOR 0x30 = 0x6c (l)
0x49 XOR 0x30 = 0x79 (y)
0x10 XOR 0x30 = 0x20 ( )
0x47 XOR 0x30 = 0x77 (w)
0x5f XOR 0x30 = 0x6f (o)
0x42 XOR 0x30 = 0x72 (r)
0x5c XOR 0x30 = 0x6c (l)
0x54 XOR 0x30 = 0x64 (d)
0x11 XOR 0x30 = 0x21 (!)
Welcome to assembly world!
'보안 > 드림핵' 카테고리의 다른 글
[System Hacking] Quiz: x86 Assembly 3 (0) | 2024.01.13 |
---|