본문 바로가기

Tool

바이너리 분석

바이너리 분석(Binary Analysis) 툴은 어떤 패커를 이용해서 바이너리를 패킹했는지, 어떤 언어로 제작된 프로그램인지를 알아 낼 때 사용된다.

PEID :


파일을 열어도 되고 드래그 앤 드롭을 하여 파일을 넣을 수도 있다. 또한 Multi Scan 기능으로 여러개의 파일을 분석할 수 있다. 플러그인에는 unpack을 해주거나 문자열을 추출해주는 것들이 있다.



리소스 해커 :

리소스를 분석해야 하느 경우, 프로그램 내부에서 사용되는 문자열이나 아이콘, 이미지, 폼 구조에 대해서 분석할 때 사용된다. 사용전에 PEID 같은 툴로 패킹이 되어있는지 확인을 먼저 해야한다.
 

패킹이 되어 있으면 이런 경고가 뜬다.


프로그램에서 사용되는 아이콘이나 bitmap들을 추출해서 저장할 수 있고, 프로그램에서 사용되는 문자열이나 폼 형태를 바꿔서 저장도 가능하다.



Strings :

바이너리 내부에서 사용된 문자열들을 추출해준다.

Cmd 창에서 String 를 입력하면


usgae : strings [-a] [-b bytes] [-n length] [-o] [-q] [-s] [-u] <file or directiory>

특별히 옵션을 추가해야 할 경우는 없다.

(tip : 내컴퓨터->속성->고급->환경 변수->PATH 변수 값에 디렉터리를 추가하면 그 추가된 디렉터리 안에 있는 파일을 실행할때는 그 디렉터리까지 접근하지 않아도 실행이 가능하다)

문자열만 추출해도 분석하는데 도움이 된다. strings를 이용하여 문제를 풀어보자.

(참고 : http://www.hackthissite.org/  해킹 문제들이 다수 실려 있습니다. 관심 있으신 분들은 문제를 풀어보세요)


문제를 실행해보면


시리얼키를 넣으라는 문제이다 strings로 문자열만 추출해 보아도 내부의 시리얼처럼 보이는 문자열이 나타날지도 모른다.


(참고 : strings 다음에 오는 파일명은 환경 변수에 등록해도 안됩니다 따라서 추출할 파일명 폴더에 접근한 상태에서 strings 를 실행합시다.
> 은 새로 만들기입니다. 따라서 위의 명령은 추출한 문자열을 str.txt 파일을 만들어 저장해라라는 뜻입니다)

str.txt 파일을 열어 프로그램 타이틀에 있는 문자열인 'Authenticate your software'를 검색해보면(Ctrl+F)


시리얼처럼 보이는 문자열이 보인다.

프로그램에 넣어보면


문제를 푼 것을 알수 있다.

(tip : 메시지창이 활성화된 상태에서 Ctrl+C를 누르면 메시지 창의 내용이 다 복사된다)



Dependency Walker, DumpBin :

Dependency Walker 와 DumpBin : 바이너리 형태의 유틸리티로써 COFF 개체 파일, COFF 개체의 표준 라이브러리, 실행 파일 및 DLL(동적 연결 라이브러리)을 검사할 수 있다.
즉, 바이너리 및 DLL에서 사용하고 있거나 외부로 노출시켜 놓은 함수가 어떤 것이 있는지 알아볼 수 있다.


Denpendency Walker :

Denpendency Walker : 프로그램과 dll 상호간 의존성을 검사하는 기능 win32 프로그램 실행시 어떤 오류가 발생했는지, 사용하고 있는 API 함수와 사용자 함수의 이름, 사용하고 있는 DLL의 이름, C++ 같은 경우에는 함수 이름과 return 타입도 알수 있다.


File->Open->실행파일 후 Profile->Start Profiling 하면 된다.



dumpbin :
dumpbin은 콘솔 명령어이다. 옵션은 오션 지정자(대시(-) or 슬래시(/))와 그 다음에 나오는 옵션 이름으로 구성되어 있다. DUMPBIN은 표준 출력으로 정보를 보내지만 출력을 파일로 보내려면 /OUT 옵션을 사용하면 된다.

옵션

/ALL : 코드 디스어셈블리를 제외한 사용 가능한 모든 정보를 표시하며, 디스어셈블리를 표시하려면 /DISASM을 사용해야 한다. /RAWDATA:NOTE을 /ALL과 함께 사용하여 파일의 원시 이진 정보를 생략할 수 있다.

/ARCHIVEMEMBERS : 라이브러리의 멤버 개체에 대한 최소 정보를 표시한다.

/CLRHEADER : 관리되는 모든 프로그램에서 사용하는 .NET 헤더 정보를 표시하며, 출력은
.NET 헤더 및 헤더 섹션의 위치와 크기를 바이트 단위로 보여준다.

/DEPENDENTS : 이미지에서 함수를 가져오는 DLL 이름을 덤프하며, 가져온 함수의 이름은 덤프하지 않는다.

/DIRECTIVES : 컴파일러가 생성한 이미지의 .drective 섹션을 덤프한다.

/DISASM : 파일에 기호가 있는 경우 그 기호를 사용하여 코드 섹션의 디스어셈블리를 표시한다. 관리되는 이미지가 아닌 네이티브 이미지에 대해서만 사용해야 한다.

/EXPORTS : 실행 파일 또는 DLL에서 내보낸 모든 정의(함수)를 표시한다.

/FPO : FPO(프레임 포인터 최적화) 레코드를 표시한다.

/HEADERS : 파일 헤더와 각 섹션의 헤더를 표시하며, 라이브러리와 함께 사용할 경우 각 멤버 개체의 헤더를 표시한다.

/IMPORTS : 표시된 출력은 /EXPORTS와 유사하며 import하여 사용한 함수들을 표시한다.

/LOADCONFIG : Windows NT 로더에서 사용하고 WINNT.H에 정의된 선택적 구조체인
IMAGE_LOAD_CONFIG_DIRECTORY 구조체를 덤프한다.

/OUT : 출력할 filename을 지정할 때 사용한다. 기본적으로 DUMPBIN은 표준 출력에 정보를 표시한다.

/RELOCATIONS : 개체 또는 이미지의 모든 재배치를 표시한다.

/SECTION : 정보 출력을 지정한 section으로 제한한다.

/SUMMARY : 전체 크기를 포함하여 섹션의 최소 정보를 표시하고, 다른 옵션을 지정하지 않은 경우 이 옵션이 기본 값으로 적용된다.

/SYMBOLS : COFF 기호 테이블을 표시하며, 기호 테이블은 모든 개체 파일에 있다. COFF 기호 테이블은 이미지파일이 /DEBUG로 링크된 경우만 이미지 파일에 나타난다.

/TLS : TLS는 TLS 구조체의 필드와 TLS 콜백 함수의 주소를 표시한다.
프로그램에서 스레드 지역 저장소를 사용하지 않는 경우, 해당 이미지에는 TLS 구조체가 포함되지 않는다. IMAGE_TLS_DIRECTORY는 winnt.h에 정의된다.

/UNWINDINFO : exe, dll 같은 프로그램 이미지의 SHE(구조적 예외 처리) 테이블 해제 설명자를 덤프한다. IPF(Itanium Processor Family) 이미지에 대해서만 작동한다.

(참고 : dumpbin을 실행시켰는데 다음과 같은 오류가 뜬다면
mspdb80.dll을 검색한 후 경로를 내컴퓨터->속성->고급->환경 변수->PATH 변수 값에 추가해주면 된다)

winmine.exe가 어떤 함수를 사용하고 있는지 확인해보겠다.


depends.txt 를 열어보면

WINMM.dll
               1001168 Import Address Table
               1004378 Import Name Table
              FFFFFFFF time date stamp
              FFFFFFFF Index of first forwarder reference

dll 파일과 세부 정보가 나타난다.

WINMM.dll 파일이 어떤 기능을 하는 dll인지 export 해보면 된다.

dumpbin/exports winmm.dll > winmm.txt

ordinal hint RVA      name
          3    0 00003894 CloseDriver = _DrvClose@12
          4    1 0000E382 DefDriverProc = _DefDriverProc@20
          5    2 000054A9 DriverCallback = _DriverCallback@28