1. name값을 배열에 저장한다.
2. name의 길이만큼 반복문을 돌려 0x10, 0x20, 0x30 xor 연산을 한다.
3. 연산된 xor 값을 시리얼과 비교하여 맞으면 OK 틀리면 Wrong!를 내뱉는다.

시리얼이 5B134977135E7D13 일때의 name을 구하는 것 이므로 시리얼과 xor 되는 값을 연산하면

name을 출력할 수 있다.

키젠은 다음과 같다.

  1. #include <stdio.h>  
  2. int main() {  
  3.     int arr[8] = { 0x5B,0x13,0x49,0x77,0x13,0x5E,0x7D,0x13 };  
  4.     int key[8];  
  5.     int i;  
  6.   
  7.     for (i = 0; i < 8; i++) {  
  8.         if (i%3==0)   
  9.             key[i] = arr[i] ^ 16;  
  10.           
  11.         else if (i%3==1)   
  12.             key[i] = arr[i] ^ 32;  
  13.           
  14.         else if (i%3==2)   
  15.             key[i] = arr[i] ^ 48;  
  16.           
  17.         printf("%c", key[i]);  
  18.     }  
  19.     printf("\n");  
  20.     return 0;  
  21. }  



위의 첨부파일을 실행해 보면 다음과 같은 결과를 얻을 수 있다.



하드웨어를 CD-ROM으로 인식시켜야 하는 문제이다.

※ 물론 진짜로 바꿔야 하는 것이 아닌 문제의 시나리오 이다.

리버스 엔지니어링을 통해 프로그래밍을 원하는대로 동작시켜보자.

먼저 Ollydbg로 프로그램을 열어보자.




정상적으로 인식하였을때 분명히 뜨는 문자열이 있을 것이다.


그 문자열을 찾아보자.


오른쪽마우서 > Search for > All referenced text string





찾았다!!!


이제 저 주소를 따라가보자




자 여기서 위에 있는 어셈블리어를 잘 보자.


JE SHORT ~~~~~~ 라고 되어있는 부분을 잘 보자.


JE는 두 CMP 값을 비교하여 두 값이 같으면 원하는 레이블로 점프할 수 있는 명령어 입니다.


이걸 JMP로 바꿔버리면 어떻게될까??





Exploit에 성공하였다.



+ Recent posts