FTZ (Free Training Zone) level18
1. 환경 : window10
2. VM, Red Hat Linux 9.0, putty
id : level18
pw : why did you do it
1. cat hint를 사용하여 코드를 확인합니다.
2. 코드 분석
1. 1byte string 의 이름에 100공간을 준다]
2. Int (4byte) check을 선언한다.
3. X=0
4. Int count = 0;
While 문으로 들어가보면 상당히 많은 것들이 있다
가장 중요하게 봐야할 것은
1) If(check== 0xdeadbeef) 이다
Check이 deadbeef와 같으면 shellout함수를 호출한다
즉 check 영역을 deadbeef로 수정하여 shellout함수를 호출하게 해야한다.
두번째로 중요하게 봐야할 것은
2) switch문이다
switch 문 안에 case 0x08 은( x가 0x08일 때 )
count --; 를 하게 되어있다.
default 를 보면 x가 위에 있는 것 들이 아닐 경우 실행 되는데
string [count] = x; 라고한다.
여기서 봐야할 것은 string [count]=x이다 이 부분을 아무 생각 없이 넘어 갔었는데 가장 중요한 부분이었다.
[]이 괄호(배열)의 경우 string의 처음 시작 주소를 나타낸다고 한다.
즉 count를 변조하면 string의 첫 시작 에서 이동할 수 있다라고 생각했다.
그리고 그 위치에 x 즉 입력값을 넣어주는 것이다.
3. 스텍 구조 확인
여기서 보면 main +91 위치에 cmp로 ebp로부터 104 떨어진 위치의 값과 deadbeef를 비교한다
이를 통해 check의 위치는 ebp-104이다
(코드분석에서 말했듯이 check의 영역을 바꾸면 되기 때문에 check의 위치만 파악하였다.)
스텍 구조
Ret
Ebp [4]
String [100]
string 과 check의 구조를 잘 봐야했다.
Check [4] <-- daedbeef 로 변조해야함 (string에 스택이 쌓이면 ebp[4]방향으로 쌓인다)
X (별 상관 없음) <-- (스택의 구조를 파악하는데 있어서 )
Count (별 상관 없음) <-- (스택의 구조를 파악하는데 있어서 )
지금까지 풀었던 문제와는 다르게 스택 구조가 아래에서 위로 침범하는 그런 구조가 아니었다
String 이 먼저 선언 되었기 때문에 check를 일반적으로 스텍을 쌓는 다면 check 영역을 침범할 수 없다. 이걸 이해하는데 많은 시간이 걸렸습니다.
4. 공격 방법
Check 공간을 채우기 위해서 count를 변조해 string 시작 주소를 check공간의 주소로
바꾸어 check 부분을 변조한다.
Check 의 위치는 ebp-104이다 setring은 100[bye]이므로 check을 덮어 씌울려면 -4 만큼 이동해야한다.
String [-4]=”deadbeef”를 넣어주면 check 의 공간에 deadbeef가 들어가게 됩니다.
이해하기 어려웠지만 뭔가 이해하면 상당히 쉬었던 문제였습니다.
'Study > ftz' 카테고리의 다른 글
FTZ level17 (1) | 2016.07.13 |
---|---|
FTZ level16 (0) | 2016.07.12 |
FTZ level15 (0) | 2016.07.12 |
FTZ level14 (0) | 2016.07.12 |
buffer over flow 필독 자료 (0) | 2016.07.12 |
댓글