[ftz] level 9: apple
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로 소스코드 분석
>> 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 |
댓글