1. 디버거 사용법: GDB
- bug: 프로그램에 존재하는 잠재적인 오류
- de-bugging: 버그를 찾는 행위
- de-bugger: 버그를 찾는걸 도와주는 도구
- shell로는 실행중인 메모리에 접근을 못하는데 디버거를 쓰면 접근이 가능하다
- 대표적으로 IDA
가장 일반적인 것은
#>gdb ./hello2_
#>run //#>file ./hello2 로 바꿔 쓸 수 있다.
#>quit
Program received signal SIGSEGV, Segmentation fault.
0x8048096 in ?? ()
버그가 나타난 곳을 알려준다
gdb 안에서는 절대 명령어만 사용된다
2. 자주 사용하는 GDB 명령어
-명령어 축약: run-> r
-명령어 완성 : r<tab>, ru<tab>
*프로그램 실행: run
*GDB 종료: quit
*디스어셈블 : disassemble <주소>
- 특정 주소에 있는 값을 자동으로 어셈블로 해석한다.
C프로그램을 분석할때는 주로 main으로 걸고
어셈블리어로 구성된 파일을 분석할때는 _start 로 걸어서 분석한다
문법 변환: set disassembly-flavor intel or at
- gdb에서는 intel방식이 아닌 at&t방식을 지원한다.
- at&t방식 같은경우 intel과는 다르게 src와 dst가 바뀌어서 표현되는데
- intel방식으로 배워온 입장에서 보기에 햇갈릴수도 있다. 그래서 이 기능으로 intel문법에 맞게 변환시켜준다.
기본값(default)은 xw이다. 16진수, 4바이트 형태
메모리 or 레지스터 값 확인
*레지스터값 확인: info
ex) info register
ex) info register eax ebx ecx
*메모리 값 확인: x/nfu 주소
- 메모리 덤프에는 x/출력갯수/출력형태/출력단위 덤프할메모리주소
- 기본형태 : (gdb) x/1xh
- 출력형태 : 10진수(ㅇ), 8진수(o), 16진수(x), 문자열(s), 명령어(i)
- 출력단위: 1바이트(b), 2바이트(h), 4바이트(w)
0xbffffb58 0x400349cb 0x00000001
saved ebp, eip argc
의미한다
ex) x/20xw = 4바이트 단위(w)로 짜른 메모리값을 16진수(x) 형태로 20개 출력
디버거라고 해도 커널영역은 사용이 불가능하다.
cpu에 따라 메모리에 작성되는 순서가 다르다
byte order
little- Endian: Intel (뒤집에서 저장된다) 0x12 0x34 0x56 0x78
실제로 메모리에서는 0x78 0x56 0x34 0x12
파일 맨 끝이 뒤집혀서 저장되는 것이 아니라 4바이트 기준으로 뒤집혀 들어간다
Big - Endian: Network, (일반적으로 저장된다 ) 0x12 0x34 0x56 0x78
실제로 메모리에서는 0x12 0x34 0x56 0x78
프로세스 실행 흐름 제어
프로세스 실행 멈춤: break points //멈추는 지점을 확인할 수 있다 (대상은 명령어) (s/w 타입)
(gdb) break *0x8048085
info breakpoints
delete
disable/ enable
프로세스 다시 실행: continue
프로세스 한단계씩 추적: nexti(ni), stepi(si)
악성코드 동적분석-실행을 시켜가면서 분석을 하는것
정적 분석-실행을 하지 않고 분석하는 것
명령어 등록
display/i $eip
'시스템 해킹' 카테고리의 다른 글
[시스템 해킹] 버퍼(스택) 오버플로우 (0) | 2018.01.31 |
---|---|
[시스템 해킹] 파일 분석하기 실습! (0) | 2018.01.29 |
[시스템 해킹] 시스템 콜 (0) | 2018.01.27 |
[시스템 해킹] main 함수의 인자 (0) | 2018.01.27 |
[시스템 해킹] 배열 지역 변수로 구현하기 (0) | 2018.01.27 |