본문으로 바로가기

대망의 마지막 문제의 코드는 FSB 취약점이 있다.

bleh는 80의 크기고, 입력을 최대 79만큼 받을 수 있어 오버플로우가 나지는 않는다.

하지만, printf함수 부분을 보면 FSB 버그가 발생하는것을 알 수 있다.


오버플로우가 불가능하니 ret을 건들기가 상당히 힘들다.

그래서 우리는 .dtors라는것을 사용할것이다.

ret은 함수가 끝나면 실행되는것이고, 프로그램이 끝나면 .dtors(소멸자)를 실행하는데, 그 주소를 확인해보자.

0x08049594라고 한다. FSB에서 .dtors를 사용할때는 4바이트를 더한다. 

.dtors+4는 보통 0으로 셋팅되어있다. 하지만 이 값이 0이 아니면, 프로그램이 종료하고 그부분을 실행해버린다. 

그래서 dtors + 4를 하는것이다.

일단 쉘을 따긴 땄는데, 이걸 어떻게 설명을 해야할지..

FSB취약점이 있는 프로그램에서 %c, %s, %x등의 포맷을 입력하면, esp가 4바이트씩 +되면서 현재 esp의 주소에 따라 입력한 포맷들이 그대로 실행된다. 

그리고, %n포멧 ( 지금까지 출력한 바이트를 씀 ) 을 이용해서 .dtors에 eggshell의 주소를 쓸 수 있다.

어떻게?

입력값을 &.dtors %x %x %x %x %x %x %x %x.... 처럼하면?

언젠간 스택에 남아있는 .dtors의 주소가 출력될것이다. 

몇변 %x를 했을때 dtors의 주소가 나오는지 확인하고, %n으로 .dtor에 eggshell의 주소값을 쓰면 된다.



일단 페이로드이다.

1
(python -'print "AAAA\x98\x95\x04\x08BBBB\x9a\x95\x04\x08%8x%8x%8x%62096c%n%52551c%n"';cat)|./attackme
cs

일단 4byte의 dummy를 넣어주고, dtors의 낮은주소 부분을 넣어준다. 

eggshell의 주소인 bfff fabc를 한번에 넣으려면 자릿수가 8개 이상이 필요하다. 

근데 일반적인 x86 ( 32bit ) 시스템에서는 이렇게 8개씩을 넣을수가 없다.

그래서 낮은주소 / 높은주소 절반을 나눠서 반절씩 갚을 전달해주는것이다.


%c앞에 숫자들은 공백을 출력하기 위해서이다. 공백을 출력해주고, %n으로 그 공백만큼 값을 넣어주는것이다. 

물론 이 공백은 eggshell의 주소의 절반씩만큼 이라는것을 항상 생각하자.


중간에 BBBB를 넣는것은 esp를 맞춰주기 위해서이다. 

dtors의 주소를 두번 연속으로 넘기면, 포맷스트링이 esp를 4씩 변경해주기때문에 두번째 주소는 생략될것이다.




'System Hacking ( pwnable ) > hackerschool FTZ Write-up' 카테고리의 다른 글

[FTZ] level19 ( write - up )  (0) 2019.05.28
[FTZ] level18 ( write - up )  (0) 2019.05.28
[FTZ] level17 ( write - up )  (0) 2019.05.28
[FTZ] level16 ( write - up )  (0) 2019.05.28
[FTZ] level15 ( write - up )  (0) 2019.05.28