Study Record

[리버싱] 참고 CMD(readelf, nm, objdump/objcopy, strings, binwalk, as, ld) 본문

리버싱/기본

[리버싱] 참고 CMD(readelf, nm, objdump/objcopy, strings, binwalk, as, ld)

초코초코초코 2021. 11. 15. 17:31
728x90

readelf CMD

- https://devanix.tistory.com/186

- ELF 파일의 정보를 확인할 때 사용한다.

 

☞ ELF 헤더

-h, --file-feader : ELF 파일 헤더

-l, --program-header, --semgents  : 프로그램 헤더

-S, --section-headers, --sections : 섹션 헤더

-e, --headers : 위의 세가지 헤더

 

☞ ELF 정보 출력

-s : 심볼 데이터

-r : 재배치 정보

-d : 동작 세그먼트

-V : 버전 섹션

-A : 아키텍쳐 의존 정보

-a : 모든 헤더 정보

 

☞ 디버그 섹션 출력(DWARF2)

-wl : line (.debug_line)

-wi : info (.debug_info)

-wa : abbrev (.debug_abbrev)

-wr : aranges (.debug_aranges)

-wR : Ranges (.debug_ragnes)

-wp : pubnames (.debug_pubnames)

-ws : line (.debug_str)

-wo : lov (.debug_loc)

 

# readelf -S /bin/ls : [Nr] 섹션번호를 확인한다.

# readelf -x3 /bin/ls : -x 옵션 뒤에 섹션번호를 붙이면 그 섹션 내용을 확인할 수 있다.

 

nm CMD

- https://devanix.tistory.com/190

- 오프젝트 파일을 대상으로 파일의 심볼의 리스트를 확인할 수 있다.

- 형식 : nm [options] <obj 파일>

 

☞ 주요 옵션

--size-sort : 심볼 크기를 작은 순으로 정렬

-r : 출력 순서 역순

-r --size-sort : 심볼 크기가 큰 순으로 정렬

-S : 심볼 값을 출력한다. 다음과 같은 행으로 출력된다.

[ 심볼 값 ] [ 심볼 크기 ] [ 심볼 클래스 ] [ 심볼명 ] 

-f [ sysv | posix | 

bsd 

] : 출력 형식 지정

-D : 공유 라이브러리를 동적으로 링크하기 위한 심볼 정보 출력

 

+ 심볼 클래스

A : 심볼 값이 절대값으로 링크해도 변하지 않음.

B : 초기화되지 않은 데이터 영역(BSS)에 존재함.

C : 공유(common) 심볼. 초기화 되지 않은 데이터

D : 초기화된 데이터 섹션에 존재

G : 작은 오브젝트에 사용되며 초기화된 데이터 섹션에 존재

I : 다른 심볼의 간접참조. a.out의 GNU 확장

N : 디버그용 심볼

R : 읽기전용 데이터 섹션에 존재

S : 작은 오브젝트에 사용되며 초기화되지 않은 데이터 섹션에 존재

T : 텍스트 섹션에 존재

U : 정의되지 않은 심볼. 다른 오브젝트 파일 또는 공유 라이브러리에 실제

V : 심볼이 존재

W : weak 오브젝트

- : a.out 오브젝트 파일 내의 stabs 심볼(디버그 정보 등)

? : 알 수 없는 클래스


# nm -D wall.o

# nm -r wall.o

# nm -f sysv wall.o

objdump / objcopy CMD

- https://devanix.tistory.com/187?category=338572

- Object 파일 덤프/복사

 

☞ 옵션

-s, --full-contents : 모든 섹션의 전체 내용 표시

-i, --info : 지정가능한 오브젝츠 형식 출력

-b [object] : 오브젝트 형식 지정

-d, --disassemble : 실행 섹션의 어셈블리 내용 표시

-h : 존재하는 섹션 확인

-j [section] , --section=[section] : 특정 섹션을 지정하여 덤프 

--start-address=[address] / --stop-address=[address] : 덤프할 주소 범위 지정

 

# objdump -s -j .interp /bin/ls

# objdump -d myshell

# objdump -i

 

strings CMD

- https://devanix.tistory.com/191?category=338572

- Binary 파일의 문자열 추출

- 형식 : strings <바이너리 파일>

 

☞ 옵션

-a : 강제적으로 파일 전체를 대상으로 검색한다.

-eS : 8비트로 인코딩한다. - 주로 한글(UTF-8) 을 출력할 때 사용한다.

-t [radix] : 문자열 앞에 파일의 오프셋 출력

※ radix : "x"-16진수 , "d"-10진수, "o"-8진수

 

binwalk CMD

- https://liveyourit.tistory.com/70

- 펌웨어 파일의 구성을 분석할 수 있는 툴로 어떤 데이터가 들어있는지 확인해준다.

- 형식 : binwalk [options] <file1> <file2> ...

 

☞ 옵션

-B : 파일 시그니쳐 분석 옵션이다. (default option)

해당 펌웨어가 어떤 데이터나 파일시스템을 쓰고 있는지 알 수 있다.

-A : 펌웨어 아키텍쳐 분석을 해준다.

-E : 엔트로피 분석을 해준다.

-e : 펌웨어 내부에 알려진 파일 타입을 추출해준다. - 언패킹 가능

 

# binwalk -BE filename.bin

# binwalk -A filename.bin

# binwalk -e filename.bin

as CMD

- https://www.ibm.com/docs/ko/aix/7.2?topic=as-command

- 형식 : as [옵션] <filename>

- 어셈블리로 작성된 소스 파일을 읽고 어셈블한다.

 

☞ 옵션
-a[ 32 | 64 ] : 32비트 혹은 64비트 모드로 설정한다.
-l[Listfile]  : 어셈블리 리스트를 생성한다. 소스 파일 이름의 접미어 확장자를 .lst 로 대체한 이름이 디폴트이다.
-o <objFileName> : 어셈블리 프로세스의 출력할 파일 지정 (default : a.out)

 

# as -o myshell.o myshell.c

ld CMD

- https://ko.eyewated.com/linux-unix-%EB%AA%85%EB%A0%B9-id/

- 많은 수의 객체와 아카이브 파일을 결합하고 데이터를 재배치하여 심볼 참조를 묶습니다. 보통 프로그램을 컴파일하는 마지막 단계는 ld 를 실행하는 것입니다. (GNU 링커(linker))

- 보통 어셈블리 코드를 as 명령어로 어셈블한 다음 ld 명령어로 링킹한다. 

- 형식 : ld [옵션] <objfile>  ...

 

# ld myshell.o -o myshell  :  myshell.o 을 링킹한다음 출력 결과를 myshell 에 저장한다.

728x90