시스템/시스템 보안

Buffer Overflow-1

비니화이팅 2018. 1. 27. 21:19

- 실습은 RedHat에서 진행한다.

- 2편으로 넘어가기 전에 공격이 어떤식으로 진행되는지 간단하게 살펴본다. 자세한건 2편부터 소개한다.


[실습 1]

- 우선 아래와 같은 코드를 bof.c라는 이름으로 작성하여 분석해본다.


- 작성한 bof.c파일을 컴파일해준다. (gdb를 사용할 것이기 때문에 꼭 -g옵션을 넣어줘야 한다.)


- gdb를 실행한다. (-q 옵션은 gdb를 처음에 실행할때 나오는 문구를 보여주지 않는 옵션이다.)


- 브레이크 포인트를 걸기 전에 소스 코드를 한번 확인한다.


- strcpy함수가 6번째 줄에 위치해 있으므로 6에 브레이크 포인트를 걸어준다.


- AAA인자를 넘겨 실행한다.


- argv[1]에 넘겨준 AAA가 잘 들어갔는지 확인한다.


- buffer을 확인해보니 아직 strcpy을 실행하지 않은 상태이기 때문에 쓰레기 값이 들어가있다.

- 다음 명령을 실행한다.

- esp값을 확인한다.


- 스택에 어떤 값이 들어가 있는지 확인한다.

- buffer는 12바이트가 할당이 되어서 AAA가 잘 들어가져 있고 그 다음 EBP, RET가 보인다.

<하위>

[buffer] -> 빨간색

[buffer] -> 빨간색

[buffer] -> 빨간색

[buffer] -> 빨간색

[SFP] -> 파란색

[RET] -> 초록색

<상위>


- 이번에는 인자값을 buffer의 사이즈보다 더 크게 주면 어떻게 되는지 확인해본다.

buffer의 공간, EBP를 넘어서 RET주소까지도 인자값으로 덮어 씌울 수 있다는 것을 알 수 있다.


- 나머지 명령어도 실행(continue)하고 gdb를 종료(quit)한다.


[실습 2]

- 우선 [실습 1]에서 만든 bof파일에 root권한으로 4755권한을 준다.


- eggshell.c파일을 컴파일해준다.

eggshell.c는 관리자 권한을 획득하는 셸코드이다.


- test00계정으로 bof파일을 관찰해본다.

- strings bof : 해당 프로그램 내에서 사용하고 있는 문자열을 출력한다.


- bof을 실행한 결과 segmentation fault가 일어나므로 주소 접근이 잘못되었다는 것을 확인할 수 있다.


- 셸코드를 실행한다.


- bof을 실행하면서 의미 없는 문자열과 셸코드의 주소를 인자로 넘겨준다. RET값에 셸코드의 주소가 들어가 셸코드가 실행되면서 관리자 권한을 얻은 것을 확인할 수 있다.

 perl : 문자열이 아닌 16진수로 인식되도록 한다.

 - -e : 실행시키겠다는 의미이다.