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개 출력

커널이 사용하는 메모리 말고 3기가는 어디든 확인할 수 있다

디버거라고 해도 커널영역은 사용이 불가능하다.



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



+ Recent posts