-->

[reversing.kr] Position 풀이

Position 문제부터는 elf를 제외하고는 푼 수가 1000이하로 떨어진다.. 확실히 Position부터는 좀 문제가 까다로워지는 것 같은게 input name으로 serial을 생성하는 과정이 좀 복잡해서 코드 짜기가 좀 헷갈렸다.

 

 

 

reversing.kr Position 풀이

Position.exe를 실행시키면 다음과 같이 Name과 Serial을 입력받는다.

 

 

키젠 문제답게 시리얼이 주어지고 그에 맞는 Name값을 구해야 하는 문제이다. 친절하게 ***p 라고 알려주며 끝자리 p와 총 길이가 4임을 알려주었다.

 

 

Position 창에서 "Wrong"이라는 문자열이 있었으므로 해당 문자열이 사용되는 함수로 먼저 가본다. 참고로 Wrong은 유니코드로 저장되어 있기 때문에 IDA 문자열 보기(Open Subviews>Strings)에서 설정을 따로 추가해주어야 한다(오른쪽클릭>Setup).

 

 

 

그리고 해당 함수로 가보면, eax 값이 0인지에 따라 Wrong/Correct로 분기하고 있다. eax 값은 sub_401748의 반환값일테니, 해당 함수를 자세히 분석하면 될 것 같다.

 

 

 

sub_407140 함수는 좀 복잡하기 때문에 헥스레이로 먼저 봐보면, GetWindowTextW가 2번 있으므로 첫번째 v61을 name, 두번째 v62를 serial로 해석하였다. 그렇게 되면, name 길이가 4인지 먼저 체크하고 a~z의 소문자를 갖고 있는지 확인하고 이 조건을 통과하면 입력받은 serial 값 중간에 '-'가 있는지 확인한다. 여기서 serial은 소문자만으로 이루어진 4자리 값임을 알 수 있다. 

 

 

 

그 아래로 가보면 이제 shift 연산같은 것이 막 나오는게 name을 사용해서 serial 값을 생성해내는 것 같다. 여기서 v7, v9와 같은 변수가 어떤 것을 의미하는지 유추하기 힘드므로 여기서부터는 실행도 같이 시키면서 확인해본다.

 

 

 

일단 직접 실행시켜서 v7, v9를 확인해보면, 각각 name[0], name[1]이다. 

 

 

 

그리고 이런식으로 전부 확인해보면, 대략 구조는 name[0], name[1]을 사용해서 serial[0]~[4]까지 생성하고 name[2], name[3]을 사용해서 serial[6]~[10]을 생성하는 구조이다.

 

 

 

이것을 그대로 파이썬 코드로 옮기면 아래와 같다. 헥스레이를 그대로 옮기면 되기 때문에 코드 짜는건 길어서 헷갈리긴 하지만 어렵진 않다. name을 역으로 구하는 것이기 때문에 첫시작은 name의 3번째 값까지 반복문을 돌아야 하기 때문에 3중 for문으로 시작했다. 

 

 

 

위와 같은 방식으로 serial[10] 번째 값까지 확인해준 후 모든 조건문을 통과할 경우 n_0, n_1, n_2를 출력시키면 총 4가지의 값을 볼 수 있다.

 

 

'리버싱 > reversing.kr' 카테고리의 다른 글

[reversing.kr] ransomware 풀이  (0) 2020.03.12
[reversing.kr] Direct3D FPS 풀이  (0) 2020.03.11
[reversing.kr] ImagePrc 풀이  (0) 2020.03.10
[reversing.kr] Replace 풀이  (0) 2020.03.09
[reversing.kr] Music Player 풀이  (0) 2020.03.08

댓글

Designed by JB FACTORY