- 문제

[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

** 출처 : dreamhack

 

 

python 코드로 변환하기전 코드를 해석해서 동작 알고리즘을 알아야한다.

 

code 1 :

mov dl, BYTE PTR[rsi+rcx]

 

rsi+rcx 의 주소의 값을 byte만큼 dl에 이동시킨다. rsi=0x400000, rcx=0

여기서 헷갈리면 안되는게 dl이 rdx > edx > dx> dh> dl 이렇게 될텐데 x86 이므로 리틀 엔디안을 사용하기 때문에 처음 dl은 0x67이 들어간다.

 

code 2 :

xor dl, 0x30

 

dl와 0x30을 xor 시킨다.

처음 dl은 0x57이 됨

 

code 3:

mov BYTE PTR[rsi+rcx], dl

 

xor 시킨 dl 값을 다시 rsi+rcx 의 주소의 값에 넣는다.

 

code 4:

inc rcx

 

rcx값을 1 증가시킨다. 

 

code 5:

cmp rcx, 0x19

 

rcx 값과 0x19값을 비교

 

code 6:

jg end

 

앞의 비교 연산자 결과 앞의 값이 더 크면 코드 끝, 이때 >=가 아니라 > 임을 주의!  따라서 0x19의 10진수값인 25보다 rcx 값이 커야하므로 총 루프 수는 26번이라는것을 알 수 있음

 

code 7:

jmp 1

 

1번으로 이동

 

 

코드를 정리해보면 0x67부터 0x11 까지 26개를 각각 0x30해라! 라는 뜻이 된다.

그걸 파이썬으로 짜면

stack = [ 0x67, 0x55, 0x5c, 0x53, 0x5f, 0x5d, 0x55, 0x10,
0x44, 0x5f, 0x10, 0x51, 0x43, 0x43, 0x55, 0x5d,
0x52, 0x5c, 0x49, 0x10, 0x47, 0x5f, 0x42, 0x5c,
0x54, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]

result = []

for i in range(0,26):
    dl = stack[i]
    xor = hex(dl^0x30)
    result.append(xor)
    i = i+1

print(result)

 

이렇게 짤 수 있다

여기서 주의점은 왜인지 모르겠지만 HEX끼리 XOR해도 결과값은 10진수로 나와서 hex로 변환시켜줘야한다.

 

나온 결과값은 아래 사이트에서 ascii로 변환하면 됨

https://www.rapidtables.com/convert/number/hex-to-ascii.html

 

Hex to ASCII Text String Converter

Hex to ASCII Text String Converter Enter hex bytes with any prefix / postfix / delimiter and press the Convert button (e.g. 45 78 61 6d 70 6C 65 21): ASCII to hex converter ► ASCII text encoding uses fixed 1 byte for each character. UTF-8 text encoding u

www.rapidtables.com

 

'리버스 엔지니어링' 카테고리의 다른 글

[Reversing] OPcode 이해하기  (0) 2023.11.08
복사했습니다!