따로 언패킹하지 않고 디컴파일러로 확인해본다.
EntryPoint에서 우클릭 다음을 찾기 → 현재 모듈 → 문자열 참조
Input Name 스트링에서 디스어셈블러에서 따라가기를 선택한다.
그럼 입력을 받는 어셈블리 코드를 확인할 수 있다.
이름을 입력받는다.
Serial 입력 전 반복문 구조를 확인할 수 있다.
esi를 0으로 초기화한 후 (xor esi, esi)
cmp esi, 3
jl easy keygen ~ 에서 esi >= 3 이면 esi 값을 0으로 초기화(xor esi, esi)한다.
따라서 i = 0부터 시작하고 반복문 안에서 조건문으로 i >= 3 이면 i = 0으로 만들 것이다.
i >= 3인 조건이 아니라면 xor ecx, edx를 해서 xor 연산을 한다.
esi에 따라 ecx는 0x10, 0x20, 0x30으로 증가하고 edx는 name의 처음부터 8자리 값까지 각각 가지고 있다.
따라서 0x10, 0x20, 0x30을 돌아가면서 name[0], name[1], .. 값과 xor 연산을 한 것이 serial이 된다.
serial은 ReadMe.txt에서 준 5B 13 49 77 13 5E 7D 13 으로, 16진수이므로 두 자리씩 끊어서 총 8자리로 name도 8자리이다.
IDA로 확인해보면 더 명확하게 serial이 구해지는 과정을 알 수 있다.
xor 연산 한 값을 sprintf 함수를 통해 serial이 저장되는 버퍼에 저장한다.
serial을 계산한 후 scanf로 입력받아서 동일한지 strcmp 함수로 비교한다.
name은 다음과 같이 구할 수 있다.
serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
answer = []
j = 0
for i in range(len(serial)):
if j == 3:
j = 0
answer.append(serial[i] ^ xor[j])
j += 1
print(chr(answer[i]), end='')
[CodeEngn] Basic RCE L14 (0) | 2021.06.01 |
---|---|
[CodeEngn] Basic RCE L13 (0) | 2021.06.01 |
[Reversing.kr] Easy Crack (0) | 2021.05.25 |
CodeEngn Basic RCE L12 (0) | 2021.05.23 |
CodeEngn Basic RCE L11 (0) | 2021.05.23 |