블로그 이미지
Flying Mr.Cheon youGom

Recent Comment»

Recent Post»

Recent Trackback»

« 2024/5 »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

[리버싱] 심볼제거 정보

보안/리버싱 | 2013. 9. 9. 12:43 | Posted by youGom

 

출처 ;

http://verysimple.org/wiki/moin.cgi/HideDebugSymbol#fndef-789cb63c063e4d9502bddcaf0d2e4ecef8e9de1b-0

 

 

JNI native 프로젝트인 경우

  • Java로만 구성된 프로젝트와는 달리 <<JNI>> native 가 추가되면 <<ProGuard>>에서 Java와 동시에 Native쪽까지 처리해주지 못한다.

  • JNI 쪽에 등록된 함수명을 ProGuard가 임의로 바꾸면 안된다. --> ProGuard 측에서 특정 함수명을 바꾸는 것을 금지하도록 설정할 수 있다.

Native 측의 디버깅 심볼 숨기기

  • so 파일에 심볼이 존재하는 지 확인하는 방법
    1. apk은 zip 압축방식과 동일하므로 zip프로그램으로 압축을 푼다.
    2. 압축 푼 lib/armeabi 폴더 밑에 *.so 파일을 확인한다.
    3. objdump.exe1 나 readelf.exe1 를 이용해서 so 파일 안에 심볼이 존재하는지 확인

      • objdump -S *.so
        혹은
        readelf -Wa *.so
  • so 파일의 심볼을 지우기
    1. gcc 컴파일 옵션 추가
      • Android.mk 파일에 디버깅 심볼을 지우는 옵션 추가
        LOCAL_CFLAGS    := -fvisibility=hidden

        어떤 PC에서는 되고2 어떤 PC에서는 심볼이 모두 통체로 사라진다. --> NDK 버전 문제로 추측된다.

    2. strip1 파일로 so 파일에서 직접 심볼을 지우기

iPhone

어뷰징 이슈

  • 탈옥된 폰에서 아래와 같은 방법으로 어뷰징을 할 수 있음
    • 공격방법 : 탈옥된 디바이스에서 gdb를 이용한 디버깅, jump 명령어로 내부함수를 직접호출하면 인터럽트가 발생할 때까지 해당 함수가 반복되어 곧바로 최고 레벨을 달성할 수 있습니다.
      (gdb) info functions
      ... (생략) ...
      0x00023ebc LevelUp
      0x000d3a08 GetItem
      ...(생략) ...
      (gdb) call LevelUp
      $1 = {<text variable, no debug info>} 0x23ebc <LevelUp>
      (gdb) jump LevelUp --> LevelUp() 함수 반복 수행으로 레벨200 달성
      Continuing at 0x23ecc.
      
      (gdb) p (int) GetItem(20) --> 아이템 생성
      $1 = 1
      (gdb) p (int) GetItem(21)
      $2 = 1
      (gdb) p (int) GetItem(22)
      $3 = 1

원인

  • 실행 바이너리 파일에 심볼 정보가 남아있어서 발생하는 문제.
: