2012. 4. 1. 00:52

파일이 스트립되어 있는 경우는 디버깅시 심볼밖에 출력 되지를 않는다.

그리고 바이너리로 옮겨서 아이다로 분석하여도 파일자체가 스트립된 것이기 때문에, 보여지지 않는다..

이방법에 대해서는 몽형의 동영상 강좌를 통해 좀더 학습해야겠다. 



우선 아래 스트립이란 무엇인가에 대해서 퍼왔다.  just in case 를 위해 복사했지만 가능하면 아래 주소로 가서 방문자 카운트나 올려주는겸해서 참가 하도록 하자. 


============================================출처 :http://mwmw7.tistory.com/231==============================

strip 이용하기

strip은 오브젝트 파일에 있는 심볼을 삭제하는 툴이다.

일반적으로 빌드 완료한 실행파일 또는 라이브러리에서 불필요한 심볼을 제거하는데 사용한다.


사용법

SYNOPSIS

      strip [-F bfdname |--target=bfdname]

    [-I bfdname |--input-target=bfdname]

    [-O bfdname |--output-target=bfdname]

    [-s|--strip-all]

    [-S|-g|-d|--strip-debug]

    [-K symbolname |--keep-symbol=symbolname]

    [-N symbolname |--strip-symbol=symbolname]

    [-w|--wildcard]

    [-x|--discard-all] [-X |--discard-locals]

    [-R sectionname |--remove-section=sectionname]

    [-o file] [-p|--preserve-dates]

    [--keep-file-symbols]

    [--only-keep-debug]

    [-v |--verbose] [-V|--version]

    [--help] [--info]

    objfile...


굉장히 욥션이 많지만... 실제 사용에서는 굉장히 간단하다.

root@boggle70-desktop:tmp# file a.out 

a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 

dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped



strip을 실행하고 확인해 보자.

root@boggle70-desktop:tmp# strip a.out 

root@boggle70-desktop:tmp# ls -la a.out 

-rwxr-xr-x 1 root root 5532 2011-03-26 16:56 a.out

root@boggle70-desktop:tmp# file a.out 

a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 

dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped


파일 사이즈는 6096 -> 5532 byte 로 줄어들었고 파일의 정보에는 not stripped 라고 나오던것이

stripped 되었다고 나오게 된다.


하지만 strip 을 시키고 나면 아래와 같이 나옵니다.

root@boggle70-desktop:tmp# nm a.out 

nm: a.out: no symbols


이제 strip 을 사용할때 사용하는 옵션중에 -d 옵션을 보겠습니다.

root@boggle70-desktop:tmp# strip -d a.out

root@boggle70-desktop:tmp# ls -la a.out 

-rwxr-xr-x 1 root root 7492 2011-03-26 17:02 a.out

파일의 크기가 옵션없이 실행하는 것보다 약간 큽니다.

-d 옵션은 디버그용 정보만을 제거하는 옵션입니다.

때문에 nm 으로 출력시 동일한 실볼을 찾을 수는 있지만 파일명이나 행번호는 찾을수 없습니다.

따라서 addr2line 과 같은 것을 사용할수 없고 디버깅시에도 심볼네임만 볼수 있을뿐입니다.


-R 옵션은 지정된 섹션을 제거하는 옵션입니다.

만약 strip -R .text a.out 을 실행한다면... 그 프로그램은 실행하수 없습니다.

.text 는 code 영역이기 때문에 실행할 코드를 모두 제거하게 되기 때문입니다.


또 라이브러리 파일에 이것을 사용하면 다른 오브젝트와 링크가 불가능합니다.

링커는 심볼에 의존해서 오브젝트를 링크해주기 때문입니다.


strip 은 역시 BFD라이브러리를 이용해 제작된 툴입니다.

GNU binutils 의 소스코드는 objcopy 와 동일한 코드로 이루어져 있고

objcopy 명령에 -strip 을 사용하면 strip 과 같은 기능을 수행하게 됩니다.

====================================================================================================


Posted by k1rha