728x90
파일 확인
실행
이렇게 Name과 Serial을 입력하는 창이 뜨고, Serial까지 입력하고 나면 종료되는 프로그램이다.
➕ 문제 파일을 다운로드 받을 때 같이 첨부되어 있는 ReadMe.txt 파일을 열어보면
Serial 값이 "5B134977135E7D13"일 때의 Name 값을 찾아야 한다.
추측해보면,, Name 값을 암호화해서 Serial 값을 만들어내는 문제이지 않을까 싶다. serial 값을 만들어내는 알고리즘..?을 찾아내는 게 핵심일 듯 하다.
- detect it easy
파일 분석
pseudo code (IDA)
- v9: 사용자의 입력값을 저장 >> Name, Serial
첫 번째 scanf(aS, &v9)에서는 Name을 입력받는다. 입력받은 문자열 v9(name)에 대하여 이것저것 연산(31~36)해서 v13에 저장한다.
- 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 |