관리 메뉴

IT창고

System 디버거(de-bugger) 본문

보안/System

System 디버거(de-bugger)

방구석여포 2018. 1. 25. 22:12

리눅스의 디버거에 대해 알아보겠습니다.


사용하게 될 디버거는 GDB라는 디버거로 GNU 소프트웨어를 위한 기본적인 디버거 입니다.

디버거의 이름 유례는 최초의 오류가 있을때 회로에 벌레(bug)가 있어 오류가 일어난 일을 기록하여 bug는 프로그램에 존재하는 잠재적인 오류를 뜻하게 되었습니다. de-hugging은 버그를 찾는 행위를 말하며 디버거(de-bugger)는 버그를 찾는 행위를 도와주는 도구를 말하게 되었습니다.


에러는 여러종류의 에러가 있습니다. 그 중에 런타임 에러는 정말 찾기 힘든데 디버거는 이러한 찾기 힘든 에러를 찾을수있도록 도와주는 도구입니다.


Tip

- GDB 디버거로 프로세스를 실행하면 프로세스 권한을 디버거가 같게 됩니다.   

- GDB말고 IDA, ollydbg 등의 디버거 종류도 여러가지가 있습니다.

- 디버거는 항상 절대 경로로 실행이 됩니다.



간단한 프로그램으로 GDB를 사용해보겠습니다.


리눅스에서 GDB는 사용은 gdb를 입력하면 베너가 뜨고 gdb명령어창이 나옵니다. 처음 실행할때 실행파일과 함께 gdb를 사용하면 바로 run에서 파일실행이 가능하며 gdb만 켰다면 file ./실행파일 을 입력해서 해당 파일을 실행할수있습니다. gdb를 종료하는 법은 gdb명령어창에 quit을 입력하면 gdb를 종료합니다.


gdb에서 사용할 명령어 몇가지를 알아보겠습니다.

gdb는 Cisco IOS의 CLI의 명령어 자동완성, 명령어 축약 기능이 있습니다. 

gdb도 r만 입력하면 자동으로 run의 명령어로 인식하여 실행이 되며 (disas)semble 명령어를 중간만 입력하고 Tab를 눌러 명령어가 자동으로 완성됩니다.


프로그램 실행 

 run

디스어셈블 (해당주소를 어셈블로 해석) 

 disassemble 주소

문법변환 (intel , at)

 set disassembly-flavor intel  or at

레지스트 덤프 확인 

 info

특정 레지스트의 값 확인 

 info registers eax, ....

메모리 값 확인 

 x/nfu

GDB 종료

 quit

파일 입력

 file ./실행파일




디스어셈블 명령어로 해당 파일의 덤프를 확인해보았습니다. 저는 intel문법으로 보기 위해서 문법을 바꾸었습니다.

실제 어셈블리어로 만든 소스와 거의 같음을 확인할수있습니다.


메모리 값 확인 명령어인 x에 대해 자세히 알아보겠습니다.

x명령어는 뒤에 nfu 옵션이 있습니다.

- n: number     -> 출력개수 

- f: format       -> 출력형태 : x, d, o, s, i(명령어)

- u: unit          -> 출력단위 : b(1), h(2), w(4)


만약 옵션을 설정하지 않으면 x/1xw 의 옵션으로 기본 설정되어 있습니다. 그리고 gdb는 그냥 엔터를 입력할 경우 전에 사용했던 명령어로 다시 실행되어 출력됩니다.



오른쪽에는 objdump 명령어로 확인한 헤더 값이 있습니다. gdb에서 실행파일을 실행하고 해당 주소값을 확인할수있습니다.


해당 실행파일을 xxd명령어로 확인하면 gdb로 확인한 값이 올바른 값임을 비교하여 알수있습니다.


그렇다면 올바르게 값은 나왔는데 어째서 메모리 값이 뒤바꿔서 출력되는지에 대해 알아보겠습니다.


바이트오더(Byte Order)란 CPU가 메모리에 저장하는 바이트의 순서를로 2가지의 방식이있습니다.

1) little-Endian

little-endian방식은 intel에서 주로 쓰는 방식으로 bit가 아닌 4byte씩 뒤집어서 계산하는 방식으로 CPU의 계산이 더 빠르다고 합니다.

형식으로 보면 0x7f454c46  ->  0x 46 4c 45 7f 와 같습니다.


2) big-Endian

big-endian방식은 모토로라 등에서 쓰는 방식으로 사람이 읽는 순서와 같습니다.

형식으로 보면 0x7f454c46  -> 0x 7f 45 4c 46 와 같습니다.


추가적으로 프로세스의 실행 흐름을 제어하는 명령어 몇 가지를 알아보겠습니다.

- 프로세스 실행 멈춤 : break points

- 프로세스 다시 시작 : continue

- 프로세스 한단계씩 추적 : nexti (ni), stepi (si)



break points 명령어를 사용해보았습니다. break를 해당 주소에 걸면 주소가 실행될경우 break가 걸리게 됩니다.

info breakpoints를 입력하여 현재 브레이크가 걸린 곳을 알수있으며 gdb 브레이크포인트는 s/w break points로 제한없이 브레이크를 사용할수있습니다. 단 해당 주소의 명령어가 실행이 안된다면 브레이크도 실행이 안됩니다.

info breakpoints를 보고 현재 걸린 브레이크를 지우거나 비활성화를 시킬수도 있습니다. delete , disable / enable



브레이크가 걸려있기 때문에 일반적으로 실행하면 중간에 막히지만 continue를 사용하여 프로세스를 다시 시작할수있습니다.

'보안 > System' 카테고리의 다른 글

System 쉘 코드  (0) 2018.02.03
System BufferOverFlow  (0) 2018.01.30
System main함수의 인자와 시스템콜  (0) 2018.01.23
System 메모리구조와 어셈블리어 함수  (0) 2018.01.22
System 어셈블리어 반복문  (0) 2018.01.18
Comments