[Pwn tips] Remove Symbol

코코·2023년 4월 17일
0

Pwn-tools & tip

목록 보기
4/8

오늘은 Memo용으로 바이너리 파일의 Symbol을 제거하는 방법을 적어보려한다.
컴파일 시, 특정 옵션만 준다면 디컴파일했을 때 Symbol들이 제거되어 분석하기 어렵다!


✔ Sample Code

간단한 코드를 하나 작성해봤다.

  • coco.c
#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;
}

✔ Compile

해당 코드를 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 함수명이 모두 잘 보인다.



✔ Symbol 제거

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

profile
화이팅!

0개의 댓글