본문 바로가기

보안/리버싱

86 Assembly: Essential Part(1) quiz

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