C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가?                //정말 쓸모 없는 호기심에서 시작된 이번 게시글

 
"C언어를 공부하는 도중 이름을 지니는 심볼릭 상수를 표현하는 방법에는 두가지가 있는데, 그 중 하나는 'const 키워드'를 사용하는 방법이고, 또 하나는 매크로를 이용하는 방법이다."라 써있으며, "변수 선언시 const 선언을 추가하면 상수를 만들수 있다고 한다.

즉, const int MAX=100;   //MAX는 상수! 따라서 값의 변경 불가!

바로 여기서 나의 호기심을 자극하였다. 저 문장을 보는 순간 "그럼 값의 변경이 불가능하다는 것은 Olly로 들어가서 그 값을 바꾸는것이 안된다는 것인가?


Visual Studio를 통한 컴파일

#include <stdio.h>

#include <stdlib.h>


main()

{

 const int a=10;


 printf("%d\n", a);

 

 if (a == 10)

  printf("Fail..It is ten...\n");

 else

  printf("Good!! Not 10!!");


  //a의 값이 변경 가능한지 확인하기. 10이 아니면 성공문으로 간다.

  system("pause");

}

 OllyDebugger로 열기

위에서 만든 파일을 올리디버거를 통해 열고, 그 후 성공과 실패를 나누는 지점인 CMP 비교지점을 찾기위해 F8로 접근..접근..접근....접근......안티디버깅으로 인한 실패..ㄴ이임ㄴ오니

IsDebugPresent 2개를 발견하고 TEST EAX,EAX >> XOR EAX,EAX로 변경시키므로 적용안되게끔 변경. 그후 다시 찾는다.

비교문은 EBP-8에 저장된 값과, 0A를 비교하여 성공문과 실패문의 갈림길.

EBP-8에는 처음의 컴파일한 10(0A)의 값이 있었다. 덤프창으로 가서 Control+E를 통해 값을 변경 >> 0B >> ??되네



 



 결론

IsDebugPresent 와 Entry Point Alert 등의 밑의 경고문등 방해요소가 있었지만

Module 'ConsoleA' has entry point outside the code (as specified in the PE header). Maybe this file is self-extracting or self-modifying.

Please keep it in mind when setting breakpoint!

결국 나의 궁금증은 해결 >> 10(0A)를 11(0B)로 변경할수 있다.

const 선언은 값을 변경하는 벙법에 제한을 두지만 결국 리버싱으로는 풀수 있는것 같다.





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

PE File Format 0x04  (0) 2015.01.13
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x02  (0) 2015.01.09
PE FILE Format 0x01  (0) 2015.01.08