리버스엔지니어링 문제 Advance 16

2015. 8. 24. 10:49Security ★ Development/Reversing

반응형

http://codeengn.com/challenges/advance/16


Problem : registered: true가 되도록 key 파일을 만드시오 


프로그램을 그냥 실행시키면 도스창이 잠깐 열렸다 꺼지는데 registered: false 라고 써져있습니다. 

string으로 registered와 false, true는 쉽게 찾을 수 있습니다.


004031F3위치를 지나면 EDI에 false문자열이 들어가게 됩니다.  true가 들어가는 구간을 찾습니다.  문자열 검색에서 보시면 false와 true가 쉽게 보이는 004035F7 부분을 지나가는걸 알 수 있는데 이전까지처럼 둘 중 하나의 구간을 선택해서 바로 출력하는 것이 아니라 두 부분을 다 거친후 몇가지 연산을 더 한 다음에 최종 출력을 합니다.


console에는 004031F3에서 문자열 이동이 이루어진 후에 하나씩 찍히게 됩니다. 여기서 조금 위로 올라가보면 00403114가 있는데 여기의 비교 값이 0인지, 1인지에 따라 true, false가 갈립니다.  키 파일이 있을 때, 1일경우 false, 0일 경우 true를 찍는데 1일 경우에는 0040316A의 함수를 호출시켜 false 문자열을 이용합니다.

해당 부분의 전체적인 흐름입니다.  별 차이는 없는데 유일하게 분기가 일어나는 부분에서 true를 출력하는 루트는 00403129를, false를 출력하는 루트는 00403350을 호출하여 각 문자열을 이용하고 똑같이 00402A00을 호출하여 그 전에 받아온 문자열을 사용합니다.


문자열 registered: 를 사용하는 부분에서 조금만 위를 보면 crackme.key라는 문자열이 또 보입니다.  이게 키 파일의 이름이라는 것을 추측할 수 있습니다.  

다시 앞으로 와서 결국 0, 1과 비교하는 EBP+1C가 1이 되어야합니다.  0018DCA0입니다.


004055F7에서는 파일이 없으면 점프를 합니다.  파일이 있을 경우 00405629에서 길이체크를 하여 100이 아니면 점프합니다.  그리고 3개의 CALL이 있습니다.

첫번째 CALL로 들어가면 0040537B의 ECX에서 파일의 바이트값을 하나씩 볼 수 있습니다.  들어가기 전에 Arg1로 파일의 데이터를 넘겨주고 있으며 그 위치는 18DD98입니다. 

로직 분석을 자세히 하고 해당 주소를 보면 아직 의미를 알 수 없는 값들이 생깁니다. 

  


1F와 AND연산, SHR ?, 5와 같은 부분이 종종 보이는데 1F와의 연산은 하위 5비트, SHR 5는 상위 3비트를 구하기 위한겁니다.



이와 같은 방식으로 3개의 호출을 모두 철저하게 분석하여 얻은 정보로 키파일을 만들어줍니다.