2. 목차
• 리버싱 툴
• Disassembler, Debugger
• IDA Pro
• 시작
• 기본 창
• 기능 자세히 보기
• 디버거
• 리모트 디버깅
• IDA + Ollydbg 연동
• gdb
• 기본 명령어
• gdb dashboard
• 명령어
• tmux와 함께 쓰기
• 기타
• readelf
• objdump
• objcopy
• strace
• ltrace
• DiE
• 부록
• 참고 사이트
4. DEBUGGER, DISASSEMBLER
• 디버거
• 프로그램을 디버깅하기 위해 이용하는 프로그램
• 프로그램을 직접 실행하고, 메모리나 레지스터 값, 코드 등을 수정해보며 디버깅을 위한 실험을 할 수 있다
• 디스어셈블러
• 기계어를 어셈블리어로 해석해주는 프로그램
• 보통 디버거에는 디스어셈블러도 붙어있다
• 디스어셈블에 특화된 프로그램을 특별히 디스어셈블러라고 부름
• 기존에 이용하던 ollydbg는 PE파일 전용
• ELF 파일을 리버싱하기 위해서는 다른 디버거가 필요
• gdb와 IDA Pro
• gdb : 디버거. 디스어셈블러도 붙어있지만, 디버깅이 주다.
• IDA Pro : 디스어셈블러. 디버깅 기능도 있지만, 디스어셈블 기능이 주다.
5. IDA PRO
• IDA Pro
• 디스어셈블러
• 단순히 디스어셈블만 해 주는 것이 아니라, 코드를 분석하여 전체적인 구조, 사용하는 함수들 등 프로그램 분석에 필
요한 정보들을 종합하여 보여준다
• 그래프 등을 이용하여 시각적으로 보기 쉽게 해 준다
• 자체적인 Plugin대회가 있어 우수한 Plugin이 많다
• 디버거도 포함되어 있다
• 다른 우수한 디버거와 연계하여 이용할 수 있다
• IDA Pro에서 알아낸 정보들을 디버거에 적용하여 코드를 보기 쉽게 함
6. IDA PRO 프로그램 폴더
• cfg
• 설정 파일이 있음
• idc
• IDA의 내장 스크립트에서 필요한 핵심 파일이 있음
• loaders
• PE나 ELF파일같이 알려진 파일 포맷을 파싱하고 인식하는 파일 로딩 절차 시 필요한 확장 기능을 담고 있음
• plugins
• 기능추가를 쉽게 하기 위한 모듈. 사용자 정의 모듈이나 IDA 모듈이 있음
• procs
• 디스어셈블 기능들이 있음
• sig
• 기존 코드의 다양한 패턴 매칭 작업을 수행할 때 사용할 시그니처를 담고 있음
• 패턴 매칭을 이용하면 알려진 라이브러리 코드를 판별해 분석하는 작업 시 소요되는 시간을 줄여준다
• til
• 컴파일러 라이브러리의 데이터 구조 레이아웃을 기록
7. IDA PRO 사용해보기 – 시작
• IDA Pro를 시작하면 보이는 화면
• New : 새로운 파일을 연다
• Go : 로딩 절차를 끝내고 비어 있는 워크스페이스를 시작
• Previous : 최근에 사용한 파일을 열 수 있다
8. IDA PRO 사용해보기 – 시작
• 파일 로딩
• 파일의 특징 등을 설정하는 창이 뜬다.
• 보통은 IDA가 해석한 정보로 설정되어 있음
• 파일 타입
• 파일을 열면, 파일 타입을 선택하라 한다.
• 오른쪽의 목록은 IDA 로더가 가장 적합하다고 생
각한 파일 타입을 보여준 것
9. IDA PRO 사용해보기 – 시작
• 파일 로딩
• Processor type
• 디스어셈블을 수행할 프로세서 모듈
• IDA의 proc 디렉토리에 있음
• 기계어를 어떤 CPU를 기준으로 해석할 것인가
10. IDA PRO 사용해보기 – 시작
• 파일 로딩
• Kernel Opions
• 디스어셈블리 옵션을 건드릴 수 있음
• 보통은 기본이 가장 알맞음
• Processor Options
• 프로세서 모듈에 적용할 옵션을 수정할 수 있음
• Options
• 프로그램을 분석할 때 넣을 각종 옵션들
• ->이것들은 그다지 건들 일이 없음
11. IDA PRO 사용해보기 – 시작
• IDA 데이터베이스 파일
• 파일 로딩의 실제 작업이 수행되면 맨 왼쪽 그림과 같은 파일들이 생성된다.
• EXE를 분석한 정보들이 저장됨 (데이터 베이스 파일)
• IDA Pro에서 현재 프로젝트를 닫으면 이 파일들이 하나의 파일로 묶이고, 맨 왼쪽 그림의 파일들은 삭제된다.
• IDB파일
• 일반적으로 IDA 데이터베이스 파일은 이 파일을 의미
• 프로젝트를 닫을 때, 맨 오른쪽 그림의 창이 뜬다
• Don’t pack database 시 idb를 생성하지 않고 수정 사항을 적용
• pack database (Store) 시 idb를 만들지만 압축은 하지 않음
• pack database (Deflate) 시 압축까지 함
• Don’s save the database는 분석한 파일들을 전부 삭제하고 종료됨
• IDA는 앞으로 작업할 때 이 데이터 베이스 파일들을 이용한다.
• 코드 등을 수정하면, 원본 EXE가 변현되는 것이 아니라 데이터베이스의 데이터에서만 변경됨
12. IDA PRO 사용해보기 – 기본 창
• 툴바 영역
• 자주 쓰는 동작을 모아 놓은 것
• View-Toolbars에서 추가/제거 가능
13. IDA PRO 사용해보기 – 기본 창
• 탭
• 현재 열려 있는 데이터를 볼 수 있음
• View – Open subviews로 열 수 있다.
• IDA View : 디스어셈블리어 코드와 데이터들
• Hex View : 메모리의 헥사 덤프
• Imports : import하는 함수 정보
• Exports : export하는 함수 정보
14. IDA PRO 사용해보기 – 기본 창
• 디스어셈블리 뷰
• 기본적인 데이터 디스플레이 화면
• space bar를 누르면 그래프 뷰로 볼 수 있다.
15. IDA PRO 사용해보기 – 기본 창
• 그래프 뷰
• space bar를 누르면 디스어셈블리
뷰로 전환할 수 있다
16. IDA PRO 사용해보기 – 기본 창
• 그래프 오버뷰
• 전체 구조를 보여주는 창
• 그래프 오버뷰에서 원하는 위치를
클릭하면 그래프 뷰에서 그
곳으로 이동한다.
17. IDA PRO 사용해보기 – 기본 창
• 디스어셈블리 뷰
• 기본적인 데이터 디스플레이 화면
• space bar를 누르면 그래프 뷰로 볼 수 있다.
18. IDA PRO 사용해보기 – 기본 창
• 출력 창
• IDA가 생성한 정보를 보여줌
• 파일 분석 단계에서 얻은 상태 메시지와
사용자 요청에 따른 동작 결과도 보여 줌
• 콘솔 출력 결과를 보여줌
20. IDA PRO 사용해보기 – 기능 자세히 보기
• Quick view
• 단축키 : Ctrl + 1
• 원하는 창으로 바로 이동하거나
창을 열 수 있다.
• 단축키가 있다면, 알려준다.
21. IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창
• IDA 뷰 창 이라고도 함
• 2가지 표시 방식이 가능
• 텍스트 뷰와 그래프 뷰
• 아래는 텍스트 뷰
22. IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 텍스트 뷰
• 전체 디스어셈블리
목록을 보여주고
바이너리의 데이터를 볼
수 있다
23. IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 텍스트 뷰
• 맨 왼 쪽에 화살표로
흐름을 보여준다
• 조건 점프는 점선
24. IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 텍스트 뷰
• ; 뒤는 주석
• ;를 누르면 repeatable 주석을 쓸
수 있다
• 해당 코드를 참조하는
곳에서도 보임
• 아래 그림은 call하는 주석에
repeatable 주석을 단 예
• :를 누르면 일반 주석을 쓸 수 있다
25. IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 텍스트 뷰
• 코드를 시작하기 전에, 이 루틴에서
이용하는 지역변수 오프셋에 이름을
붙인다
• 코드에서는 이름을 이용하여
조금 더 이해하기 쉽게 해 준다
• (여태 보던 예와는 다른 프로그램을
이용했음)
26. IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 그래프 뷰
• 코드를 기본 블록으로 쪼개고 플로우
차트와 비슷한 모습을 보여준다
• 기본 블록 : 분기 없이 최대한 실행할
수 있는 인스트럭션들
• 조건 점프로 끝나는 기본 블록은 조건에
따라 2가지 플로우가 가능
• 점프 채택(Yes)는 기본 초록색
• 점프 기각(No)은 기본 빨간 색
27. IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 그래프 뷰
• 블록의 제목 부분을 드래그하면 블록의
위치를 보기 좋게 옮길 수 있다
• 블록의 제목 부분에서 오른쪽 키 – Group
nodes를 누르면 블록을 작게 줄일 수 있다
• 이미 분석한 루틴을 정리할 수 있음
• ctrl을 누른 상태에서 블록의 제목을
클릭하고 Group node를 누르면
블록을 합칠 수도 있음
• 제목 오른쪽 키 – Ungroup nodes를 누르면
합쳤던 블록 원상 복귀 (그룹을 해제)
• 제목 오른쪽 키 – Unhide Group 으로 다시
코드 펼쳐볼 수 있음 (코드만 펼침, 그룹은
그대로)
28. IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창
• 여러 개 켜서 한 번에
여러 곳의 코드를
보거나 그래프/텍스트
뷰를 같이 볼 수도
있음(다른 창도
마찬가지)
29. IDA PRO 사용해보기 – 기능 자세히 보기
• Proximity browser
• 호출하는 함수와 이용하는
전역변수 등을 보여줌
• 앞과 같이 축소, 펼치기 가능
• (여태 보던 예와는 다른
프로그램을 이용했음)
30. IDA PRO 사용해보기 – 기능 자세히 보기
• Generate pseudocode
•IDA Pro에는 Hex-ray라는 디컴파일러가 있다
•어셈블리어를 해석하여 C언어 형태의
pseudocode를 만들어 준다
31. IDA PRO 사용해보기 – 기능 자세히 보기
• Hex dump
• 메모리 헥사 덤프
• 메모리에 올라올 내용으로 예측 가능한
부분만 보여 줌
• 기본적으로 첫 번째 헥사 덤프는 첫 번째
디스어셈블 창과 동기화 되어 있음
• 한 쪽에서 스크롤을 옮기면 다른
창에서도 옮겨 짐
• 디스어셈블 창 또는 헥사 덤프 창에서 오른쪽
키 – Synchronize with 에서 동기화 설정 변경
가능
32. IDA PRO 사용해보기 – 기능 자세히 보기
• Hex dump
• 헥사 덤프 창에서 오른쪽 키 – Edit을 누르면
편집 모드가 된다
• 편집이 끝난 후 다시 오른쪽 키 – Apply
changes를 누르면 편집이 적용된다
33. IDA PRO 사용해보기 – 기능 자세히 보기
• Exports
• Entry Point 목록을 보여 줌(파일 진입점)
• 실행파일의 경우 최소 한 개의 엔트리(프로그램
실행 진입점)이 있음
• DLL과 같은 경우는 각 함수 주소가 진입점
34. IDA PRO 사용해보기 – 기능 자세히 보기
• Imports
• 모든 임포트된 함수 목록
• 바이너리가 공유 라이브러리를 사용할 때만 유효
• PE의 경우 IAT 주소, ELF의 경우 GOT 주소가 적혀 있음
35. IDA PRO 사용해보기 – 기능 자세히 보기
• Names
• 전역 이름 모음
• 이름 : 가상 주소에 매칭되는 심볼
• IDA가 분석해서 이름을 붙여 놓은 것도 있음
• 점프 목적지 등
• 더블클릭 시 관련 위치로 이동 가능
36. IDA PRO 사용해보기 – 기능 자세히 보기
• Functions
• IDA가 식별한 모든 함수를 보여줌
• 사용자 정의 함수에는 IDA가 직접 이름을 붙임
• 동적 라이브러리 함수 등, 사용하는 함수들에 대한
정보를 전부 모음
• Locals : 사용하는 스택 크기
• Arguments : 함수 인자 크기
• (여태 보던 예와는 다른 프로그램을 이용했음)
37. IDA PRO 사용해보기 – 기능 자세히 보기
• Functions
• R : Function이 끝나고 caller로 돌아 감
• F : far function
• L : Library function
• S : static function
• B : BP based frame
• EBP로 지역변수를 참조
• T : function has type information
• 함수 호출 규약 등 추가 정보가 있으면 체크
• = : Frame pointer is equal to the initial stack pointer
• EBP == ESP
38. IDA PRO 사용해보기 – 기능 자세히 보기
• Strings
• 프로그램이 사용하는 모든 문자열들을
모아 놓음
• Address : 문자열이 저장된 위치
• Type : 문자열의 타입
• 오른쪽 키 – Setup 에서 어떤 것을 문자열로
판단할지 정할 수 있다.
• 왼쪽에 보이는 현재 설정은 ASCII
코드로 이루어진, 최소 길이 5
이상의, NULL로 끝나는 데이터를
문자열로 판단
39. IDA PRO 사용해보기 – 기능 자세히 보기
• Segments
• 바이너리 파일에 있는 세그먼트 목록을 요약해 보여줌
• CPU의 세그먼트와 혼동 X!!!
• 흔히 말하는 section을 의미
• 시작주소, 끝 주소, 권한,
• 메모리에 올리는 section에 대해서만 보여줌
• es, ss 등은 옛날 프로그램에서 이용하는 세그먼트와 관련
• (위는 계속 보던 예제 프로그램, 아래는 다른 예제 프로그램)
40. IDA PRO 사용해보기 – 기능 자세히 보기
• Structures
• 바이너리에서 사용됐다고 판단된 C 구조체나 공용체 같은 복합
구조체를 보여줌
• (여태 보던 예와는 다른 프로그램을 이용했음)
• Enumerations
• 위와 비슷함
• 열거형 데이터 타입을 찾았다면 나타내 줌
41. IDA PRO 사용해보기 – 기능 자세히 보기
• Cross references
• 찾고자 하는 주소나 대상을 클릭한 후 Cross
references 버튼을 누르면 해당 대상을 참조하는
코드 목록을 보여준다
• string을 이용하는 코드 찾기나 특정 함수를
호출하는 코드 찾기 등에 유용
42. IDA PRO 사용해보기 – 기능 자세히 보기
• Function calls
• 분석하길 원하는 함수를 코드에서 선택하고 Function calls를
누름
• 해당 함수를 호출하는 코드 주소와 해당 함수에서 호출하는
함수를 나열해준다
• 위는 해당 함수를 호출하는 코드 주소
• 밑은 해당 함수가 호출하는 함수들
• (여태 보던 예와는 다른 프로그램을 이용했음)
43. IDA PRO 사용해보기 – 기능 자세히 보기
• Notepad
• 간단히 기록을 할 수 있음
• Patched bytes
• 패치한 바이트에 원래 있던 값과 변경한 값을 알 수 있음
44. IDA PRO 사용해보기 – 디버거
• 디버거
• 디버깅을 처음 시도하면 어떤 디버거를
이용할 지 선택하는 창이 나온다.
• Remote debugger를 이용하면 virtual
machine이나 다른 컴퓨터에서 대상
프로그램을 실행하며 디버깅할 수 있다.
• IDA는 올리디버거처럼 실시간 코드
수정이 안 된다
45. IDA PRO 사용해보기 – 디버거
• 디버거
• ollydbg와 비슷한 구조
• 맨 왼쪽에 레지스터가 가리키는 곳을
표시한다
• 단축키
• F2: break point
• F7 : step into
• F8 : step over
• F9 : run
• F4 : 커서를 둔 코드까지 실행
• Ctrl + F7 : return까지 실행
• Ctrl + F2 : 디버깅 종료
• ESC : 이전에 커서가 있던 곳으로
되돌아 감 (올리디버거 –와 유사)
46. IDA PRO 사용해보기 – 디버거
• 디버거
• 각 창에서 오른쪽 키 – Synchronize
with 에서 원하는 목록을 선택하면
동기화된다.
• 코드는 기본적으로 EIP 동기화
47. IDA PRO 사용해보기 – 리모트 디버깅
• IDA Pro를 실행중인 컴퓨터 local에서 해당 파일 포맷의 파일
을 실행할 수 없는 경우 리모트 디버깅을 이용할 수 있다
• IDA Pro 폴더 – dbgsrv 폴더에서 서버 프로그램을 분석하고자 하는 환경에
맞는 컴퓨터나 가상 머신에 올린다.
• 숫자가 안 붙은 것은 32비트, 붙은 것은 64비트이다.
• IDA pro 32비트를 이용중이라면 32, 64라면 64
• IDA pro N비트는 N비트 프로그램을 분석하기 위한 것
48. IDA PRO 사용해보기 – 리모트 디버깅
• 디버깅 대상 프로그램을 실행할 컴퓨터나 가상머신에서 서버를 실행한다.
• 옵션을 주면 IP나 port를 변경할 수 있다
• 포트는 default로 23946
49. IDA PRO 사용해보기 – 리모트 디버깅
• IDA pro에서 디버거를 remote debugger로 설정한 뒤
실행한다
• 왼쪽과 같은 창이 뜬다
• Hostname에 본인 IP주소를 넣고, port 번호를 넣는다.
• parameters로 main 함수 인자를 넣을 수 도 있다.
• OK를 누른 후 디버깅을 진행하면 된다.
50. IDA PRO 사용해보기 – IDA + OLLY 연동
• IDA Pro에서 정적분석하여 쓴 주석과 label
을 올리디버거로 가져올 수 있다.
• File – Produce file – Create MAP file 클릭하
여 Map파일을 저장
51. IDA PRO 사용해보기 – IDA + OLLY 연동
• 왼쪽 아이콘을 더블 클릭하여 다운
• Ollydbg plugin 폴더에 넣는다.
52. IDA PRO 사용해보기 – IDA + OLLY 연동
• 올리디버거에 분석한
EXE를 올린다.
53. IDA PRO 사용해보기 – IDA + OLLY 연동
• 올리디버거에서 Plugins – MapConv – Replace lable을 누른다.
• 디스어셈블리어 코드의 label이 IDA에서 쓴 것으로 바뀐다.
54. IDA PRO 사용해보기 – IDA + OLLY 연동
• 올리디버거에서 Plugins – MapConv – Replace comment를 누른다.
• IDA에서 쓴 주석으로 바뀐다.
55. GDB
• 다양한 유닉스 기반의 시스템에서 동작하는 이식성 있는 디버거
• 대부분의 유닉스 기반 시스템에 설치되어 있음
• 오픈소스
• GDB는 원격 디버깅을 지원한다
• 임베디드 시스템을 디버깅할 때 이용
• emacs를 이용하여 GUD(Grand Unified Debugger)라는 형태로 더 보기 쉽게 이용할 수 있다
• ->나중에 다루겠음
• 명령어 사용법을 잘 모를 때
• help 명령어 라고 치면 사용법이 나온다
56. GDB 명령어
• set disassembly-flavor [원하는 형식]
• 디스어셈블리어를 intel, att 등의 형식으로 출력한다
• Ex) set disassembly-flavor intel
• disas
• disas [함수이름] 형태로 씀
• 이외에도 여러 Syntax가 있음, 정확한 Syntax는 부록의 참고 사이트
찾아볼 것
• 함수의 어셈블리 코드를 보는 명령어
• 함수에 포함된 부분만 가능 (특정 주소만을 알고 싶다면 뒤의 방법
이용)
• disass나 disassemble이라고 써도 됨
• 심볼 테이블에 이름이 있어야 함수 이름을 이용할 수 있음
57. GDB 명령어
• b
• 특정 주소에 breakpoint를 거는 명령어
• break라고도 씀
• b *[메모리 주소]
• 특정 주소에 BP를 검
• b *[함수 이름]이나 b *[함수이름 + offset] 형태로도 이용 가능
• info b
• info 명령어 뒤에 b를 붙이면 BP 정보를 볼 수 있음
• info를 줄여서 i라고도 씀
• d
• d [숫자]
• 해당 번호의 BP를 삭제함
• delete라고도 쓸 수 있음
• d만 쓸 경우
• 모든 BP 삭제
58. GDB 명령어
• r
• r [매개변수] 형태로 씀
• main에 넘기는 매개변수. 없어도 된다면, 없어도 됨
• gdb 내부에서 프로그램 실행
• BP를 만날 때까지 실행
• run이라고 쓰기도 함
• c
• run한 이후 다음 BP까지 실행
• continue라고도 씀
59. GDB 명령어
• ni
• 다음 인스트럭션 실행
• Step over와 같음
• nexti라고도 씀
• 뒤에 숫자를 쓸 시 그만큼의 인스트럭션을 실행
• si
• 다음 인스트럭션을 실행
• Step into와 같음 (함수 내부까지 들어감)
• stepi라고도 씀
• 뒤에 숫자를 쓸 시 그만큼의 인스트럭션을 실행
• 어셈블리어가 아니라, C 등 고급 언어 레벨에서 한 줄 실행할 때는 n과
s (next와 step)을 이용
• finish
• 함수의 끝나는 지점으로 이동
• 함수의 코드들은 정상 실행
• return
• 함수의 남은 부분을 수행하지 않고 빠져나온다.
60. GDB 명령어
• info r
• 레지스터 정보를 알려준다
• info를 줄여서 i로도 표기
• r을 registers로도 표기
• info r [레지스터이름]
• 특정 레지스터에 저장된 값을 표시
• info r
• 모든 레지스터 값을 보여 줌(floating-point와 vector register 제외)
• info all-registers
• 위에서 제외한 레지스터까지 포함해 출력
61. GDB 명령어
• x
• 메모리 조사를 위한 명령어
• 옵션으로 표시할 진법과 바이트 단위, 표시할 개수를 준다
• 혹은 디스어셈블된 명령어의 명령을 보거나 문자열 형태로 볼 수 있다
• 메모리를 뽑아볼 때는 항상 리틀 엔디안에 주의!!
• 옵션
• 진법
• o : 8진법
• x : 16진법
• u : 10진법
• t : 2진법
• 단위
• b : 1바이트
• h : 2바이트 (half word)
• w : 4바이트 (word)
• g : 8바이트 (giant)
• 형식
• i : 역어셈블된 코드
• c : 바이트를 ASCII로 해석하여 보여줌
• s : 문자 데이터의 전체 문자열을 보여준다
0x80482E0 주소부터 4개의
instruction을 인쇄
ESP 레지스터에 저장된 주소에 저장된 값부터
4바이트 만큼을 16진수로 표기
0xFFFFCC4C에 저장된 값을 주소삼아
따라가면 있는 값 (더블 포인터 느낌)
0xFFFFCC50에 저장된 값을 주소삼아
따라가서 거기 있는 값을 ASCII로
해석해 보여줌, 12개 해석해 봄
0xFFFFCC50에 저장된 값을 주소삼아
따라가서 거기 있는 값을 string으로 보고,
null을 만날 때까지 적어 줌, 3개 해석해 봄
62. GDB 명령어
• display
• s, n, si, ni 등 프로그램을 진행할 때마다 화면에 값을 자동으로 출력해주기
• 등록해 둔 주소나 레지스터에 있는 값을 출력해준다
• display [레지스터]나 display *[메모리], display *[레지스터] 등
• disp라고도 씀
• 옵션으로 개수와 단위를 줄 수 있음
• Ex) disp/4x $esp는 ESP에서부터 16byte 만큼을 출력
• undisplay
• undisplay [번호] 형식으로 display에 등록해 둔 목록을 지울 수 있다
• 번호가 없이 undisplay만 하면 전부 지움
• undisp라고도 씀
63. GDB 명령어
• p
• 확인하고 싶은 변수 값이나 레지스터 값, 함수 주소 등을 출력해 줌
• print로도 쓴다
• 옵션을 통해 진법 조정 가능
• set
• 변수나 특정 메모리의 값을 변경함
• set [변수] = 원하는 값
• 디버깅 모드로 컴파일한 프로그램은 가능
• set {타입} 주소 = 원하는 값
• 해당 주소에 값이 들어 감
• set {타입} 레지스터 = 원하는 값
• 레지스터에 저장된 값을 주소로 여기고, 해당 주소에 값을 넣음
• set 레지스터 = 원하는 값
• 레지스터에 있는 값을 변경
64. GDB DASHBOARD
• gdb Dashboard 프로그램을 이용하
면 조금 더 편하게 gdb를 이용할
수 있다.
• 오른쪽이 gdb Dashboard를 이용한 모습
• 보통 tmux와 함께 쓰인다
• tmux : Terminal Multiplexer의 약자. 터미
널 환경을 좀 더 편리하게 만들어주는
프로그램
• 화면을 분할하여 사용하거나, 탭을
여러 개 만들어 사용할 수 있다.
65. GDB DASHBOARD
• 터미널에 wget –P ~ git.io/.gdbinit 을 써서 설치
• 일반적인 gdb를 쓰는 것처럼 이용
• 기본적인 gdb명령어로 디버깅 진행
66. GDB DASHBOARD 명령어
• dashboard를 위한 명령어 (gdb를 위한 명령어 아님)
• 맨 앞에 dashboard를 치고 입력함
• dashboard -layout : 레이아웃 정보를 준다
• 터미널에서 tty 명령어를 입력하면, 현재 표준 입력에 연결되어 있는
터미널의 파일 명을 보여준다.
• 원하는 터미널의 파일 명을 얻은 후, dashboard에 설정해 주면 해당 터
미널에 출력된다.
• default는 보통 현재 이용중인 터미널에 전부 출력됨
• dashboard 레이아웃요소이름 -output 터미널경로
• 해당 요소를 표시할 터미널을 지정
• dashboard 레이아웃요소이름
• 해당 요소를 숨기거나 보일 수 있음
67. GDB DASHBOARD 명령어
• dashboard를 위한 명령어 (gdb를 위한 명령
어 아님)
• 현재까지의 상황
• 이렇게 적절히 터미널 화면을 분할하고, 원하는 위
치로 레이아웃을 잡아주면 된다
• 추가할 점?
• 어셈블리어를 너무 적게 보여줌
• 메모리에 내용이 없음?
68. GDB DASHBOARD 명령어
• dashboard를 위한 명령어 (gdb를 위한 명령어 아님)
• dashboard 레이아웃요소이름 -style 설정내용
• 레이아웃의 구성 요소들 각각의 설정을 조정하는 명령어
• 설정 내용을 쓰지 않고 명령어를 치면 설정들을 보여준다
• 오른쪽에서는 어셈블리어에 기계어도 표시하고, 더 많은 코드를 표시
할 수 있도록 설정했다.
69. GDB DASHBOARD 명령어
• dashboard를 위한 명령어 (gdb를 위한 명령어 아님)
• dashboard memory watch 주소 개수
• 메모리 영역에 주소부터 시작해서 원하는 개수만큼 출력해준다.
• Ex) dashboard memory watch 0xffffcc68 0x100
• 오른쪽 그림처럼 나옴
• 설정 저장
• ~/.gdbinit.d 디렉토리를 만들고, dashboard에서 다음 명령어를 입력
• dashboard –configuration ~/.gdbinit.d/auto
70. GDB DASHBOARD + TMUX
• tmux 설치
• sudo apt-get install tmux
• tmux 실행
• 터미널에서 tmux 입력
• tmux 명령어
• Ctrl + b를 누르면 단축키를 입력할 수 있음
• Ctrl + b 후에 :를 누르면 단축키 외 긴 명령어 입력 가능
• 새 윈도우(탭) 만들기, 윈도우 전환하기
• 윈도우 분할하기 (팬(pane) 기능), 팬 전환하기
• 레이아웃 변경하기
71. GDB DASHBOARD + TMUX
• tmux 명령어
• 단축키
• Ctrl-b c : 새로운 윈도우(탭)가 열림
• 윈도우를 하나 더 만든 모습
• 맨 아래 1:bash*가 추가된 것을 볼 수 있다
• *표시가 있는 것이 현재 윈도우
• Ctrl-b & : 윈도우 종료
• Ctrl-b n : 다음 윈도우로 이동
• Ctrl-b p : 이전 윈도우로 이동
• Ctrl-b w : 윈도우의 리스트를 보여주고, 번호를 입력하거나 목록에서 고르면
해당 윈도우로 이동함
• 오른쪽 그림이 Ctrl-b w를 누른 모습
• Ctrl-b 윈도우번호 : 해당 윈도우로 이동
• Ctrl-b , : 현재 윈도우의 이름을 바꾼다
72. GDB DASHBOARD + TMUX
• tmux 명령어
• 단축키
• Ctrl-b % : 세로로 pane 분할
• Ctrl-b " : 가로로 pane 분할
• Ctrl-b x : 포커스 되어있는 pane 삭제
• Ctrl-d도 같음
• 또는 해당 터미널에 exit 입력
• Ctrl-b q : pane 번호를 보여 줌
• 번호가 떠있는 상태에서 번호 누르면 해당 번호 pane으로 이동
• Ctrl-b 방향키 : 해당 방향에 있는 pane으로 이동
• Ctrl-b o : 다음 pane으로 이동
• Ctrl-b { : 왼쪽 pane으로 이동
• Ctrl-b } : 오른쪽 pane으로 이동
• Ctrl-b space : pane의 레이아웃 변경
73. GDB DASHBOARD + TMUX
• tmux 명령어
• 단축키
• Ctrl-b <alt> 방향키 : 현재 pane의 사이즈를 조정한다
• Ctrl-b 후에 :를 누른 후 다음 명령어 입력 시 pane 크기 조절
• resize-pane –U 숫자 : 현재 pane을 위쪽으로 숫자 Row 크기만큼 조절
• resize-pane –D 숫자 : 현재 pane을 아래로 숫자 Row 크기만큼 조절
• resize-pane –L 숫자 : 현재 pane을 왼쪽으로 숫자 Row 크기만큼 조절
• resize-pane –R 숫자 : 현재 pane을 dhfms쪽으로 숫자 Row 크기만큼 조절
74. GDB DASHBOARD + TMUX
• tmux 명령어
• 단축키
• Ctrl-b d : tmux 클라이언트에서 detach
• tmux에서 떨어지고 원래 터미널로 돌아옴
• detach 후 터미널을 꺼도 실행중인 프로그램 등은 계속 실행 중으로 있음
• detach는 종료가 아님
• 다시 tmux 클라이언트에 붙이기
• 터미널 명령줄에 tmux attach 입력
• 방금 쓰던 세션 클라이언트로 돌입
• 터미널 명령줄에 tmux attach-session -t 세션이름 입력
• 특정 세션 클리이언트로 돌입
• 실행중인 세션 이름(또는 번호) 알아내기
• 터미널 명령줄에 tmux list-session 입력
• tmux ls로 줄여 쓸 수 있음
• 세션 종료하기
• 터미널 명령줄에 tmux kill-session -t 세션이름 입력
• 또는 tmux에서 모든 window를 전부 다 삭제하면 종료 됨
75. GDB DASHBOARD + TMUX
• tmux로 분할한 화면을 dashboard가 이용할 수 있도록 함
• tty로 터미널 경로를 알아낸 뒤 설정하면 됨
• ~/.tmux.conf 파일 생성 후 설정을 써 주면 자동으로 설정
이 적용된다.
• 마우스를 이용하여 pane 선택/windows 전환 등을 할 수 있다.
• set-option -g mouse on
• set-option -g history-limit 10000
77. READELF
• ELF 파일 포맷 내용을 정리하여 보여줌
• 옵션에 따라 내용 출력
• h : 파일 헤더 (ELF 헤더)
• l : 프로그램 헤더 테이블
• S : 섹션 헤더 테이블
• s : 심볼 테이블
• e : 헤더 전부 출력 (-h -l -S) 옵션과 같음
• r : relocation 관련
• d : dynamic linking 관련
• a : all (전부 출력)
78. OBJDUMP
• 목적 파일에서 정보를 읽어 내기 위한 프로그램
• elf 파일 포맷에서 정보를 읽어내는 프로그램. 역시 옵션에 따라 원하는 정보를 준다.
• 디스어셈블러 코드를 보기 위해 자주 이용
• -d : 디스어셈블한 코드를 보여줌
• 옵션에 –M intel 를 추가하면 인텔 문법으로 보여 줌
• -S 옵션을 추가하면, 가능하다면 원본 소스와 같이 출력해 준다(디버깅 모드로 컴파일 시 가능)
• -f : elf 헤더 (파일 헤더) 출력
• -s : 헥사 덤프를 보여줌(올라갈 메모리 주소와 함께)
• -tT : 모든 심볼들을 보여 줌
86. 참고 사이트
• Subview의 Segments의 segment 레지스터들
• https://reverseengineering.stackexchange.com/questions/9277/whats-the-use-of-segments-registers-sub-view-of-ida-pro
• IDA + Olly 연동
• http://rayforever.tistory.com/6
• disassemble 명령어
• http://visualgdb.com/gdbreference/commands/disassemble
• n, s, ni, si 명령어 차이
• https://kldp.org/node/103774
• x 명령어와 옵션
• http://create32.tistory.com/entry/GDB-%EC%82%AC%EC%9A%A9%EB%B2%95-x-%EB%AA%85%EB%A0%B9%EC%96%B4
• gdb 디버깅 테크닉
• http://sosal.kr/128
87. 참고 사이트
• gui로 gdb를 이용하는 여러가지 방법들
• https://reverseengineering.stackexchange.com/questions/1392/decent-gui-for-gdb
• TMUX 이용법
• https://blog.outsider.ne.kr/699#footnote_link_699_1
• https://bluesh55.github.io/2016/10/10/tmux-tutorial/
• TMUX Configuration
• http://www.hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/
• gdb dashboard github 페이지 (설치 방법, 사용 방법 있음)
• https://github.com/cyrus-and/gdb-dashboard
• gdb dashboard 메모리 보는 법
• https://github.com/cyrus-and/gdb-dashboard/issues/15
88. 참고 사이트
• objcopy
• http://damduc.tistory.com/147
• https://sourceware.org/binutils/docs/binutils/objcopy.html
• DiE
• https://github.com/horsicq/Detect-It-Easy
• 다운로드
• http://ntinfo.biz/index.html