문제확인
우선 문제를 확인하여 보자. 레벨14와 비슷하지만 check 변수가 포인터 변수임에서 차이가 난다. 여기서 중요한 것은 포인터 변수는 그 변수가 메모리의 주소를 가리키고 있으며 그 주소의 값이 0xdeadbeef를 나타내어야 쉘을 획득 할 수 가 있는 문제이다.
GDB를 통하여 확인을 해본다면, 스택에 0x38( = 56 ) 만큼이 할당 되는 것을 확인 할 수가 있다. 이를 통해 우리는 어느정도 유추를 할 수가 있지만 정확한 *check변수의 위치를 알아야 한다.
아래와 같이 코딩을 한 후에 실행을 하면 Buf[20] - Dummy[20] - Check[4] - Crap[4] - Dummy[8] - SFP[4] - RET[4] 가 스택에 놓여있는 것을 확인 할 수가 있다.
여기서 우리는 더 명확하게 Buf주소를 *check의 주소에 올리는 방법을 통하여 공격을 할 수 있는 지를 확인해보자. 아래와 같이 &buf의 주소를 보면 계속 변화하는 ASLR의 형태를 띄고 있는 것을 확인 할 수가 있다. 따라서 우리는 환경변수를 이용하거나 하드코딩의 방법을 이용하여야 한다.
Hard Coding
하드코딩이란 코딩시에 그 숫자나 문자열이 그대로 입력이 되어있는 것으로 이러한 방법을 통하여 풀 수 있는 문제가 은근히 많다는 것을 유의하여야 한다. 아래와 같이 GDB를 통하여 x/16x main을 확인하면 main+34의 부분에 키 값이 그대로 하드코딩 되어 있는 것을 확인 할 수가 있다.
EGG Shell
환경변수를 이용한 방법은 사실 여러번 실패를 하였다. 기존의 export EGG=`python -c 'print "\xef\xbe\xad\xde"'`를 이용한 방법의 경우는 실패 하였지만, 아래와 같은 방법으로 환경변수를 입력해 주었을때는 쉘을 획득 하는데에 성공을 하였다. 구체적인 이유는 알지 못하지만 일단 페이로드를 첨부한다.
'Hacking > System Hacking' 카테고리의 다른 글
FTZ Level17 (0) | 2015.05.24 |
---|---|
FTZ Level16 (0) | 2015.05.22 |
FTZ Level14 //Distance (0) | 2015.05.17 |
FTZ Level13 //RTL, EGG (0) | 2015.05.13 |
FTZ Level12 //BOF,RTL,EGG,Backdoor (0) | 2015.05.10 |