안녕하세요!
오늘은 Format String Bug 두번째 시간입니다!
오늘은 공격시도와 마무리까지 해보겠습니다!
1. Format String 공격 준비
1) %x를 이용하여 buf의 위치를 구하기
buf의 위치는 공격시 원하는 주소에 값을 넣기 위해 사용되는 위치
buf의 위치는 공격시 원하는 주소에 값을 넣기 위해 사용되는 중요한 위치입니다.
2) %임의장소c + %n을 이용하여 원하는 주소에 원하는 값 삽입
100자리를 다음 4바이트 값을 주소로 참고하여 해당 주소에 100을 입력한다.
3) .dtors 주소 구하기
.dtors의 위치는 8049530가 됩니다.
시작은 fffffffff 끝은 00000000 으로 구성입니다.
시작과 끝 사이에 위치한 값이 종료시 실행될 함수입니다.
따라서 .dtors : 8049530 + 4 가 됩니다.
2. Format String 공격 및 결과
1) Root 계정으로 fsb.c 제작
2) Fsb로 컴파일 후에 4755 권한 부여
3) 일반 계정으로 공격 시작하기
이제 일반 계정으로 로그인 하여서 언어셋을 설정해줍니다.
이후 환경변수 주소 구하는 프로그램인 env 파일을 제작합니다.
다음으로 쉘코드를 환경변수에 주입 해줍니다.
이후 쉘코드를 주입한 함수의 주소의 위치까지 확인하겠습니다.
다음으로 덮어쓰게 될 .dtors 주소를 구하겠습니다.
8049530 + 4 = 8049534
위 주소를 16진수로 변경하게 되면 3221225165 나오게 됩니다.
정수자료형의 최대값이 넘쳐서 들어가지 못하기 때문에
2바이트(%hn을 사용 - %n의 반인 2바이트 단위로 사용하기때문)씩 짤라서 넣어주도록 하겠습니다.
bfff – 49151 , fecd – 65229
이제 공격 구문을 만들어 보겠습니다.
AAAA\x34\x95\x04\x08AAAA\x36\x95\x04\x08%8x%8x%8x%65229(-40)c%hn%49458c%hn
AAAA는 3번째%x 다음 %64510c자리에서 format 인자를 사용했기 때문입니다.
65229에서 40을 빼주는 이유는 앞의 문자들을 출력하기 때문에 앞의 문자 개수만큼 값을 빼야 합니다.
AAAA\x34\x95\x04\x08AAAA\x36\x95\x04x\08%8x%8x%8x%64470c%hn%49151c%hn
뒤의 %49458c 에서는 앞의 문자를 다 빼줘야 하는데 49458-(65189+40)
값이 작기 때문에 문제가 나오게 됩니다.
이 문제를 해결하기 위해서는 49151의 문자 bfff에 앞에 1을 붙여 1bfff로 만들고 계산을 합니다.(bfff 앞에 1을 붙여 주는 이유는 전체출력 개수를 1bfff로 만들어서 해결해야합니다 따라서, hn으로 2바이트 삽입이 되기 때문에 그렇습니다.)
114687 – 65189+40 = 49458
./fsb `perl -e 'print "AAAA","\x34\x95\x04\x08","AAAA","\x36\x95\x04\x08","%8x%8x%8x","%65189c%hn","%49458c%hn"'`
공격코드가 완성 되었습니다 이제 공격을 실행 해보겠습니다.
실행하여서 root 권한을 획득 하는 것을 보았습니다.
새로운 방법을 통해서 root 권한을 획득해보겠습니다
이전 방법은 큰 주소에서 작은 주소를 통해 값이 나왔습니다.
이번 방법은 작은 주소에서 큰 주소로 root 권한을 획득 해보겠습니다.
쉘코드가 저장되어있는 환경변수의 주소가 bfff fecd 인경우
출력해야 할 데이터양이 bfff 보다 feed 가 더크기때문에 fecd 부터 출력하여 입력
bfff 보다 feed 가 값이 더커 bfff를 남겨주기 위해 전체 출력 개수가 1bfff로 만들게 됩니다.
그럼 먼저 작은 값부터 출력하여 입력하게되면 1bfff의 연산을 안해도 됩니다.
먼저 주소 36을 먼저 이용하고 34를 쓰면 ffbf fbfe 순으로 들어가게 할 수 있습니다.
.dtors 0804534
0xbffffecd 쉘코드 주소
bfff – 49151 fecd – 65229
49151 – 40 = 49111
65229 – 49151 = 16078
위 방법을 사용하여서 쉘을 획득 하는 것을 볼 수 있었습니다.
마지막으로 Format String Bug의 대응방안에 대해서 알아보겠습니다.
포맷스트링의 원인은 문자열함수를 사용할 때 인자의 개수가 일치하지 않기 때문에 발생했습니다.
따라서 정확한 문자열 함수를 사용하거나 포맷 인자와 스트링을 1:1로 사용해서 대응해야합니다.
이상으로 Format String Bug를 마무리 하겠습니다.
수고하셨습니다!
'해킹 > 시스템해킹' 카테고리의 다른 글
[시스템해킹 도전기 12편] Format String Bug(1) (0) | 2021.02.16 |
---|---|
[시스템해킹 도전기 11편] 메모리 보호 기법 (0) | 2021.02.15 |
[시스템해킹 도전기 10편] RTL(3) (0) | 2021.02.13 |
[시스템해킹 도전기 9편] RTL(2) (0) | 2021.02.12 |
[시스템해킹 도전기 8편] RTL (1) (0) | 2021.02.11 |