이번 힌트는 코드가 무지하게 길더라구요 열자마자 놀랫습니다-_-
당황하지 말고 코드를 차례차례 분석해봅시다 .


변수 선언부부터 천천히 보도록 하겠습니다 
string[100] check x count 이렇게 선언이 되어있네요 .
여기서부터 중요한 부분이 시작됩니다 .
저희는 저러한 코드의 배열 선언 순서때문에 "string"으로는 버퍼 오버플로우를 시켜도 "check" 값 변조를 못한다는겁니다 .
이유는 스택의 구조때문입니다.
string 배열이 먼저쌓이고 check변수가 그 후에 쌓이고 그 후는 x...count 이렇게 쌓이기때문입니다 .
대략적인 스택 구조입니다

count
x
check
string
sfp
ret
이순으로 쌓이기때문입니다 .


그 아래로 while문을 봐보겠습니다
count가 100이상이면 What are you trying to do?라는 문구를 출력합니다
만약 check이 0xdeadbeef면 shellout()함수를 실행시키네요

맨아래 shellout이 있네요 
level19의 권한을 할당해주네요!
그렇다면  check에 0xdeadbeef 를 넣는게 이번 문제의 클리어 방법이겠습니다.


가져온 1Byte 값이 \r ,\n이면 소리(\a)를 내고 종료합니다.
1Byte값이 0x08인 경우 count의 값이 감소하네요
다른 값이 들어오면 count를 증가시키네요 
자 여기서 이제 gdb로 각 변수들의 위치를 찾아봅시다!

ebp-108에 x가 초기화되고
ebp-112에 count가 초기화 되는것을 알 수 있습니다 .


ebp-104에 check가 초기화 되는것을 알 수 있습니다 .


아! 256의 공간이 할당되었습니다! 
자 그렇다면 간단히 스택을 그려봅시다 


        <ebp-112  -----낮은주소
count    
         <ebp-108
x        
         <ebp-104  
check
         <ebp-100
string
         <ebp
sfp
ret                 -----높은주소

자 여기서 check값이 string보다 더 낮은 주소에 위치하고있어서 평소처럼 버포 오버플로우를 사용해서는 check값을 변경시킬 수는 없습니다!
허나 케이스문을 다시 한번 봐보자!

0x08을 넣으면 count--가 된다고 한다 
그렇다면 0x08을 쓰면 string ebp-100에서 낮은주소로 메모리상에서 올라갈 수 있지않을까? 
그렇다면 0x08을 4번사용해서 스택의 영역을 check부분으로 옮기면 될거같네요!


 
level19의 권한을 습득했습니다!
뭔가 좀 복잡하고 gdb분석도 어려웟으나 실제로도 많이 일어나는 취약점이라 하니 
눈여겨셔 공부하시면 좋겠습니다!

'해커스쿨 ftz' 카테고리의 다른 글

FTZ-LEVEL20  (0) 2016.04.26
FTZ-LEVEL19  (0) 2016.04.25
FTZ-LEVEL17  (0) 2016.04.24
FTZ-LEVEL16  (0) 2016.04.24
FTZ-LEVEL15 [gdb로 푸는법]  (0) 2016.04.24

+ Recent posts