ftz level13 풀어보겠습니다.
힌트조회부터 하겠습니다.
계속 비슷한 형식의 문제가 나오는거 같습니다. 이번에는 버퍼오버플로우 취약점이 존재하나 i의 값이 0x1234567 이 아니면 바로 종료되는 문제입니다. 저 해당조건을 우회할 수 있는 버퍼오버플로 공격을 하는게 목적이 될거 같습니다.
우선 늘 해왔던대로 tmp디렉터리에 옮겨주고,
디스어셈블러로 한번 구조를 보겠습니다.
ebp에 i의 값(0x1234567)을 넣어 <main+69> 에서 비교를 하여 0x1234567이 아닐경우 종료하는 구조입니다.
1024(배열)+24(dummy)+4sfp(base pointer)+4ret(return address)=1056
이러한 구조로 생각할 수 있는데 24바이트의 더미 어딘가에 0x1234567값(비교를 위한 값)이 존재하고 그 값의 논리적 위치를 찾아내 0x1234567 값은 그대로 사용하여서 비교문을 우회하는 방식으로 가겠습니다. 보통 오버플로를 하게 되면 저 더미 부분에 아무값이나 넣어서 i의 값이 변질되기 때문에 버퍼 오버플로가 막히는 방식입니다. 우선 0x1234567의 논리적 위치를 찾아 익숙한 환경변수쉘로 공격해보겠습니다.
비교문에 브레이크포인트를 걸어주고 딱 배열만큼의 값을 넣어서 실행시켜 메모리구조를 살펴 보겠습니다.
조금 더 조회해 보겠습니다.
43이 C인건 앞에서 많이 보았기 때문에 아실거라 생각됩니다. 궁금하시면 100더 올려보시면 느끼실 겁니다. 43의 배열이 끝나는 지점부터 24바이트를 살펴 보면 12바이트 후에 0x1234567 이 존재함을 알 수 있습니다. 그렇다면 다시 수정된 스텍구조는 아래와 같습니다.
1024(배열)+12(dummy)+4(0x1234567)+8(dummy)+4sfp(base pointer)+4ret(return address)=1056
이제 위의 스텍형태를 유지하면서 환경변수를 통한 버퍼오버플로공격을 하겠습니다. 환경변수는 SC로 선언하였습니다. (스샷을 못찍었습니다. level11이나 level12를 참고하시기 바랍니다.) 그리고 해당 환경변수의 주소값을 구하기 위하여 locate.c를 만들어서 컴파일 하였습니다.
주소값을 알아냈으면 attackme를 실행하겠습니다. 1036Byte+0x1234567+12Byte+주소 의 형식입니다.
입력하면 쉘을 획득하여 다음으로가는 패스워드를 획득할 수 있습니다.
'Hack > ftz' 카테고리의 다른 글
ftz 풀이 level15 (0) | 2017.01.04 |
---|---|
ftz 풀이 level14 (0) | 2017.01.03 |
ftz 풀이 level12 (0) | 2016.12.31 |
ftz 풀이 level11 (0) | 2016.12.28 |
ftz 풀이 level10 (0) | 2016.12.12 |
댓글