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

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.
  • 4.
    DEBUGGER, DISASSEMBLER • 디버거 •프로그램을 디버깅하기 위해 이용하는 프로그램 • 프로그램을 직접 실행하고, 메모리나 레지스터 값, 코드 등을 수정해보며 디버깅을 위한 실험을 할 수 있다 • 디스어셈블러 • 기계어를 어셈블리어로 해석해주는 프로그램 • 보통 디버거에는 디스어셈블러도 붙어있다 • 디스어셈블에 특화된 프로그램을 특별히 디스어셈블러라고 부름 • 기존에 이용하던 ollydbg는 PE파일 전용 • ELF 파일을 리버싱하기 위해서는 다른 디버거가 필요 • gdb와 IDA Pro • gdb : 디버거. 디스어셈블러도 붙어있지만, 디버깅이 주다. • IDA Pro : 디스어셈블러. 디버깅 기능도 있지만, 디스어셈블 기능이 주다.
  • 5.
    IDA PRO • IDAPro • 디스어셈블러 • 단순히 디스어셈블만 해 주는 것이 아니라, 코드를 분석하여 전체적인 구조, 사용하는 함수들 등 프로그램 분석에 필 요한 정보들을 종합하여 보여준다 • 그래프 등을 이용하여 시각적으로 보기 쉽게 해 준다 • 자체적인 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 명령어 • setdisassembly-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 명령어 • infor • 레지스터 정보를 알려준다 • 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 • gdbDashboard 프로그램을 이용하 면 조금 더 편하게 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 ITEASY) • PEiD와 유사한 프로그램 • 패킹 여부를 알려주고, 헤더를 보기 좋은 GUI로 보여줌 • ELF 뿐만 아니라 PE, MACH(OS X에서 사용하는 실행 파일) 등을 분석할 수 있음
  • 83.
  • 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