오늘은 Memo용으로 바이너리 파일의 Symbol을 제거하는 방법을 적어보려한다.
컴파일 시, 특정 옵션만 준다면 디컴파일했을 때 Symbol들이 제거되어 분석하기 어렵다!
간단한 코드를 하나 작성해봤다.
#include <stdio.h>
void func1();
int func2();
int func3(int num1, int num2);
int main(){
int a;
func1();
a = func2();
return func3(3, 5);
}
void func1(){
printf("[*] Function 1 Called!\n");
}
int func2(){
printf("[*] Function 2 Called!\n");
printf("[!] Return 0\n");
return 0;
}
int func3(int num1, int num2){
printf("[*] Function 3 Called!\n");
return num1+num2;
}
해당 코드를 gcc명령어로 컴파일해보자.
gcc -o coco coco.c -no-pie
아래와 같이 "coco"란 이름의 바이너리 파일명이 생성된 것을 확인할 수 있다.
이제 nm명령어를 통해 coco 바이너리 파일의 Symbol들을 추출해보자.
nm은 라이브러리, 컴파일된 오브젝트 모듈 및 파일, 독립 실행 파일등의 바이너리 파일을 탐색하여 파일들에 저장된 내용 or 메타 정보를 출력해주는 명령어이다.
nm coco
nm [바이너리파일명]을 입력하여, 해당 바이너리 파일에 존재하는 Symbol들을 살펴볼 수 있다.
이번엔 IDA(Freeware)를 통해 열어보았다.
왼쪽의 Functions 창을 보면, 라이브러리에 존재하는 함수, main 함수, 선언한 func1, func2, func3 함수명이 모두 잘 보인다.
CC 등으로 빌드된 형태의 실행 파일 or 오브젝트 파일에서 디버깅 및 심볼을 삭제하는 명령어이다.
명령어는 간단하다. strip 명령어뒤에 바이너리 파일명을 붙여주면 된다.
strip coco
위의 과정처럼 nm명령어를 입력해보고, IDA를 통해 디컴파일(Decompile)해보자.
그 전에 ls -al 명령어를 통해 파일명을 살펴보면 8392 ➡ 6120으로 줄어든 것을 확인할 수 있다.
이제 다시 nm 명령어를 수행해보자.
nm coco
nm 명령어를 입력한 결과. "no symbols" Symbol을 찾을 수 없다는 오류메시지가 나온다.
또한 IDA로 열었을 때도 Functions 창을 보면, 잘 나왔던 함수이름들이 모두 sub로 바뀌어 출력되었다...
-Memo 끗-
※ 참고
👉 https://ko.wikipedia.org/wiki/Nm_(%EC%9C%A0%EB%8B%89%EC%8A%A4)
👉 https://itwiki.kr/w/%EB%A6%AC%EB%88%85%EC%8A%A4_strip