LEVEL 18
[level18] passcode : why did you do it
(NO DRAG, NO PASSCODE)
이전 문제들과 동일하다. hint의 코드를 분석해보자.
gdb를 이용하여 attackme의 메모리 구조를 분석해보자.
상당히 길다. 하지만 우리는 필요한 정보만 얻으면 된다.
- 할당된 메모리 → (0x100 + 0x8) = 264
- 예상되는 메모리 구조 → fds(4) + dummy(140) + count(4) + x(4) + check(4) + string(100) + SFP(4) + RET(4) = 264
메모리 구조는 다음과 같다.
—————————— High Address
| ret(4) |
——————————
| sfp(4) |
—————————— ← ebp
| string(100) |
——————————
| check(4) |
——————————
| x(4) |
——————————
| count(4) |
——————————
| dummy(140) |
——————————
| fds(4) |
—————————— Low Address
- 먼저 데이터를 입력할 때에는 낮은 주소부터 들어간다.
- 기존의 문제에서는 buf가 제일 낮은 주소에 존재하여 선언된 배열의 크기기를 초과하여 데이터를 입력해 그 윗주소에 있는 변수들까지 덮는 과정으로 해결하였다.
- level18에서는 string이 제일 윗주소에 존재하기 때문에 기존의 방법으로는 해결할 수 없다.
- 따라서 string[n] 에서 n < 0 일 때, check로 넘어갈 것이다. (아래 그림 참고)
—————————————— High Address
| string[-4] = check[0] |
——————————————
| string[-3] = check[1] |
——————————————
| string[-2] = check[2] |
——————————————
| string[-1] = check[3] |
——————————————
| string[0] |
——————————————
| string[1] |
——————————————
| string[2] |
——————————————
| … |
——————————————
| string[100] |
—————————————— Low Address
이를 염두해두고 다시 소스코드로 넘어가보자.
switch(x)
{
case '\r': //입력받은 x가 \r 일 때
case '\n': //입력받은 x가 \n 일 때
printf("\a"); //출력하고 break
break;
case 0x08: //입력받은 x가 \n 일 때
count--; //count = count - 1
printf("\b \b"); //출력하고 break
break;
default: //입력받은 x가 \n 일 때
string[count] = x;
count++; //count = count + 1, break
break;
}
이 swtich-case 문에서 보면, 입력값, 즉 x가 0x08 이면 count - 1 이 되기 때문에 count = 0 인 초기 상태에서 0x08을 4번 입력해주면 count = -4가 된다.
이때 여기부터 0xdeadbeef를 리틀 엔디언 방식(\xef\xbe\xad\xde)으로 입력해준다면 차례대로 check[3], check[2], check[1], check[0]에 저장되어 결국 shellout 함수가 호출될 것이다.
따라서 payload는 다음과 같다.
→ “\x08”*4+”\xef\xbe\xad\xde”
이제 쉘을 따보자.
[level19] : swimming in pink
'Pwnable > FTZ' 카테고리의 다른 글
FTZ - level20 [Format String Bug] (0) | 2020.08.28 |
---|---|
FTZ - level19 [Buffer Overflow 𝜇] (0) | 2020.08.28 |
FTZ - level17 [Buffer Overflow 𝜼] (0) | 2020.08.28 |
FTZ - level16 [Buffer Overflow 𝜻] (0) | 2020.08.28 |
FTZ - level15 [Buffer Overflow 𝜺] (0) | 2020.08.28 |