SlideShare une entreprise Scribd logo
1  sur  88
LINUX REVERSING BASIC #3 리버싱 툴
목차
• 리버싱 툴
• Disassembler, Debugger
• IDA Pro
• 시작
• 기본 창
• 기능 자세히 보기
• 디버거
• 리모트 디버깅
• IDA + Ollydbg 연동
• gdb
• 기본 명령어
• gdb dashboard
• 명령어
• tmux와 함께 쓰기
• 기타
• readelf
• objdump
• objcopy
• strace
• ltrace
• DiE
• 부록
• 참고 사이트
DEBUGGER, DISASSEMBLER • IDA Pro
• gdb
DEBUGGER, DISASSEMBLER
• 디버거
• 프로그램을 디버깅하기 위해 이용하는 프로그램
• 프로그램을 직접 실행하고, 메모리나 레지스터 값, 코드 등을 수정해보며 디버깅을 위한 실험을 할 수 있다
• 디스어셈블러
• 기계어를 어셈블리어로 해석해주는 프로그램
• 보통 디버거에는 디스어셈블러도 붙어있다
• 디스어셈블에 특화된 프로그램을 특별히 디스어셈블러라고 부름
• 기존에 이용하던 ollydbg는 PE파일 전용
• ELF 파일을 리버싱하기 위해서는 다른 디버거가 필요
• gdb와 IDA Pro
• gdb : 디버거. 디스어셈블러도 붙어있지만, 디버깅이 주다.
• IDA Pro : 디스어셈블러. 디버깅 기능도 있지만, 디스어셈블 기능이 주다.
IDA PRO
• IDA Pro
• 디스어셈블러
• 단순히 디스어셈블만 해 주는 것이 아니라, 코드를 분석하여 전체적인 구조, 사용하는 함수들 등 프로그램 분석에 필
요한 정보들을 종합하여 보여준다
• 그래프 등을 이용하여 시각적으로 보기 쉽게 해 준다
• 자체적인 Plugin대회가 있어 우수한 Plugin이 많다
• 디버거도 포함되어 있다
• 다른 우수한 디버거와 연계하여 이용할 수 있다
• IDA Pro에서 알아낸 정보들을 디버거에 적용하여 코드를 보기 쉽게 함
IDA PRO 프로그램 폴더
• cfg
• 설정 파일이 있음
• idc
• IDA의 내장 스크립트에서 필요한 핵심 파일이 있음
• loaders
• PE나 ELF파일같이 알려진 파일 포맷을 파싱하고 인식하는 파일 로딩 절차 시 필요한 확장 기능을 담고 있음
• plugins
• 기능추가를 쉽게 하기 위한 모듈. 사용자 정의 모듈이나 IDA 모듈이 있음
• procs
• 디스어셈블 기능들이 있음
• sig
• 기존 코드의 다양한 패턴 매칭 작업을 수행할 때 사용할 시그니처를 담고 있음
• 패턴 매칭을 이용하면 알려진 라이브러리 코드를 판별해 분석하는 작업 시 소요되는 시간을 줄여준다
• til
• 컴파일러 라이브러리의 데이터 구조 레이아웃을 기록
IDA PRO 사용해보기 – 시작
• IDA Pro를 시작하면 보이는 화면
• New : 새로운 파일을 연다
• Go : 로딩 절차를 끝내고 비어 있는 워크스페이스를 시작
• Previous : 최근에 사용한 파일을 열 수 있다
IDA PRO 사용해보기 – 시작
• 파일 로딩
• 파일의 특징 등을 설정하는 창이 뜬다.
• 보통은 IDA가 해석한 정보로 설정되어 있음
• 파일 타입
• 파일을 열면, 파일 타입을 선택하라 한다.
• 오른쪽의 목록은 IDA 로더가 가장 적합하다고 생
각한 파일 타입을 보여준 것
IDA PRO 사용해보기 – 시작
• 파일 로딩
• Processor type
• 디스어셈블을 수행할 프로세서 모듈
• IDA의 proc 디렉토리에 있음
• 기계어를 어떤 CPU를 기준으로 해석할 것인가
IDA PRO 사용해보기 – 시작
• 파일 로딩
• Kernel Opions
• 디스어셈블리 옵션을 건드릴 수 있음
• 보통은 기본이 가장 알맞음
• Processor Options
• 프로세서 모듈에 적용할 옵션을 수정할 수 있음
• Options
• 프로그램을 분석할 때 넣을 각종 옵션들
• ->이것들은 그다지 건들 일이 없음
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가 변현되는 것이 아니라 데이터베이스의 데이터에서만 변경됨
IDA PRO 사용해보기 – 기본 창
• 툴바 영역
• 자주 쓰는 동작을 모아 놓은 것
• View-Toolbars에서 추가/제거 가능
IDA PRO 사용해보기 – 기본 창
• 탭
• 현재 열려 있는 데이터를 볼 수 있음
• View – Open subviews로 열 수 있다.
• IDA View : 디스어셈블리어 코드와 데이터들
• Hex View : 메모리의 헥사 덤프
• Imports : import하는 함수 정보
• Exports : export하는 함수 정보
IDA PRO 사용해보기 – 기본 창
• 디스어셈블리 뷰
• 기본적인 데이터 디스플레이 화면
• space bar를 누르면 그래프 뷰로 볼 수 있다.
IDA PRO 사용해보기 – 기본 창
• 그래프 뷰
• space bar를 누르면 디스어셈블리
뷰로 전환할 수 있다
IDA PRO 사용해보기 – 기본 창
• 그래프 오버뷰
• 전체 구조를 보여주는 창
• 그래프 오버뷰에서 원하는 위치를
클릭하면 그래프 뷰에서 그
곳으로 이동한다.
IDA PRO 사용해보기 – 기본 창
• 디스어셈블리 뷰
• 기본적인 데이터 디스플레이 화면
• space bar를 누르면 그래프 뷰로 볼 수 있다.
IDA PRO 사용해보기 – 기본 창
• 출력 창
• IDA가 생성한 정보를 보여줌
• 파일 분석 단계에서 얻은 상태 메시지와
사용자 요청에 따른 동작 결과도 보여 줌
• 콘솔 출력 결과를 보여줌
IDA PRO 사용해보기 – 기본 창
• 함수 창
• IDA가 식별한 모든
함수들을 보여줌
IDA PRO 사용해보기 – 기능 자세히 보기
• Quick view
• 단축키 : Ctrl + 1
• 원하는 창으로 바로 이동하거나
창을 열 수 있다.
• 단축키가 있다면, 알려준다.
IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창
• IDA 뷰 창 이라고도 함
• 2가지 표시 방식이 가능
• 텍스트 뷰와 그래프 뷰
• 아래는 텍스트 뷰
IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 텍스트 뷰
• 전체 디스어셈블리
목록을 보여주고
바이너리의 데이터를 볼
수 있다
IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 텍스트 뷰
• 맨 왼 쪽에 화살표로
흐름을 보여준다
• 조건 점프는 점선
IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 텍스트 뷰
• ; 뒤는 주석
• ;를 누르면 repeatable 주석을 쓸
수 있다
• 해당 코드를 참조하는
곳에서도 보임
• 아래 그림은 call하는 주석에
repeatable 주석을 단 예
• :를 누르면 일반 주석을 쓸 수 있다
IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 텍스트 뷰
• 코드를 시작하기 전에, 이 루틴에서
이용하는 지역변수 오프셋에 이름을
붙인다
• 코드에서는 이름을 이용하여
조금 더 이해하기 쉽게 해 준다
• (여태 보던 예와는 다른 프로그램을
이용했음)
IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 그래프 뷰
• 코드를 기본 블록으로 쪼개고 플로우
차트와 비슷한 모습을 보여준다
• 기본 블록 : 분기 없이 최대한 실행할
수 있는 인스트럭션들
• 조건 점프로 끝나는 기본 블록은 조건에
따라 2가지 플로우가 가능
• 점프 채택(Yes)는 기본 초록색
• 점프 기각(No)은 기본 빨간 색
IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창 – 그래프 뷰
• 블록의 제목 부분을 드래그하면 블록의
위치를 보기 좋게 옮길 수 있다
• 블록의 제목 부분에서 오른쪽 키 – Group
nodes를 누르면 블록을 작게 줄일 수 있다
• 이미 분석한 루틴을 정리할 수 있음
• ctrl을 누른 상태에서 블록의 제목을
클릭하고 Group node를 누르면
블록을 합칠 수도 있음
• 제목 오른쪽 키 – Ungroup nodes를 누르면
합쳤던 블록 원상 복귀 (그룹을 해제)
• 제목 오른쪽 키 – Unhide Group 으로 다시
코드 펼쳐볼 수 있음 (코드만 펼침, 그룹은
그대로)
IDA PRO 사용해보기 – 기능 자세히 보기
• Disassembly 창
• 여러 개 켜서 한 번에
여러 곳의 코드를
보거나 그래프/텍스트
뷰를 같이 볼 수도
있음(다른 창도
마찬가지)
IDA PRO 사용해보기 – 기능 자세히 보기
• Proximity browser
• 호출하는 함수와 이용하는
전역변수 등을 보여줌
• 앞과 같이 축소, 펼치기 가능
• (여태 보던 예와는 다른
프로그램을 이용했음)
IDA PRO 사용해보기 – 기능 자세히 보기
• Generate pseudocode
•IDA Pro에는 Hex-ray라는 디컴파일러가 있다
•어셈블리어를 해석하여 C언어 형태의
pseudocode를 만들어 준다
IDA PRO 사용해보기 – 기능 자세히 보기
• Hex dump
• 메모리 헥사 덤프
• 메모리에 올라올 내용으로 예측 가능한
부분만 보여 줌
• 기본적으로 첫 번째 헥사 덤프는 첫 번째
디스어셈블 창과 동기화 되어 있음
• 한 쪽에서 스크롤을 옮기면 다른
창에서도 옮겨 짐
• 디스어셈블 창 또는 헥사 덤프 창에서 오른쪽
키 – Synchronize with 에서 동기화 설정 변경
가능
IDA PRO 사용해보기 – 기능 자세히 보기
• Hex dump
• 헥사 덤프 창에서 오른쪽 키 – Edit을 누르면
편집 모드가 된다
• 편집이 끝난 후 다시 오른쪽 키 – Apply
changes를 누르면 편집이 적용된다
IDA PRO 사용해보기 – 기능 자세히 보기
• Exports
• Entry Point 목록을 보여 줌(파일 진입점)
• 실행파일의 경우 최소 한 개의 엔트리(프로그램
실행 진입점)이 있음
• DLL과 같은 경우는 각 함수 주소가 진입점
IDA PRO 사용해보기 – 기능 자세히 보기
• Imports
• 모든 임포트된 함수 목록
• 바이너리가 공유 라이브러리를 사용할 때만 유효
• PE의 경우 IAT 주소, ELF의 경우 GOT 주소가 적혀 있음
IDA PRO 사용해보기 – 기능 자세히 보기
• Names
• 전역 이름 모음
• 이름 : 가상 주소에 매칭되는 심볼
• IDA가 분석해서 이름을 붙여 놓은 것도 있음
• 점프 목적지 등
• 더블클릭 시 관련 위치로 이동 가능
IDA PRO 사용해보기 – 기능 자세히 보기
• Functions
• IDA가 식별한 모든 함수를 보여줌
• 사용자 정의 함수에는 IDA가 직접 이름을 붙임
• 동적 라이브러리 함수 등, 사용하는 함수들에 대한
정보를 전부 모음
• Locals : 사용하는 스택 크기
• Arguments : 함수 인자 크기
• (여태 보던 예와는 다른 프로그램을 이용했음)
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
IDA PRO 사용해보기 – 기능 자세히 보기
• Strings
• 프로그램이 사용하는 모든 문자열들을
모아 놓음
• Address : 문자열이 저장된 위치
• Type : 문자열의 타입
• 오른쪽 키 – Setup 에서 어떤 것을 문자열로
판단할지 정할 수 있다.
• 왼쪽에 보이는 현재 설정은 ASCII
코드로 이루어진, 최소 길이 5
이상의, NULL로 끝나는 데이터를
문자열로 판단
IDA PRO 사용해보기 – 기능 자세히 보기
• Segments
• 바이너리 파일에 있는 세그먼트 목록을 요약해 보여줌
• CPU의 세그먼트와 혼동 X!!!
• 흔히 말하는 section을 의미
• 시작주소, 끝 주소, 권한,
• 메모리에 올리는 section에 대해서만 보여줌
• es, ss 등은 옛날 프로그램에서 이용하는 세그먼트와 관련
• (위는 계속 보던 예제 프로그램, 아래는 다른 예제 프로그램)
IDA PRO 사용해보기 – 기능 자세히 보기
• Structures
• 바이너리에서 사용됐다고 판단된 C 구조체나 공용체 같은 복합
구조체를 보여줌
• (여태 보던 예와는 다른 프로그램을 이용했음)
• Enumerations
• 위와 비슷함
• 열거형 데이터 타입을 찾았다면 나타내 줌
IDA PRO 사용해보기 – 기능 자세히 보기
• Cross references
• 찾고자 하는 주소나 대상을 클릭한 후 Cross
references 버튼을 누르면 해당 대상을 참조하는
코드 목록을 보여준다
• string을 이용하는 코드 찾기나 특정 함수를
호출하는 코드 찾기 등에 유용
IDA PRO 사용해보기 – 기능 자세히 보기
• Function calls
• 분석하길 원하는 함수를 코드에서 선택하고 Function calls를
누름
• 해당 함수를 호출하는 코드 주소와 해당 함수에서 호출하는
함수를 나열해준다
• 위는 해당 함수를 호출하는 코드 주소
• 밑은 해당 함수가 호출하는 함수들
• (여태 보던 예와는 다른 프로그램을 이용했음)
IDA PRO 사용해보기 – 기능 자세히 보기
• Notepad
• 간단히 기록을 할 수 있음
• Patched bytes
• 패치한 바이트에 원래 있던 값과 변경한 값을 알 수 있음
IDA PRO 사용해보기 – 디버거
• 디버거
• 디버깅을 처음 시도하면 어떤 디버거를
이용할 지 선택하는 창이 나온다.
• Remote debugger를 이용하면 virtual
machine이나 다른 컴퓨터에서 대상
프로그램을 실행하며 디버깅할 수 있다.
• IDA는 올리디버거처럼 실시간 코드
수정이 안 된다
IDA PRO 사용해보기 – 디버거
• 디버거
• ollydbg와 비슷한 구조
• 맨 왼쪽에 레지스터가 가리키는 곳을
표시한다
• 단축키
• F2: break point
• F7 : step into
• F8 : step over
• F9 : run
• F4 : 커서를 둔 코드까지 실행
• Ctrl + F7 : return까지 실행
• Ctrl + F2 : 디버깅 종료
• ESC : 이전에 커서가 있던 곳으로
되돌아 감 (올리디버거 –와 유사)
IDA PRO 사용해보기 – 디버거
• 디버거
• 각 창에서 오른쪽 키 – Synchronize
with 에서 원하는 목록을 선택하면
동기화된다.
• 코드는 기본적으로 EIP 동기화
IDA PRO 사용해보기 – 리모트 디버깅
• IDA Pro를 실행중인 컴퓨터 local에서 해당 파일 포맷의 파일
을 실행할 수 없는 경우 리모트 디버깅을 이용할 수 있다
• IDA Pro 폴더 – dbgsrv 폴더에서 서버 프로그램을 분석하고자 하는 환경에
맞는 컴퓨터나 가상 머신에 올린다.
• 숫자가 안 붙은 것은 32비트, 붙은 것은 64비트이다.
• IDA pro 32비트를 이용중이라면 32, 64라면 64
• IDA pro N비트는 N비트 프로그램을 분석하기 위한 것
IDA PRO 사용해보기 – 리모트 디버깅
• 디버깅 대상 프로그램을 실행할 컴퓨터나 가상머신에서 서버를 실행한다.
• 옵션을 주면 IP나 port를 변경할 수 있다
• 포트는 default로 23946
IDA PRO 사용해보기 – 리모트 디버깅
• IDA pro에서 디버거를 remote debugger로 설정한 뒤
실행한다
• 왼쪽과 같은 창이 뜬다
• Hostname에 본인 IP주소를 넣고, port 번호를 넣는다.
• parameters로 main 함수 인자를 넣을 수 도 있다.
• OK를 누른 후 디버깅을 진행하면 된다.
IDA PRO 사용해보기 – IDA + OLLY 연동
• IDA Pro에서 정적분석하여 쓴 주석과 label
을 올리디버거로 가져올 수 있다.
• File – Produce file – Create MAP file 클릭하
여 Map파일을 저장
IDA PRO 사용해보기 – IDA + OLLY 연동
• 왼쪽 아이콘을 더블 클릭하여 다운
• Ollydbg plugin 폴더에 넣는다.
IDA PRO 사용해보기 – IDA + OLLY 연동
• 올리디버거에 분석한
EXE를 올린다.
IDA PRO 사용해보기 – IDA + OLLY 연동
• 올리디버거에서 Plugins – MapConv – Replace lable을 누른다.
• 디스어셈블리어 코드의 label이 IDA에서 쓴 것으로 바뀐다.
IDA PRO 사용해보기 – IDA + OLLY 연동
• 올리디버거에서 Plugins – MapConv – Replace comment를 누른다.
• IDA에서 쓴 주석으로 바뀐다.
GDB
• 다양한 유닉스 기반의 시스템에서 동작하는 이식성 있는 디버거
• 대부분의 유닉스 기반 시스템에 설치되어 있음
• 오픈소스
• GDB는 원격 디버깅을 지원한다
• 임베디드 시스템을 디버깅할 때 이용
• emacs를 이용하여 GUD(Grand Unified Debugger)라는 형태로 더 보기 쉽게 이용할 수 있다
• ->나중에 다루겠음
• 명령어 사용법을 잘 모를 때
• help 명령어 라고 치면 사용법이 나온다
GDB 명령어
• set disassembly-flavor [원하는 형식]
• 디스어셈블리어를 intel, att 등의 형식으로 출력한다
• Ex) set disassembly-flavor intel
• disas
• disas [함수이름] 형태로 씀
• 이외에도 여러 Syntax가 있음, 정확한 Syntax는 부록의 참고 사이트
찾아볼 것
• 함수의 어셈블리 코드를 보는 명령어
• 함수에 포함된 부분만 가능 (특정 주소만을 알고 싶다면 뒤의 방법
이용)
• disass나 disassemble이라고 써도 됨
• 심볼 테이블에 이름이 있어야 함수 이름을 이용할 수 있음
GDB 명령어
• b
• 특정 주소에 breakpoint를 거는 명령어
• break라고도 씀
• b *[메모리 주소]
• 특정 주소에 BP를 검
• b *[함수 이름]이나 b *[함수이름 + offset] 형태로도 이용 가능
• info b
• info 명령어 뒤에 b를 붙이면 BP 정보를 볼 수 있음
• info를 줄여서 i라고도 씀
• d
• d [숫자]
• 해당 번호의 BP를 삭제함
• delete라고도 쓸 수 있음
• d만 쓸 경우
• 모든 BP 삭제
GDB 명령어
• r
• r [매개변수] 형태로 씀
• main에 넘기는 매개변수. 없어도 된다면, 없어도 됨
• gdb 내부에서 프로그램 실행
• BP를 만날 때까지 실행
• run이라고 쓰기도 함
• c
• run한 이후 다음 BP까지 실행
• continue라고도 씀
GDB 명령어
• ni
• 다음 인스트럭션 실행
• Step over와 같음
• nexti라고도 씀
• 뒤에 숫자를 쓸 시 그만큼의 인스트럭션을 실행
• si
• 다음 인스트럭션을 실행
• Step into와 같음 (함수 내부까지 들어감)
• stepi라고도 씀
• 뒤에 숫자를 쓸 시 그만큼의 인스트럭션을 실행
• 어셈블리어가 아니라, C 등 고급 언어 레벨에서 한 줄 실행할 때는 n과
s (next와 step)을 이용
• finish
• 함수의 끝나는 지점으로 이동
• 함수의 코드들은 정상 실행
• return
• 함수의 남은 부분을 수행하지 않고 빠져나온다.
GDB 명령어
• info r
• 레지스터 정보를 알려준다
• info를 줄여서 i로도 표기
• r을 registers로도 표기
• info r [레지스터이름]
• 특정 레지스터에 저장된 값을 표시
• info r
• 모든 레지스터 값을 보여 줌(floating-point와 vector register 제외)
• info all-registers
• 위에서 제외한 레지스터까지 포함해 출력
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개 해석해 봄
GDB 명령어
• display
• s, n, si, ni 등 프로그램을 진행할 때마다 화면에 값을 자동으로 출력해주기
• 등록해 둔 주소나 레지스터에 있는 값을 출력해준다
• display [레지스터]나 display *[메모리], display *[레지스터] 등
• disp라고도 씀
• 옵션으로 개수와 단위를 줄 수 있음
• Ex) disp/4x $esp는 ESP에서부터 16byte 만큼을 출력
• undisplay
• undisplay [번호] 형식으로 display에 등록해 둔 목록을 지울 수 있다
• 번호가 없이 undisplay만 하면 전부 지움
• undisp라고도 씀
GDB 명령어
• p
• 확인하고 싶은 변수 값이나 레지스터 값, 함수 주소 등을 출력해 줌
• print로도 쓴다
• 옵션을 통해 진법 조정 가능
• set
• 변수나 특정 메모리의 값을 변경함
• set [변수] = 원하는 값
• 디버깅 모드로 컴파일한 프로그램은 가능
• set {타입} 주소 = 원하는 값
• 해당 주소에 값이 들어 감
• set {타입} 레지스터 = 원하는 값
• 레지스터에 저장된 값을 주소로 여기고, 해당 주소에 값을 넣음
• set 레지스터 = 원하는 값
• 레지스터에 있는 값을 변경
GDB DASHBOARD
• gdb Dashboard 프로그램을 이용하
면 조금 더 편하게 gdb를 이용할
수 있다.
• 오른쪽이 gdb Dashboard를 이용한 모습
• 보통 tmux와 함께 쓰인다
• tmux : Terminal Multiplexer의 약자. 터미
널 환경을 좀 더 편리하게 만들어주는
프로그램
• 화면을 분할하여 사용하거나, 탭을
여러 개 만들어 사용할 수 있다.
GDB DASHBOARD
• 터미널에 wget –P ~ git.io/.gdbinit 을 써서 설치
• 일반적인 gdb를 쓰는 것처럼 이용
• 기본적인 gdb명령어로 디버깅 진행
GDB DASHBOARD 명령어
• dashboard를 위한 명령어 (gdb를 위한 명령어 아님)
• 맨 앞에 dashboard를 치고 입력함
• dashboard -layout : 레이아웃 정보를 준다
• 터미널에서 tty 명령어를 입력하면, 현재 표준 입력에 연결되어 있는
터미널의 파일 명을 보여준다.
• 원하는 터미널의 파일 명을 얻은 후, dashboard에 설정해 주면 해당 터
미널에 출력된다.
• default는 보통 현재 이용중인 터미널에 전부 출력됨
• dashboard 레이아웃요소이름 -output 터미널경로
• 해당 요소를 표시할 터미널을 지정
• dashboard 레이아웃요소이름
• 해당 요소를 숨기거나 보일 수 있음
GDB DASHBOARD 명령어
• dashboard를 위한 명령어 (gdb를 위한 명령
어 아님)
• 현재까지의 상황
• 이렇게 적절히 터미널 화면을 분할하고, 원하는 위
치로 레이아웃을 잡아주면 된다
• 추가할 점?
• 어셈블리어를 너무 적게 보여줌
• 메모리에 내용이 없음?
GDB DASHBOARD 명령어
• dashboard를 위한 명령어 (gdb를 위한 명령어 아님)
• dashboard 레이아웃요소이름 -style 설정내용
• 레이아웃의 구성 요소들 각각의 설정을 조정하는 명령어
• 설정 내용을 쓰지 않고 명령어를 치면 설정들을 보여준다
• 오른쪽에서는 어셈블리어에 기계어도 표시하고, 더 많은 코드를 표시
할 수 있도록 설정했다.
GDB DASHBOARD 명령어
• dashboard를 위한 명령어 (gdb를 위한 명령어 아님)
• dashboard memory watch 주소 개수
• 메모리 영역에 주소부터 시작해서 원하는 개수만큼 출력해준다.
• Ex) dashboard memory watch 0xffffcc68 0x100
• 오른쪽 그림처럼 나옴
• 설정 저장
• ~/.gdbinit.d 디렉토리를 만들고, dashboard에서 다음 명령어를 입력
• dashboard –configuration ~/.gdbinit.d/auto
GDB DASHBOARD + TMUX
• tmux 설치
• sudo apt-get install tmux
• tmux 실행
• 터미널에서 tmux 입력
• tmux 명령어
• Ctrl + b를 누르면 단축키를 입력할 수 있음
• Ctrl + b 후에 :를 누르면 단축키 외 긴 명령어 입력 가능
• 새 윈도우(탭) 만들기, 윈도우 전환하기
• 윈도우 분할하기 (팬(pane) 기능), 팬 전환하기
• 레이아웃 변경하기
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 , : 현재 윈도우의 이름을 바꾼다
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의 레이아웃 변경
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 크기만큼 조절
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를 전부 다 삭제하면 종료 됨
GDB DASHBOARD + TMUX
• tmux로 분할한 화면을 dashboard가 이용할 수 있도록 함
• tty로 터미널 경로를 알아낸 뒤 설정하면 됨
• ~/.tmux.conf 파일 생성 후 설정을 써 주면 자동으로 설정
이 적용된다.
• 마우스를 이용하여 pane 선택/windows 전환 등을 할 수 있다.
• set-option -g mouse on
• set-option -g history-limit 10000
기타
• readelf
• objdump
• objcopy
• strace
• ltrace
• DiE
READELF
• ELF 파일 포맷 내용을 정리하여 보여줌
• 옵션에 따라 내용 출력
• h : 파일 헤더 (ELF 헤더)
• l : 프로그램 헤더 테이블
• S : 섹션 헤더 테이블
• s : 심볼 테이블
• e : 헤더 전부 출력 (-h -l -S) 옵션과 같음
• r : relocation 관련
• d : dynamic linking 관련
• a : all (전부 출력)
OBJDUMP
• 목적 파일에서 정보를 읽어 내기 위한 프로그램
• elf 파일 포맷에서 정보를 읽어내는 프로그램. 역시 옵션에 따라 원하는 정보를 준다.
• 디스어셈블러 코드를 보기 위해 자주 이용
• -d : 디스어셈블한 코드를 보여줌
• 옵션에 –M intel 를 추가하면 인텔 문법으로 보여 줌
• -S 옵션을 추가하면, 가능하다면 원본 소스와 같이 출력해 준다(디버깅 모드로 컴파일 시 가능)
• -f : elf 헤더 (파일 헤더) 출력
• -s : 헥사 덤프를 보여줌(올라갈 메모리 주소와 함께)
• -tT : 모든 심볼들을 보여 줌
OBJCOPY
• 오브젝트 파일을 수정할 때 주로 이용
• 특정 섹션을 삭제하거나, 데이터를 추가할 수 있다.
STRACE
• 프로그램을 실행하며, 호출되는 시스템 콜 목록을 출력해 준다.
LTRACE
• 프로그램을 실행하며, 호출되는 라이브러리를 알려준다.
• 정확히는 공유 라이브러리에 있는 링킹 정보를 해석한 뒤, 해당 라이브러리가 호출되면 출력해주는 것
DIE (DETECT IT EASY)
• PEiD와 유사한 프로그램
• 패킹 여부를 알려주고, 헤더를 보기 좋은 GUI로 보여줌
• ELF 뿐만 아니라 PE, MACH(OS X에서 사용하는 실행 파일) 등을 분석할 수 있음
과제 • Reversing.kr 문제 풀기
REVERSING.KR 문제 풀기
• Easy Elf
• http://reversing.kr/challenge.php
• 각종 툴을 이용하여 정보 수집/gdb를 이용하여 풀어 보기/IDA pro를 이용하여 풀어 보기
부록 • 참고 사이트
참고 사이트
• 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
참고 사이트
• 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
참고 사이트
• 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

Contenu connexe

Tendances

Tendances (20)

Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1
 
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1
 
Pwnable study basic_2
Pwnable study basic_2Pwnable study basic_2
Pwnable study basic_2
 
Pwnable study basic_3
Pwnable study basic_3Pwnable study basic_3
Pwnable study basic_3
 
System+os study 3
System+os study 3System+os study 3
System+os study 3
 
Web hacking introduction
Web hacking introductionWeb hacking introduction
Web hacking introduction
 
System+os study 5
System+os study 5System+os study 5
System+os study 5
 
System+os study 7
System+os study 7System+os study 7
System+os study 7
 
Windows reversing study_basic_6
Windows reversing study_basic_6Windows reversing study_basic_6
Windows reversing study_basic_6
 
Windows reversing study_basic_5
Windows reversing study_basic_5Windows reversing study_basic_5
Windows reversing study_basic_5
 
Windows reversing study_basic_3
Windows reversing study_basic_3Windows reversing study_basic_3
Windows reversing study_basic_3
 
Windows reversing study_basic_4
Windows reversing study_basic_4Windows reversing study_basic_4
Windows reversing study_basic_4
 
Python
PythonPython
Python
 
Windows reversing study_basic_2
Windows reversing study_basic_2Windows reversing study_basic_2
Windows reversing study_basic_2
 
System+os study 6
System+os study 6System+os study 6
System+os study 6
 
Linux reversing study_basic_2
Linux reversing study_basic_2Linux reversing study_basic_2
Linux reversing study_basic_2
 
Linux reversing study_basic_1
Linux reversing study_basic_1Linux reversing study_basic_1
Linux reversing study_basic_1
 
[Kerference] 시작! 리버싱 - 김종범(KERT)
[Kerference] 시작! 리버싱 - 김종범(KERT)[Kerference] 시작! 리버싱 - 김종범(KERT)
[Kerference] 시작! 리버싱 - 김종범(KERT)
 
Apache avro
Apache avroApache avro
Apache avro
 
Avro 조사
Avro 조사Avro 조사
Avro 조사
 

Similaire à Linux reversing study_basic_3

The Architecture of Open Source Applications : GDB
The Architecture of Open Source Applications : GDBThe Architecture of Open Source Applications : GDB
The Architecture of Open Source Applications : GDB
Sanghoon Lee
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
복연 이
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
devCAT Studio, NEXON
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
devCAT Studio, NEXON
 

Similaire à Linux reversing study_basic_3 (20)

The Architecture of Open Source Applications : GDB
The Architecture of Open Source Applications : GDBThe Architecture of Open Source Applications : GDB
The Architecture of Open Source Applications : GDB
 
CoreDot TechSeminar 2018 - Session1 Park Jihun
CoreDot TechSeminar 2018 - Session1 Park JihunCoreDot TechSeminar 2018 - Session1 Park Jihun
CoreDot TechSeminar 2018 - Session1 Park Jihun
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
 
Windows Debugging Technique #3
Windows Debugging Technique #3Windows Debugging Technique #3
Windows Debugging Technique #3
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
 
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기
 
(111217) #fitalk rootkit tools and debugger
(111217) #fitalk   rootkit tools and debugger(111217) #fitalk   rootkit tools and debugger
(111217) #fitalk rootkit tools and debugger
 
으리리버싱시즌3
으리리버싱시즌3으리리버싱시즌3
으리리버싱시즌3
 
Hadoop발표자료
Hadoop발표자료Hadoop발표자료
Hadoop발표자료
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
 
C++api디자인 1장
C++api디자인 1장C++api디자인 1장
C++api디자인 1장
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
 
게임을 위한 AWS의 다양한 관리형 Database 서비스 Hands on Lab (김성수 솔루션즈 아키텍트, AWS) :: Gaming ...
게임을 위한 AWS의 다양한 관리형 Database 서비스 Hands on Lab (김성수 솔루션즈 아키텍트, AWS) :: Gaming ...게임을 위한 AWS의 다양한 관리형 Database 서비스 Hands on Lab (김성수 솔루션즈 아키텍트, AWS) :: Gaming ...
게임을 위한 AWS의 다양한 관리형 Database 서비스 Hands on Lab (김성수 솔루션즈 아키텍트, AWS) :: Gaming ...
 
Mongodb tip42 50
Mongodb tip42 50Mongodb tip42 50
Mongodb tip42 50
 

Dernier

Dernier (8)

(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 

Linux reversing study_basic_3

  • 1. LINUX REVERSING BASIC #3 리버싱 툴
  • 2. 목차 • 리버싱 툴 • Disassembler, Debugger • IDA Pro • 시작 • 기본 창 • 기능 자세히 보기 • 디버거 • 리모트 디버깅 • IDA + Ollydbg 연동 • gdb • 기본 명령어 • gdb dashboard • 명령어 • tmux와 함께 쓰기 • 기타 • readelf • objdump • objcopy • strace • ltrace • DiE • 부록 • 참고 사이트
  • 3. DEBUGGER, DISASSEMBLER • IDA Pro • gdb
  • 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가 생성한 정보를 보여줌 • 파일 분석 단계에서 얻은 상태 메시지와 사용자 요청에 따른 동작 결과도 보여 줌 • 콘솔 출력 결과를 보여줌
  • 19. 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
  • 76. 기타 • readelf • objdump • objcopy • strace • ltrace • DiE
  • 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 : 모든 심볼들을 보여 줌
  • 79. OBJCOPY • 오브젝트 파일을 수정할 때 주로 이용 • 특정 섹션을 삭제하거나, 데이터를 추가할 수 있다.
  • 80. STRACE • 프로그램을 실행하며, 호출되는 시스템 콜 목록을 출력해 준다.
  • 81. LTRACE • 프로그램을 실행하며, 호출되는 라이브러리를 알려준다. • 정확히는 공유 라이브러리에 있는 링킹 정보를 해석한 뒤, 해당 라이브러리가 호출되면 출력해주는 것
  • 82. DIE (DETECT IT EASY) • PEiD와 유사한 프로그램 • 패킹 여부를 알려주고, 헤더를 보기 좋은 GUI로 보여줌 • ELF 뿐만 아니라 PE, MACH(OS X에서 사용하는 실행 파일) 등을 분석할 수 있음
  • 83. 과제 • Reversing.kr 문제 풀기
  • 84. REVERSING.KR 문제 풀기 • Easy Elf • http://reversing.kr/challenge.php • 각종 툴을 이용하여 정보 수집/gdb를 이용하여 풀어 보기/IDA pro를 이용하여 풀어 보기
  • 85. 부록 • 참고 사이트
  • 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