[reversing.kr] replace

취미/WarGame 2013. 10. 25. 13:29 |


이 프로그램은 우리에게서 숫자를 입력받는다.


허나, 프로그램이 정상적으로 실행되지 않을것이다.


그러니 디버거로 분석을 해보자.




프로그램을 F9 로 실행하면 위 명령에서 익셉션이 발생해 프로그램이 정지한다.


mov ptr [eax] , 90 


eax 레지스터가 가리키는 값에 90을 대입해라. 


이 패치가 오류의 원인이다. 





먼저 오류의 원인인 해당 명령을 NOP 으로 패치해보자 .


이렇게 코드를 바꾸니 일단 실행은 정상적으로 잘 이루어 졌다. 


그리고 나서 나오는 핵심 코드 





NOP으로 넘겨서 돌아온곳은 다름아닌 JMP문이다. 


그것도 가장 중요한 correct 메시지를 출력하는 루틴을 건너뛰어버리는 JMP문! 


이 코드는 대체 왜 있는걸까 ? 


이 코드가 있는 한 어떠한 값을 입력해도 절대로 correct 메시지를 볼 수 없다. 


어거지로 이 JMP문을 NOP으로 채워보면  어떠한 값을 입력해도 correct메시지를 볼 수 있지만, 우리가 원하는 건 이런 메시지를 보는 것이 아니다. 

correct가 실행될 수 있는 입력값을 찾는 것이다. 




다시 여기로 돌아와 코드를 유심히 살펴보자.

eax 는 우리가 입력한 값에 특정 연산이 더해진 값이다. 즉 우리가 입력하는 값에 따라 그 수치가 바뀐다.


그리고, 그곳에 90이라는 데이터를 입력하려고 한다.


바로 이곳이 유요하지 않은 메모리를 가리킬 경우 메모리 참조 오류를 내면서 프로그램이 뻗어버리는 것인데 .


유효한 메모리공간으로 바꾸어 버리면 어떻게 될까?


예를 들어 코드영역내의 어느부분을 가리키도록 말이다.


90은 어셈 NOP명령의 OP코드이다.


즉, eax 가 특정 메모리를 가리키도록 만들면 이 명령에 의해 해당 메모리가 NOP명령어로 패치된다는 얘기다.


이정도면 거의 정답을 다 말한셈이다.


그래도 모르겠다면 프로그램을 몇 번이고 다시 분석해보길 권한다.






답 :



우리가 위에서 확인한 correct 를 건너 뛰어버리는 JMP문 그곳을 eax 가 가리키도록 해서 NOP으로 패치시키면 correct 메세지를 볼 수 있고


그 값이 바로 답이다.


여기까지 왔다면 계산기를 조금 두들겨 답이 무엇인지 알 수 있을것이다.


'취미 > WarGame' 카테고리의 다른 글

[reversing.kr] ImagePrc  (0) 2015.02.21
[reversing.kr] Position  (0) 2013.10.30
[reversing.kr] Easy_UnpackMe  (0) 2013.10.24
[reversing.kr] 2번 문제 Easy_keygen  (0) 2013.10.23
[reversing.kr] 1번 문제 Easy CrackMe  (0) 2013.10.18
Posted by $Zero
:

정말 파일명 그대로 쉬운 언팩 파일. 


분석이랄 것도 없고 그냥 OllyDBG 의 F8만 쭈우우욱 누르다가 OEP에 도달했다. 


딱봐도 언팩된 코드를 다시 푸는 XOR연산들이 연이어 나오는데 


이 루프들을 다 BP로 건너 뛰고 하다보면 금방 OEP에 도달한다. 


무엇보다 F8을 쭉 누르고 있으면 IAT를 복구하는 루틴도 볼 수 있으니 쉽게 이게 언팩 루프라는 걸 알아낼 수 있었다. 

'취미 > WarGame' 카테고리의 다른 글

[reversing.kr] ImagePrc  (0) 2015.02.21
[reversing.kr] Position  (0) 2013.10.30
[reversing.kr] replace  (0) 2013.10.25
[reversing.kr] 2번 문제 Easy_keygen  (0) 2013.10.23
[reversing.kr] 1번 문제 Easy CrackMe  (0) 2013.10.18
Posted by $Zero
:




이 부분의 알고리즘과 사용되는 버퍼를 자세히 살펴보면


입력받은 name으로 serial key를 생성하고 있다.


버퍼에 10, 20, 30 값을 입력하고


루프를 돌면서 name 버퍼의 하나하나에 순서대로 xor 연산을 수행한다.


5B 13 49 77 13 5E 7D 13


즉, 이러한 serial key 를 만드는 이름을 찾는건


해당 시리얼을 위 알고리즘처럼 순서대로 10 , 20 , 30


을 다시 XOR연산해서 원래의 값으로 되돌리면 된다.


원래 값으로 되돌리는 데에 사용된 소스 코드



#include <stdio.h>

int main(void)
{
   int i=0;
   int j = 0x10;
   int str_count=0;
   char passwd[100] = {0x5B,0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13};


   //scanf("%s", passwd);


   for(i=0; i<100; i++)
   {
      if(passwd[i]==0)
     break;

      str_count++;
   }


   for(i=0; i<str_count; i++)
   {
      if(j == 0x40)
     j = 0x10;
      passwd[i] ^= j;
      j += 0x10;

      printf("%c ", passwd[i]);
   }






   return 0;
}



'취미 > WarGame' 카테고리의 다른 글

[reversing.kr] ImagePrc  (0) 2015.02.21
[reversing.kr] Position  (0) 2013.10.30
[reversing.kr] replace  (0) 2013.10.25
[reversing.kr] Easy_UnpackMe  (0) 2013.10.24
[reversing.kr] 1번 문제 Easy CrackMe  (0) 2013.10.18
Posted by $Zero
: