제 확인







기초 확인



위의 사진은 주석과 같이 name을 입력 받고 name의 길이를 확인 하는 과정입니다.


이번에는 Serial을 입력받고 그 길이를 확인하는 과정입니다. 길이는 12글자여야 합니다.


참고로 이 접어놓은 부분은 문제의 의도를 잘못파악하고 단순노동을 작업하였다. 매우 삽질스러우니 한가할떄만 열어보자.



분석


IDA를 통하여 HEX-Ray 기능을 통하여 성공 구문이 있는 곳을 확인 하였을때, 아래와 같이 check_serial 이라는 부분이 있는 것을 확인 할 수가 있다. 정말 누가 봐도 저곳을 확인해달라는 말인 것을 알 수가 있다.


Check_Serial() 내부로 들어오면 아래와 같이 확인을 할 수가 있는데, 여기서 확인을 해야 할 것은 붉게 표시한 3곳을 잘 보아야한다. stringFindSecond 함수를 두번 호출하고 그 반환 값들의 차를 구하여 그 값이 5가 넘지 않을 경우에 v28 에 0을 준다는 것이다. 이게 구체적으로 어떻게 생각해야 하는지는 아래에서 설명하겠다.


위의 부분이 바로 ida를 통하여 붉게 표시했던 3곳이다. 여기서 보아야 할 것은 첫번쨰 함수를 호출하기 전에 내가 입력한 serial 값의 한글자를 가져오는 작업이 이루어졌고, 두번째 호출을 하기 전에는 입력한 Name의 한글자를 가져오는 것을 확인 할 수가 있었다. 아래의 사진과 같이 설명을 하겠다.

만약 Name = 1111  serial = 000000000000 일경우를 생각해보자. 여기서 위의 순서대로 우선 serial 한글자인 0을 가지고 온다. 이 0을 첫번째 strFindSecond()를 통하여 호출을 하였을 경우 아래에 있는 키 순서값들중에서 0이 나올때까지 계속해서 한글자씩을 보낸다. 25번째에 '0'이라는 값이 있다. 

이번엔 두번쨰 호출에서 name의 한글자인 1을 생각해보자. 1의 경우는 30번쨰에 위치를 하고 있다. 이 둘의 범위는 5를 초과하지 않으므로 성공문이 출력이 된다. 이처럼 결국 name 1을 기준으로 한다면 '1'이 30번쨰이니 25~35번째 까지의 모든 단어가 성공문을 출력할 수 있게 해준다. 이것이 바로 CMP EAX, 5를 확인하는 이유이다. 

이제 키 값이 어떻게 형성되는지 확인 했으니 프로그래밍을 해보자.

'A.J.X.G.R.F.V.6.B.K.O.W.3.Y.9.T.M.4.S.2.Z.U. .I.7.0.H.5.Q.8.1.P.D.E.C.L.N'



프로그래밍



코드에 대한 설명은 주석에 구체적으로 해놓았다.


참고로 여기서 출력 되는 J - 'A'의 경우 위에 주석에서는 써놓았지만 a-z를 하면 소문자로 치환하고 해서 번거로우므로 그냥 대문자 자체로 출력되도록 하였다. 따라서 저기서 'A'는 'a'라고 생각하면 된다.

p.s 2일에 걸쳐서 삽질을하여 풀었다가, 우연히 카페에서 이 문제를 다시보는데 문득 생각이 들어서 풀 수가 있었다. 고로 리버싱문제는 인내를 갖고 여러 방면으로 생각을 해봐야 문제를 쉽게 풀 수 있을 것 같다.

10_Find_Key.py


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Advance 12  (1) 2015.07.22
CodeEngn Advance 11  (0) 2015.07.17
CodeEngn Advance 09  (0) 2015.07.12
CodeEngn Advance 08  (50) 2015.07.01
CodeEngn Advance 06  (0) 2015.06.28