LEVEL15

해커스쿨 FTZ 2018. 3. 29. 21:58

 

먼저 hint파일을 열어보면 level14와 유사한 코드를 볼 수 있다.

 

 

코드가 완전 똑같은데 check앞에 *가 붙은 것을 볼 수 있다.

 

변수 앞에 *가 붙으면 포인터를 의미한다.

 

tmp로 코드를 복사한 후 컴파일 해 보았다.

 

 

gdb에서  intel형식으로 보면 level14와 아주 유사하지만 main+32에서 DWORD PTR [eax], 0xdeadbeef라고 바뀐것을 볼 수 있다.

 

이 어셈블리코드를 해석하자면 eax가 가리키는 주소에 있는 값고 0xdeadbeef를 비교하라는 뜻인데 바로 위 main+29를 보면

mov eax, DWORD PTR [ebp-16]을 볼 수 있다.

즉 EBP값의 16바이트 전의 주솟값을 의미한다.

 

level14와 같은 위치이므로

level14와 마찬가지로 A 40개를 넣고 0xdeadbeef를 입력하면 될 줄 알았다.

 

 

 

level14와 다른점은 포인터로 바뀌었다는 것 뿐인데 결과값이 달라서 포인터에 대해 다시 공부해 보았다.

 

이 코드에서 스택의 상태는

ret
sfp
crap
check
buf[20]

일 것이다

만약 check의 주소가 0x804123라고 하면

 

level14에서는
0x804123에 0xdeadbeef를 넣으면 해결되었지만 

*check의 경우  0xdeadbeef를 넣는다고 해결되지 않는다.

 

예를 들어보자

int a = 3;     //a가 0x8048af00에 할당되었다고 하자.
int *p = a;    // p는 a의 주솟값인 0x8048af00를 가질것이다

 

*p == 3     // 이 경우   0x8048af00이라는 주소에 3이 저장되어 잇으므로 

               //  3 == 3 true가 될 것이다.
p == 3      // 이 경우는 8048a00 == 3 이 되므로 false가 될 것이다.

 

 

따라서 이번문제는 check가 가리키는 주소값에 존재하는 값이 가리키는 주소에 있는 값과 0xdeadbeef가 같아야 하는 문제이다.

level14와 마찬가지로 환경변수로 0xdeadbeef를 넣고 주소값을 가져왔다.

 

환경변수가 저장된 값이 0xbffffc9e인것을 확인했다.

 

그리고 level14처럼 A40개와 환경변수의 주소를 입력하자 쉘을 얻을 수 있었다.

 

 

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

level17  (0) 2018.04.02
level16  (0) 2018.04.02
level14  (0) 2018.03.28
level13  (0) 2018.03.28
level12  (0) 2018.03.28
블로그 이미지

천재보다는 범재

,