write-up/pwnable

[ftz] level 9: apple

여니두 2019. 8. 17.

09_버퍼 오버플로우 입문

 

√ 배열이 실제로 메모리에 어떻게 배치되는가?

- sizeof()로 확인 가능한 변수의 크기와 실제 변수가 메모리에 배치되는 것과는 큰 차이가 있음

- 컴퓨터 환경(운영체제)마다 변수를 할당할 때 할당하는 메모리 공간의 크기가 다르다.

- 2의 배수의 원칙(기본)을 지키되, 약간의 변형을 가한다.

 

gdb 기본 명령어

1. gdb 파일명: open

2. list: gcc 컴파일 시 -ggdb 옵션을 지정한 경우 소스 확인 가능

3. disas(semble) 주소/함수명: 해당 함수를 디스어셈블해 실행

4. r(un): 파일 실행

5. c(ontinue): break 걸린 상태에서 계속 실행

6. b(reak) 주소/함수명: 주소나 함수에 break point 걸기

7. x/32x 주소: 주소에서 32개를 16진수로 출력

(x/32s: 문자열)

8. info registers: 레지스터 값 출력

9. nexti: 함수 내부로 들어가지 않고 한 라인 실행

10. stepi: 함수 내부로 들어가면서 한 라인 실행

11. help: 도움말

12. backtrace: 프로그램 실행의 스택 추적 결과 출력

13. quit

 

√ 문제 분석

 

* BOF

: BOF를 비롯한 시스템 해킹에 포함되는 공격 기법은 "특정 값을 원하는 메모리에 쓸 수 있는가?"가 핵심

 

bof를 디버깅해보기 위해 복사 후 tmp 폴더에서 gdb로 디버깅해보았다.

 

√ gdb로 소스코드 분석

 

procedure prelude 과정

>> printf("It can be ~ ")

 

>> fgets(ebp-40, 0x28, 0x8049698)

= fgets(buf, 40, stdin)

 

>> strncmp(ebp-24, "go", 0x2)

= strncmp(buf2, "go", 2)

 

ebp-24의 2byte가 "go"와 같지 않다면 main+134로 이동

 

>> printf("Good ~ ")

>> setreuid(3010, 3010)

>> system("/bin/bash")

 

** stack은 높은 주소에서 낮은 주소로 값이 쌓임(스택이 증가함)

buf (ebp-40) 10
dummy 6
buf2 (ebp-24) 10
dummy 6
SFP 4
RET 4

√ 페이로드

- buf[10] + dummy[6] + "go"

 

Level10 Password = interesting to hack!

 

* 정리

- 배열의 크기보다 큰 데이터를 입력함으로써 원하는 데이터를 특정 위치에 강제로 입력할 수 있었다.

- RET(리턴 주소)를 우리가 원하는 주소로 덮어써서 원하는 코드(SHELL 실행 코드)를 실행시키기 위해 이런 내용을 공부하는 것

 

√ 스크립트를 이용한 문자열 입력

1. 배시셸의 printf 명령

2. perl 스크립트 이용 방법

3. python 스크립트 이용 방법

4. ruby 스크립트 이용 방법(ftz 서버엔 없음)

 

'write-up > pwnable' 카테고리의 다른 글

[ftz] level 11: what!@#$?  (0) 2019.08.21
[ftz] level 10: interesting to hack!  (0) 2019.08.18
[ftz] level 8: break the world  (0) 2019.08.16
[ftz] level 7: come together  (0) 2019.08.14
[ftz] level 6: what the hell  (0) 2019.08.13

댓글