Kali-KM_Security Study


 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
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가?  (3) 2015.01.08

Comment +3