86 Assembly: Essential Part(1) quiz
드림핵 리버싱파트 quiz문제 풀이
[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
Q. end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 ?
[code 해석]
code1
rsi + rcx: 0x400000 위치에 있는 데이터 dl로 mov
dl = 0x67
code2
dl과 0x30을 XOR연산.
dl = 0x57
code3
dl을 rsi+rcx에 mov. 아까 그자리 그대로 차지
[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
code4
rcx += 1
code5
cmp rcx, 0x19
rcx와 0x19 비교해서 전자가 더 크면 code6 (end로 점프), 아니면 code7(code1로 점프) 실행
작으니까 code1로 점프해서 다시 반복된다.
즉
0x20만큼 반복한다.
= 36번 반복한다.
그럼 모든자리의 코드가 바뀔 것이다. 반복 루프를 돌 때마다 rcx는 하나씩 커지고, 그에 따라 바뀌는 byte가 다를 것.
즉 모든 데이터에 xor 0x30 해주면 되겠다.
파이썬 알못인 본인은 for문도 못돌리고 하나하나 했다고 한다.
'보안 > 리버싱' 카테고리의 다른 글
reversing.kr - Easy ELF (0) | 2024.08.26 |
---|---|
x64 assembly basic (0) | 2022.07.10 |
Dreamhack Quiz: x86 Assembly 2 (0) | 2022.07.10 |
#2 동적분석과 정적분석 (0) | 2022.07.01 |
#1 리버싱이란? (0) | 2022.07.01 |