일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- pwnable.kr
- Stack
- 미로 탐색 알고리즘
- windosws wbcs
- 재귀
- windosw 문자열
- HTML
- 파일 시스템
- PHP
- 시간복잡도
- 암호수학
- ftz level13
- 큐
- 자료구조
- C
- Java
- OSI
- War Game
- 두근두근 자료구조
- 스택
- web
- c언어
- SWiFT
- 파이썬
- System
- LoB
- level13
- 백준
- 정렬 알고리즘
- ftz
- Today
- Total
나의 기록, 현진록
[War Game] ftz level9 본문
ftz level9
힌트의 내용이다.
일단 실행시키면
버퍼 오버플로우 문제이다.
정답은 if 문에 있다.
buf2 배열의 앞 2자리를 "go"로 채워지게 만들기
일단 배열을 메모리 주소와 연관지어 만들어보면
<-낮은 주소 높은 주소->
|
|
|
|
|
|
|
|
|
|
|
|
|
buf buf2
buf2 배열이 먼저 선언되었기 때문에 높은 주소를 가진다.
buf 배열이 나중에 선언되었기 때문에 낮은 주소를 가진다.
fgets 함수의 해석은
buf 배열에 크기 40만큼 표준 입력 스트림으로 입력 받는다는 의미이다.
fgets는 배열의 크기와 상관 없이 함수 인자에 크기만큼 입력 받는다.
엔터를 누르기 전까지.....
buf2를 먼저 채우고 buf2 배열 크기보다 많이 입력 받으면 buf 배열로 버퍼 오퍼플로우가 발생한다.
만약 0123456789를 입력 받으면
<-낮은 주소 높은 주소->
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|
|
|
|
|
|
|
|
|
|
buf buf2
만약 01234567890123를 입력 받으면 다음과 같다.
<-낮은 주소 높은 주소->
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
1 |
2 |
3 |
|
|
|
|
|
|
buf buf2
위와 같은 방법으로 buf2 배열 2byte 자리에 "go" 문자열이 있을 경우
strncmp는 0을 리턴하므로 /bin/bash를 실행한다.
정답은
0123456789go
그러나 정답이 아니다.
왜냐하면 변수와 변수 사이에는 쓰레기가 존재하기 때문이다.
더미의 크기를 고려해야 한다.
즉
buf2 + 더미 + buf 이러한 구조이다.
buf2를 채우고 더미를 채워야지만 buf에 접근할 수 있다.
하지만 더미를 현재 알 수 없다.
gdb를 이용하여 알 수 있지만 간단한 문제이므로 끼워 맞추기
0123456789 로 인해 buf2 배열이 채워지고
012345 만큼이 더미이다. 더미는 6바이트
그리고 buf 배열의
1바이트에 'g'
2바이트에 'o'
이렇게 채워진다.
'War Game > ftz' 카테고리의 다른 글
[War Game] ftz level11 (0) | 2018.01.26 |
---|---|
[War Game] ftz level10 (0) | 2018.01.19 |
[War Game] ftz level8 (0) | 2018.01.19 |
[War Game] ftz level7 (0) | 2018.01.19 |
[War Game] ftz level6 (0) | 2018.01.19 |