- 문제
[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 |
|---|