문제확인
Hint를 확인할 경우 아래와 같이 간단한 소스를 확인 할 수가 있다. 하지만 여기서 보아야 할것은 bleh[80]인데 fgets로는 79byte 까지만 입력을 받는 것을 볼 수 있으며 이를 통하여 BOF는 할 수 없다는 것을 알 수가 있다. 그렇다면 다른 부분을 보아야 하는데 바로 printf(bleh)이다. 여기에는 포멧 스트링이 존재 하지 않기 때문에 이를 통하여 공격을 할 수가 있다.
gdb로 확인을 할려 했으나 확인이 되지 않기에 직접 hint의 소스를 통하여 같은 프로그램을 컴파일 하였다. 역시 BOF는 불가능 한것을 확인 할 수가 있다.
우선 문제를 직접 실행하여보자. AAAA %8x %8x %8x %8x를 할 경우에 AAAA가 저장된 곳이 출력이 되는 것을 확인 할 수가 있다. 따라서
출력물 - 4f - 4212ecc - 42087a75 - 41414141 - 과 같은 순서로 구성이 되는 것을 확인 할 수가 있다. 따라서 우리는 인자로 DTOR_END의 주소를 주어서 그 주소에 새로운 값을 쓰도록 할 것이다. 공격 방법은 아래에서 구체적으로 설명을 하겠다. 이 41414141이 나오기 전의 3가지의 값을 우리는 버릴값이라고 임의로 정하자.
nm 명령어가 통하지 않기에 우리는 objdump -h attackme를 통하여 dtor_LIST의 주소를 찾는다. 그 후 이 LIST+4가 바로 DTOR_END의 주소임을 우리는 알아야 한다. 따라서 DTOR_END의 주소는 0x08049598 이다.
공격
공격에 앞서 우리는 환경변수를 통하여 DTOR_END를 대체할 주소를 마련해야하며 이를 위하여 아래와 같이 환경변수를 등록을 한다. 그리고 공격에 쓰일 환경변수의 주소는 0xbffffc9d이다.
이제 Payload를 작성하면 아래와 같다. 이 페이로드에 대하여 설명을 하자 우선 FSB 공격의 경우에 흔히 "AAAA낮은주소BBBB높은주소"와 같은 형태로 쓰인다. 여기서 주목해야할 것은 바로 가운데에 있는 " + "를 기준으로 가독성을 위하여 일부러 나누어서 공격을 시도하였다. 우선 앞부분의 경우 인자로 "AAAA+DTOR_END(low)+BBBB+DTOR_END(high)"의 주소를 주고 있다. 낮은 주소와 높은 주소를 나누는 이유는 환경변수의 주소를 한 곳에 담을 수가 없기에 낮은주소에 2byte만큼을 그리고 높은주소에 2byte만큼을 입력하기 위함이다.
그리고 뒤의 세번의 %8x를 통하여 우리는 앞에서 본것과 같이 버릴값을 지나친다. 세번의 포인터가 이동하기 떄문이다. 그리고 이 세번의 %8x 후에 포인터는 이제 인자가 나타내는 주소 "0x41414141"을 나타내고 있다. 이제 여기에 우리는 %(64629)c를 통하여 "AAAA낮은주소BBBB높은주소"로 이동을 하고 그 낮은 주소가 가르키는 주소에 %n을 통하여 값을 씌운다. 그리고 값을 씌운 이후 "AAAA낮은주소BBBB높은주소"에 위치하는데 여기에 %(50018)c를 통하여 한번더 이동하므로 "AAAA낮은주소BBBB높은주소"로 이동을 하게 되고 여기에 이제 %n을 통하여 값을 씌운다.
이제 %64629c와 %50018c에 대하여 설명을 하자면 바로 환경변수의 주소를 나타내는 것이다. 환경변수의 주소는 0xbffffc9d인데 2byte씩 나누어서 값을 씌워야한다. 우선 FC9D의 값을 10진수로 변환하고 " + " 이전에 쓰인 16+ %8x*3 까지 포함하여 40Byte를 뺄셈한다. 그 값이 바로 64629이다. 이를 통하여 \x9d\xfc를 덮어 쓴것이다. 그리고 1BFFF-FC9D를 통하여 50018이란 값이 나오고 이를 통하여 \xff\xbf의 값을 씌우므로 우리는 결국 \x9f\xfc\xff\xbf 의 주소를 DTOR_END에 덮어 씌울수가 있다.
이를 통하여 공격을 실행하여 우리는 쉘을 획득 할 수가 있다.
'Hacking > System Hacking' 카테고리의 다른 글
Cracking Windows Password Hash with Kali linux Live Booting (1) | 2015.08.22 |
---|---|
FTZ Level19 //Chaining RTL Calls (0) | 2015.05.28 |
FTZ Level18 (0) | 2015.05.25 |
FTZ Level17 (0) | 2015.05.24 |
FTZ Level16 (0) | 2015.05.22 |