본문 바로가기

Kitri_NCS3기 보안과정/시스템 해킹

170515 시스템 해킹, 디버거(GDB)-오버플로우 이해하기

시스템 해킹

: 시스템 프로그래밍의 취약점을 이용한 공격 기법




시스템 해킹 공격 분류 


리모트 공격 : 물리적으로 떨어진 대상을 공격함.


로컬공격 : 대상 컴퓨터 안에서 이루어지는 공격. 공격프로그램으로 희생프로그램 공격.

 ex) ssh로 붙은 대상에서 공격, 워드 취약점(hwp, ms office등 ) 의 취약점을 공격해서 침투

모든 프로그램은 입력을 받아서 작업을 처리하는 동작을 수행하는데 입력할 때 사용자가 인식하지 못하는 방법으로 공격을 수행한다.

프로그램 시작 할때 또는 시작 중에 넘겨주는 시점적 유형 두가지

악성코드(리모트 공격)의 경우 실행 파일(.exe)로 구분하기 쉽지만 로컬공격은 인식하기 어렵다는 점이 있다.


대표적인 취약점


스택 오버플로우 : 프로그램이 데이터를 받을때, 저장공간을 할당하고 데이터를 입력받은후 작업을 수행하는데 입력부분을 할당한 저장공간보다 많이 해서 오버플로우를 발생시키는 공격

포맷스트링버그: printf 등의 함수에서 문자열 입력 포맷을 잘못된 형태로 입력하는 경우 나타나는 오류 

레이스 컨디션 공격: 권한이 높은 프로그램이 주기적인 실행을 할 경우, 권한 낮은 프로그램이 실행중인 높은 프로그램에게 액션을 취할 수 있는 미끼 같은걸 던져줌. 

해제된 메모리 참조: 해제된 heap메모리를 참조했을 경우 해제된 데이터들은 참조가 불가능해야하는데 제대로 삭제가 안되는 경우가 있다. 이런 취약점을 이용하여 공격하는 방법





디버거

 : 오류 수정기 , 프로그램의 오류를 찾아내기위한 소프트웨어 총칭, 프로그램의 실행단위를 명령 하나하나 분할해서 한 동작마다 레지스터의 값이나 플래그값 등 cpu내부의 상황을 나타냄


디버깅의 경우 브레이크 포인터로 프로그램을 의도적으로 잠시 멈추고 분석하는데 이는 수학문제를 검산하는 것과 비슷한 작업이라고 생각하면된다. 


GDB(GNU Debugger)

 : 컴퓨터 프로그램의 실행을 추적하고 분석할 수있는 기능을 가진 툴. 


GDB 명령어

명령어 참고 - http://www.viper.pe.kr/docs/gdb-manual.html


 동작

명령어

동작

명령어

실행 

gdb program_name

문법 변경 (AT&T → Intel)

GDB는 AT&T문법이 Default

 set disassembly-flavor intel  

함수의 동작과정 확인

disassemble func_name

브레이크 포인트 지정

breakpoint *func_name+value  

 상태확인

info sub_command 

 프로그램 실행 

(매개변수 값 설정 가능 )

run arg1 arg2 ..... argn 

 메모리검사

  x /

b

1byte

메모리검사

 x /

u  

10진수 단위 

h

2byte

16진수 단위 

w

4byte

 메모리검사 사용예 

 x/wx $reg_name

레지스터의 정보를 

16진수 4byte단위로 보여줘  

s

문자열

 x/20wx $reg_name

 레지스터의 정보를 

16진수 4byte단위로 20개씩 보여줘 




GDB로 오버플로우된 프로그램의 동작 이해하기 


오버플로우 = 넘쳐 흐르는 모양 


크기가 지정된 영역에 입력되는 데이터가 그 크기를 초과해 다른 할당영역까지 영향을 미치는 상태를 말한다.


실습에서는 이 오버플로우의 상태가 어떻게 이루어지고 결과가 어떻게 나오는지 GDB로 확인해 보기로 하자.


실습 프로그램의 가정.


<stack1.c>

1. 64크기의 버퍼확보

2. 하나의 저장공간 생성(buffer와 인접) 0으로 초기화

3. 버퍼에대한 안전장치 없음.

4. 버퍼에 오버플로우 발생시 다른 저장공간에 영향을 줄것임.

5. 오버플로우에 영향을 받은 저장공간 출력. 내용 확인.



처음 gdb stack1 으로 실행시키고 

disas main 을 살펴보면 AT&T 문법으로 되어있다. 

바꿔주자 

set disassembly-flavor intel


Intel 문으로 변경된걸 확인.


오버플로우 상태가 되게끔 입력을 하고 (strcpy >= 64)

결과값으로 출력되는 modified의 값을 확인해 보자.



브레이크 포인트를 입력함수 부분(call strcpy)에 설정하고 실행시킬때 매개변수를 같이 입력 시켯다.


esp로 입력받은 값을 확인해보자.


139번 반복된 c 값이라 한다.

64를 넘었으니 오버플로우 상태일 것이다. 

계속 진행해보면 

printf("Try again, you got 0x%08x\n", modified);


코드가 실행되고 modified에 들어있는 내용을 확인 할 수 있을 것이다.



modified가 0x63636363으로 나온다. 0x63  =  c 이므로  오버플로우된 값이 modified에 덮어씌워진것을 알 수 있다.