워게임 풀이
Reversing.Kr
This site tests your ability to Cracking & Reverse Code Engineering. Now Challenge a problem for each environment. (Windows, Linux, .Net, Flash, Java, Python, Mobile..) Admin E-Mail: gogil@reversing.kr
reversing.kr
7. Position
문제 파일 압축을 풀어보면 Position.exe와 ReadMe.txt 파일이 있다.

Position.exe를 실행해보면 Name과 Serial을 입력하라고 한다.

ReadMe에는 문제에 대한 설명이 나와있다. Serial이 76876-77776일 때의 Name을 찾으면 되는 것 같고, 이 Name은 'p'로 끝나는 4글자임을 힌트로 주고 있다.


"Correct!"라는 문자열이 보인다. 해당 문자열로 이동한다.

밑줄 친 부분에서 함수가 호출되고, test eax, eax 겨로가에 따라서 Correct 혹은 Wrong을 출력한다.

Name을 'abcp'(***p의 조건에 맞는 임의의 Name값)를 넣고, Seiral값을 76876-77776로 input 해준다.

#7006 함수가 호출된 후에 Name 길이가 ecx-C의 위치에 담긴다. 6617D9 주소의 je 명령어에서 점프사 일어나지 않으면 더 이상의 검사가 일어나지 않고 return한다. Name의 길이는 4이다.

위는 Name에 대해 각 문자가 a~z(소문자) 범위를 만족하는지 검사하는 루틴이다.

Name으로 Serial을 생성하고, 입력한 Seial과 비교하는 루틴이다. Easy Keygen 문제가 생각이 나는 문제이다..

올리디버거로 풀어보려고 했는데 너무 코드가 길어서 ida를 사용해줬다. 그림?으로 보니 훨씬 이해하는 것이 편하다..
eax값(sub_401740의 반환값 예상)이 0인지에 따라서 Correct!와 Wrong으로 분기하고 있다.
[sub_401740 함수 분석]
*F5를 눌러주면 보기 쉬운 프로그래밍 언어로 보여준다!..짱

Name의 길이가 4고, 소문자 알파벳이다.

Name에 중복 문자가 있는지 체크!!

Serial 값의 길이가 11글자인지 체크하고 6번째 문자가 '-'인지 체크
>이 부분은 Serial 값이 76876-77776로 이미 문제에서 줬기 때문에 크게..신경 안 써도 될 듯



Seial을 생성하고 비교하는 부분이다. Input한 Name을 Shift, AND, Plus 연산을 사용해서 나온 값과 Input 한 Serial의 각 숫자들과 비교한다.
[파이썬 코드]
name = ['x', 'x', 'x', ord('p')] #Name = '***p'
serial = [7, 6, 8, 7, 6, 7, 7, 7, 7, 6] #Serial is 76876-77776
for i in range(ord('a'), ord('z')+1):
for j in range(ord('a'), ord('z')+1):
for k in range(ord('a'), ord('z')+1):
if i!=j and j!=k and k!=i:
name[0] = i
name[1] = j
name[2] = k
ans = [0 for i in range(10)]
ans[0] = ((name[1]>>2)&1)+1 + ((name[0]>>0)&1)+5
ans[1] = ((name[1]>>3)&1)+1 + ((name[0]>>3)&1)+5
ans[2] = ((name[1]>>4)&1)+1 + ((name[0]>>1)&1)+5
ans[3] = ((name[1]>>0)&1)+1 + ((name[0]>>2)&1)+5
ans[4] = ((name[1]>>1)&1)+1 + ((name[0]>>4)&1)+5
ans[5] = ((name[3]>>2)&1)+1 + ((name[2]>>0)&1)+5
ans[6] = ((name[3]>>3)&1)+1 + ((name[2]>>3)&1)+5
ans[7] = ((name[3]>>4)&1)+1 + ((name[2]>>1)&1)+5
ans[8] = ((name[3]>>0)&1)+1 + ((name[2]>>2)&1)+5
ans[9] = ((name[3]>>1)&1)+1 + ((name[2]>>4)&1)+5
if serial==ans:
for ch in name:
print(chr(ch), end="")
print()
> 파이썬 코드 실행 결과 및 flag




Python 결과로 나온 Name 3개 모두 'Correct!'라는 결과가 잘 출력됨!!
*gpmp는 Wrong 뜸
그치만 reversing.kr에서는 bump만 정답으로 인정됐다...(나머지는 'Wrong!'이라고 뜸)

'Reversing' 카테고리의 다른 글
[Reversing] AutoHotkey1_WirteUp (0) | 2023.05.27 |
---|---|
[Reversing] Direct3D FPS_WirteUp (0) | 2023.05.27 |
패킹과 언패킹 (0) | 2023.05.17 |
[Reversing] Replace_WirteUp (0) | 2023.05.13 |
[Reversing] Music Player_WirteUp (0) | 2023.05.13 |