[Reversing.Kr] Easy Keygen
Reversing/Reversing (Wargame)

[Reversing.Kr] Easy Keygen

파일 확인

실행

이렇게 Name과 Serial을 입력하는 창이 뜨고, Serial까지 입력하고 나면 종료되는 프로그램이다.

➕ 문제 파일을 다운로드 받을 때 같이 첨부되어 있는 ReadMe.txt 파일을 열어보면

Serial 값이 "5B134977135E7D13"일 때의 Name 값을 찾아야 한다.

추측해보면,, Name 값을 암호화해서 Serial 값을 만들어내는 문제이지 않을까 싶다. serial 값을 만들어내는 알고리즘..?을 찾아내는 게 핵심일 듯 하다.

- detect it easy

파일 분석

pseudo code (IDA)

main 함수

  • v9: 사용자의 입력값을 저장 >> Name, Serial

첫 번째 scanf(aS, &v9)에서는 Name을 입력받는다. 입력받은 문자열 v9(name)에 대하여 이것저것 연산(31~36)해서 v13에 저장한다.

aS02x

  • sprintf(&v13, "%s%02X", &v13, *(&v9 + v3++) ^ *(&v6 + i)) : v13에 "%s%02X"의 포맷스트링에 맞춰 값을 저장한다. 이 때, v13은 0이기 때문에 큰 의미가 없을 거라고 생각하고.. *(v9 + v3++) ^ *(v6 + i) 부분을 잘 해석해야할 것 같다..
  • *(&v9 + v3++) : v9는 name이고, v3의 초기값은 0이다.
  • *(&v6 + i) : 차례로 0x10, 0x20, 0x30이 나온다. (v6 ~ v8) >> 이 값들은 고정 값이다. 어차피 i의 값이 3이상이 될 때에는 (3이 될 때는) i의 값을 0으로 바꿔버리기 때문에 이 값들이 반복된다.
  • 정리해보면, name의 값들을 하나씩 쪼개서 0x10, 0x20, 0x30을 차례로 XOR연산을 하는 것이다. 이 때 serial값은 16진수로 저장된다.

복호화 코드 작성

#char str = "5B134977135E7D13"
serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]

n = 0
p = 0x10

for n in range(len(serial)):
	if n%3 == 0:
		p = 0x10
	elif n%3 == 1:
		p = 0x20
	else:
		p = 0x30
	print(chr(serial[n] ^ p))
	n = n+1

SMALL

'Reversing > Reversing (Wargame)' 카테고리의 다른 글

[Reversing.Kr] Easy Unpack  (0) 2021.06.01
[CodeEngn] BASIC RCE L14  (0) 2021.06.01
[CodeEngn] BASIC RCE L13  (0) 2021.06.01
[CodeEngn] BASIC RCE L12  (0) 2021.05.28
[CodeEngn] BASIC RCE L11  (0) 2021.05.28