본문 바로가기
System/Linux

페도라 오버플로우 공략법 글

by bbolmin 2013. 12. 15.


ref : http://k1rha.tistory.com/entry/%EA%B5%AC%ED%99%8D%EC%9D%B4-%ED%98%95%EC%9D%B4-%EC%93%B0%EC%8B%A0-%ED%8E%98%EB%8F%84%EB%9D%BC-%EA%B3%B5%EB%9E%B5%EB%B2%95-%EA%B8%80




구홍이 형이 쓰신 페도라 오버플로우 공략법 글


http://x82.inetcop.org/h0me/papers/FC_exploit/


이제 Fedora 공략이라하면 x82님의 문서가 거의 바이블이 되었네욤 

fedora쪽은 관심이 쉽게 안 가서 대충만 읽어봤었는데 PADOCON을 계기로 필 받아 

정독 후 정리를 해보았습니다 (대회가 이래서 좋아요ㅋ)


Fedora Core 5, 6 based remote random-library breaker 

http://x82.inetcop.org/h0me/papers/FC_exploit/FC_oneshot_exploit.txt

- buffer overflow 대상입니다

- 라이브러리 함수들의 주소는 바뀔지언정 offset은 동일하다는

특징을 이용하여, 참조가 쉬운(PLT가 있는)다른 함수들의 주소를 

기반으로 execl 함수의 주소를 한 바이트씩 조합해 냅니다.

- 특정 함수의 GOT를 덮어씌은 후 그 함수의 PLT를 호출합니다.

- 결국 Random Library를 무력화 시킵니다.

- NULL을 사용하지 않으므로 아스키아머를 무력화 시킵니다.

- 덮어 씌우기 절차는 다음과 같습니다     

execve의 주소 : 00 dc 08 00

첫번째 복사 :   00 

두번째 복사 :      dc 0c 00

세번째 복사 :         08 00

- execve 함수의 인자 구성 방법

  - 첫째 인자 : binary image 상에서 /bin/sh등의 문자열을 구한다

  - 둘째, 셋째 인자 : NULL

  - 예제에선 /usr/local/bin/ftpdctl 문자열의 주소를 사용합니다 

    (이를 통해 명령 실행이 가능하다고 합니다)

- 의문사항

   - GOT에 함수의 offset 값이 들어간다고 하는데 FC1에서 테스트

     해보니 GOT에 함수의 절대주소가 들어가 있네요 흠.. 

     FCx 이후로 바뀐건가.. 조만간 테스트 예정입니다



Fedora Core 3 based local random-stack brute-force breaker 

http://x82.inetcop.org/h0me/papers/FC_exploit/random-stack%20brute-force%20breaker.txt

- BOF와 FS 모두에 유효

- Random Library가 아닐 때에 유효합니다. (FC3 이하)

- 기존 방법과 비교했을 때 binary image가 아닌 stack에서 인자를 찾는 점만 다릅니다

- ASCII armor 우회로는 fake ebp 사용

- target과 버퍼 환경을 동일하게 구성한 후 자식 프로그램으로

실행할 경우 적은 빈도수로 같은 주소가 형성됨을 이용합니다.

(페도라3까지 유효(?), 페도라4에서 패치(?), 하지만 이후 패치 사라짐(?))

- 추가> 페도라1에선 안 되네요 읏흠

- 추가> 페도라3에서도 안 되네요 ㅠ.ㅠ



Fedora Core 3 based GOT, PLT overwrite exploit method 

http://x82.inetcop.org/h0me/papers/FC_exploit/another_overwrite.txt

- BOF, FS에 유효

- 일반적인 GOT overwriting에 대해 설명합니다

- Random Library가 아닐 때 유효 (FC3 이하)

- GOT 영역 덮어쓰기에 대한 내용입니다.

- printf의 GOT를 system으로 덮은 후 printf의 PLT 호출


Fedora Core 3 based shellcode local & remote format string exploit method (Part #1) 

http://x82.inetcop.org/h0me/papers/FC_exploit/shellcode_overwrite.txt

- FS에서만 유효합니다

- MAPS 상에선 HEAP 영역에 실행 권한이 없지만 실제로는 있기

때문에 쉘코드를 올리고 실행할 수 있음을 증명하는 내용입니다. (페도라 3이하)

- 정확히는 Binary Image이 사용하는 .data 영역입니다

(이 다음 문서에서도 .data라고 설명하고 있습니다)

08048000-08049000 r-xp 00000000 fd:00 311375     /tmp/vuln

08049000-0804a000 rw-p 00000000 fd:00 311375     /tmp/vuln <- 여기

- 그럼 SRC가 되는 쉘코드의 주소는 어떻게 찾나?

-> 쉘코드의 주소를 찾는게 아니라 FS를 이용하여 직접 쉘코드를 입력합니다


Fedora Core 4,5,6 based shellcode local format string exploit method (Part #2) 

http://x82.inetcop.org/h0me/papers/FC_exploit/library_terror/

- FS에서만 유효합니다

- 이전 문서와 비슷하지만 HEAP이 아닌 Library 영역에 쉘코드를 올리고 실행하는 내용입니다.

- Library 주소 영역 내의 NULL 바이트 방어 우회가 핵심입니다.

- printing space 쪼개기 + $-flag + 환경 변수(or argv) 이용

- 환경 변수가 A=B\0C=D\0 형태로 이루어져있다는 점을 이용합니다

- 환경 변수(스택)의 주소는 $flag를 이용하여 상대참조합니다


Fedora Core 3,4,5,6 based remote format string exploit method 

http://x82.inetcop.org/h0me/papers/FC_exploit/FC-remote_do_system.txt

- FS에만 유효

- execve대신 system을 써보자에서 시작 

- do_system 함수를 이용하 execve보다 인자 구성이 쉬워집니다

- system 대신 do_system 함수를 사용하는 이유는 %ebp+8 위치의 

값을 %eax 레지스터에 넣는 과정을 무시하기 위해서입니다)

- 그리고 %eax는 DTORS+4 위치의 값이 됩니다


Fedora Core 3,4 based local format string exploit method (Part #1) 

http://x82.inetcop.org/h0me/papers/FC_exploit/FC_local_do_system.txt

- FS에만 유효

- 이번엔 do_system 함수를 로컬에서 활용합니다.

- setuid(0) -> do_system("sh"); 순서로 실행합니다.

- 어떻게 ASCII Armor를 우회하여 함수를 여러번 실행하나?

-> DTORS 체인의 특성을 이용하여 여러 번 함수를 호출합니다.

- setuid가 호출될 때 ebp+8이 0인 환경에서만 가능하단 단점이 있습니다.


Fedora Core 3,4,5,6 based local format string exploit method (Part #2) 

http://x82.inetcop.org/h0me/papers/FC_exploit/FC_local_do_system2.txt

- FS에만 유효

- setuid가 호출될 때 ebp+8이 0이여만한다는 문제점 해결

- dtors에 __do_global_dtors_aux()를 호출하여 ebp 위치 이동

- 다른 함수를 호출해도 ebp 이동 가능할 것 같지만 함수 에필로그에

ebp를 복구하므로 안 됨, 하지만 __do_global_dtors_aux()의 경우

에필로그 전에 dtors를 다시 호출하므로 가능

- 운 좋으면 한 번의 ebp 이동으로 0을 만날 수 있음 (target에 따라 다름)

- 문제는 그렇지 않은 경우, heap을 망가뜨리고 비정상 종료될 수 있음

- 따라서 dtors 테이블의 시작 주소를 강제로 변경하여 공격 수행

- 헐 x82님 짱 -_-b


Fedora Core 3,4,5,6 based local format string exploit method (Part #3) 

http://x82.inetcop.org/h0me/papers/FC_exploit/exec_format_string.txt

- FS에만 유효

- 위 문서대로 공격하면 uid 0만을 얻을 수 있다는 단점 보완

- exec* 함수 이용

- execve 보다 인자가 적은 execv 이용 

- 하지만 그냥 exev를 호출하면 인자들이 invalid

- __do_global_dtors_aux()를 이용하여 올바른 인자가 나올때까지 스택 변경

- __do_global_dtors_aux()+27(call 직후) 주소 실행

- 그럼 __do_global_dtors_aux+27의 주소가 execv의 첫 번째 인자가 됨

- 해당 기계어 코드와 동일한 심볼릭 링크 파일 생성


Fedora Core 3 based remote buffer overflow method 

http://x82.inetcop.org/h0me/papers/FC_exploit/FC3_remote_bof.txt

- BOF에만 해당

- 현재 esp에 원하는 데이터가 들어있지 않을 때, ret(pop eip)를

여러번 호출하여 원하는 데이터까지 이동시키는 방법을 설명합니다.

- 심볼릭 링크나 메모리에서 찾은 /bin/sh 문자열을 이용하는 것이

아닌, 직접 스택에 sh 문자열을 넣어 system 함수의 인자로 전달하는

것이 특징입니다. (리모트 환경에서 유리)

- 게다가 system 함수에 아스키아머가 있어 어차피 그 뒤로 인자를

이어 넣는 것이 불가능합니다.

- main의 sfp에 넣은 값이 특정 환경 하에선 system의 인자로 참조된다는

구조상의 특징을 이용합니다.

- main의 sfp -> leave하면서 ebp가 된다 -> call system 직후

push ebp가 된다 -> mov esp, ebp가 된다 -> 운 좋게도 ebp+8의

값이 ebp-8의 위치를 가리키게 된다

- FC3까지 유효

- 의문 : 문서의 system 함수에는 아스키아머가 없네요 오잉


Fedora Core 4,5,6 based local stack overflow exploit method (Part #1) 

http://x82.inetcop.org/h0me/papers/FC_exploit/FC4_local_overflow.txt

- ret 코드 반복 실행을 통한 esp sleding 

- 스택에 valid한 인자들이 나타날 때까지 sleding 

- execve나 ret 코드의 주소는 반복 출현 기반의 brute force로 찾음

- ret 코드는 binary image 주소 영역에서 찾음 (고정적)


Fedora Core 4,5,6 based local environment stack overflow exploit method (Part #2) 

http://x82.inetcop.org/h0me/papers/FC_exploit/FC_local_environ_bof.txt

- 위와 동일하지만 valid한 인자를 환경 변수로 직접 등록합니다

- 등록된 문자열의 주소는 어떻게 찾는가?

-> 환경변수 포인터를 이용합니다, 

오홋! **argv 뒤쪽에 보이던 것들이 바로 환경변수 포인터였군요!

0xbffa6e20  61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   a...............

0xbffa6e30  00 00 00 00 98 89 a6 00 00 00 00 00 98 89 a6 00   ................

0xbffa6e40  d4 6e fa bf e0 6e fa bf a8 6e fa bf 50 87 94 00   .n...n...n..P...

0xbffa6e50  02 00 00 00 d4 6e fa bf e0 6e fa bf 00 00 00 00   .....n...n......

0xbffa6e60  98 89 a6 00 20 00 93 00 b4 86 04 08 a8 6e fa bf   .... ........n..

0xbffa6e70  50 6e fa bf 12 87 94 00 00 00 00 00 00 00 00 00   Pn..............

0xbffa6e80  00 00 00 00 04 05 93 00 02 00 00 00 34 83 04 08   ............4...

0xbffa6e90  00 00 00 00 10 74 92 00 40 7b 92 00 04 05 93 00   .....t..@{......

0xbffa6ea0  02 00 00 00 34 83 04 08 00 00 00 00 55 83 04 08   ....4.......U...

0xbffa6eb0  e2 85 04 08 02 00 00 00 d4 6e fa bf 6c 86 04 08   .........n..l...

0xbffa6ec0  b4 86 04 08 40 7b 92 00 cc 6e fa bf b2 dd 92 00   ....@{...n......

0xbffa6ed0  02 00 00 00 e8 ec fb bf ec ec fb bf 00 00 00 00   ................

0xbffa6ee0  ee ec fb bf ff ec fb bf 0f ed fb bf 1a ed fb bf   ................

0xbffa6ef0  28 ed fb bf 32 ed fb bf f5 ee fb bf 0f ef fb bf   (...2...........

0xbffa6f00  61 ef fb bf 76 ef fb bf 85 ef fb bf 96 ef fb bf   a...v...........

0xbffa6f10  9e ef fb bf ae ef fb bf bb ef fb bf dd ef fb bf   ................

0xbffa6f20  f2 ef fb bf 00 00 00 00 10 00 00 00 ff fb eb 0f   ................

0xbffa6f30  06 00 00 00 00 10 00 00 11 00 00 00 64 00 00 00   ............d...

0xbffa6f40  03 00 00 00 34 80 04 08 04 00 00 00 20 00 00 00   ....4....... ...

0xbffa6f50  05 00 00 00 07 00 00 00 07 00 00 00 00 00 00 00   ................


Fedora Core 4 based -pie compile binary local stack overflow exploit 

http://x82.inetcop.org/h0me/papers/FC_exploit/0x82-breakeat-pie.txt

- pie 옵션으로 컴파일된 target에 대한 공격 테스트입니다.

- pie 옵션으로 컴파일되면 binary image마져 ASLR이 걸립니다.

- 하지만 아무런 인자 설정 없이 execve를 실행했을 때 random하게

특정 문자열을 참조하기 때문에 brute force로 해결이 가능합니다.


CentOS 4.2 based local stack overflow exploit (also, Whitebox Linux 4) 

- 앞서 연구한 것들이 CentOS에서도 먹히는지 확인 -> 먹힘


Fedora Core 5,6 based main() function stack overflow exploit method 

http://x82.inetcop.org/h0me/papers/FC_exploit/FC5_main_function.txt

- fedora5부터 새로 생긴 ecx canary 공략 방법에 대해 설명합니다.

- canary의 최하위 1바이트만 00로 만든다 -> 그럼 지역변수 위치를

가리키게 된다. -> ret sled를 이용하여 esp를 더할 수 있는만큼 더한다.

- main 함수의 에필로그를 한번 더 실행시킨다. (esp 대폭 이동->환경변수)

- 환경 변수 영역엔 execve의 주소와 valid한 인자들이 위치한다.



beist의 fedora overflow 요약

- execl+n으로 뛴다. 그럼 ebp+8이 아닌, ebp에서 인자참조하게된다.

- payload는 [string] [execl+n]으로 구성한다.






http://work.hackerschool.org/DOWNLOAD/TheLordOfTheBOF/VM_Fedora10.rar


위 Fedora 10 vm image엔 세 개의 BOF 문제가 준비되어 있습니다.


로그인 계정은 titan/out of the night 입니다.


관심 있으신 분들은 한번 풀어보세욥!



'System > Linux' 카테고리의 다른 글

[ARM bof] - execve 쉘코드  (0) 2015.02.18
QEMU & ARM & buybox 빌드하기  (0) 2015.02.08
linux x64 쉘코드  (0) 2013.12.15
Linux system call Table 참고  (0) 2013.12.15
리눅스 보호기법 체크 - checksec.sh  (1) 2012.10.26