본문 바로가기

wargame/ftz

ftz level18



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) 이다

Checkdeadbeef와 같으면 shellout함수를 호출한다

check 영역을 deadbeef로 수정하여 shellout함수를 호출하게 해야한다.

    두번째로 중요하게 봐야할 것은

2)    switch문이다

switch 문 안에 case 0x08 ( x0x08일 때 )

count --; 를 하게 되어있다.

default 를 보면 x가 위에 있는 것 들이 아닐 경우 실행 되는데

string [count] = x; 라고한다.

여기서 봐야할 것은 string [count]=x이다 이 부분을 아무 생각 없이 넘어 갔었는데 가장 중요한 부분이었다.

[]이 괄호(배열)의 경우 string의 처음 시작 주소를 나타낸다고 한다.

count를 변조하면 string의 첫 시작 에서 이동할 수 있다라고 생각했다.

그리고 그 위치에 x 즉 입력값을 넣어주는 것이다.




3.     스텍 구조 확인





여기서 보면 main +91 위치에 cmpebp로부터 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이다 setring100[bye]이므로 check을 덮어 씌울려면 -4 만큼 이동해야한다.

String [-4]=”deadbeef”를 넣어주면 check 의 공간에 deadbeef가 들어가게 됩니다.






이해하기 어려웠지만 뭔가 이해하면 상당히 쉬었던 문제였습니다.

'wargame > ftz' 카테고리의 다른 글

ftz level18  (0) 2016.09.13
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