IMyoungho 2019. 2. 6. 13:17

혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다.


FTZ 18번이다~

코드를 보면 check값이 0xdeadbeef가 되면 shellout()함수가 실행되면서

다음 권한으로 "/bin/sh"이 실행된다.


하지만 입력받는 양이 100보다 크거나 같으면 

"What are you trying to do?"가 나오게 된다ㅎㅎ


이 문제를 풀기 위해서는 switch문에 있는 0x08을 이용해야하는데

그 이유는 우선 스택에 어떤식으로 변수들이 쌓이는지 봐야한다.





일단 어셈블리어로 코드를 보자.

우선 C로된 코드와 어셈블리어 코드를 비교해보았다.

(굳이 어셈블리어 코드를 안봐도 스택은 그릴 수 있지만 그래도..ㅎㅎ)

그랬더니 아래와 같이 스택이 쌓인다는 것을 알 수 있었다.





C코드와 마찬가지로

x가 먼저 0으로 초기화되고

다음으로 count가 0으로 초기화되었다.

그리고 check값이 0xdeadbeef가 되어야 문제를 해결할 수 있었다.



그런데??.. 


"값은 string에 담기는데 check를 어떻게 가지??"

라고 생각했지만


우리에겐 0x08이 있었다!!


위의 그림은 switch문을 어셈블리어로 본 것이다.

순서대로 case문 두개와

count-- 그리고 default문이다.







스택의 그림을 보면 check와 string은 -4의 크기 차이가 난다.

그러므로 우리는 -4만큼 즉, 0x08을 4번해주고

0xdeadbeef를 진행해주면 역으로(?) 채워짐으로

다음단계로 넘어갈 수 있게 된다!!



다음단계로~~




반응형