'aslr'에 해당되는 글 2건

  1. 2010.08.17 Memory protection mechanisms in Windows (4)
  2. 2010.03.28 [ CodeGate2010 ] Chanllenge 4 풀이

2010.08.17 10:32 System

<그림 1. Windows 버전별 적용 Memory Protection>

08년도 Black hat 에서 공개된 문서입니다

벌써 2년이나 지났네요

주인장은 나날이 잉여력을 뽐내는데 배울건 한없이 늘어나네요 

이 기술들을 일일히 나열하려면 끝이 없을거 같으니 

간단히 소개하는 정도로 포스팅을 마치겠습니다

[+]GS

GS Flag를 셋팅하여 Buffer가 변조되었는지 체크 합니다

해당 옵션은 VC 옵션에서도 찾아볼 수가 있죠

<그림 2. VC에서 GS Flag를 설정하여 Stack Cookie Option을 On 시킨 모습 - Default>

이 Protection Mechanisms 은 Linux 의 StackGuard 형식과 유사합니다

스택상의 Return Address 앞에 공간을 할당하여 Cookie를 가리키는 포인터를 저장하는 거죠[ 이를 Security Cookies 혹은 Stack Cookie 라고 합니다 ] 

<그림 3. 함수 내에서 Security Cookie 를 체크하는 부분>

함수가 시작 될 때와 종료될 때 가리키는 Cookie 값을 비교하여 다르면 Process를 종료하는 식입니다


[+] Safe SEH [ Structured Exception Handling ]

SEH 는 프로그램 내에 예외상황이 발생했을 때 실행되는 코드입니다. 

런타임에 예외가 발생하면 OS는 이미지 헤더를 확인해서 SEH 주소가 올바른지 여부를 판단하고, 그렇지 않을 경우 

종료합니다


[+] DEP

프로그램 내 Exploit 코드 실행을 방지 합니다

일반적으로 Code Injection 등을 통해서 쉘코드를 실행시키려고 하면 이 Prtoection 에 걸려버리는걸 확인할 수 있죠



해커들이 DEP를 꺼버리고 공격하는 방법을 이용 하자, 영구 DEP를 걸어버리죠

물론 이 마저도 우회하는 방법이 추후에 나왔지만요

[+] ASLR

Windows Vista 나 7 환경에서 디버깅을 해보신 분은 알겠지만 

프로그램이 로딩되는 OEP의 주소나 스택, 힙 모든 값이 실행할 때마다 변하는걸 보신 적이 있을 겁니다

바로 이 기술의 적용 때문인데요

PEB나 TEB는 XP에서부터 적용이 되고 있었군요 :D



살펴보면 Memory Protection 이 정말 많네요

물론 한번에 적용되었던 것이 아니라 몇년에 걸쳐서 이루어진것입니다

후에 적용된 기술이 아무래도 Exploit 하는데 좀 더 까다로운 모습을 보이죠

*Dino A.Dai zovi의 다음 문서를 참고했음을 알립니다



<그림 4. 기술들의 Exploit 어려움 정도>



또한, 이러한 기술들은 단순히 한가지 분류가 아니라 3가지

Compiler 와 Application  , OS Run- Time 으로 나눠 보여주는군요


<그림 5. OS, Compiler, App 가 Base가 되는 기술들  >



간략히 Memory Protection 에 대해서 정리했습니다

물론 앞으로도 이러한 Protection 을 우회하는 방법은 나올 것이고

그에 따라 Protection 기법들도 업그레이드 해나가겠죠

절대적인 창도 , 방패도 없는 그런 분야니까요

각 기술들에 대한 자세한 정리는 차후에 차근차근 해나가야겠네요

그 날짜가 언제가 될지 모르겠다는게 문제지만요 :(

뭔가 알맹이가 없는 포스팅만 하는거 같네요
 
럭셔리한 포스팅을 하는 그날까지 분발해야겠습니다

...

라고 말하는것도 몇번짼지 모르겠네요


'System' 카테고리의 다른 글

UAC 적용 조건 및 사례  (0) 2010.09.29
DLL Hijaking Exploit in Windows Movie Maker  (0) 2010.09.06
Memory protection mechanisms in Windows  (4) 2010.08.17
DLL injection on 64 Bit OS  (2) 2010.08.03
Screen Capture with DLL injection  (2) 2010.07.27
서비스 프로그래밍  (3) 2010.04.27
Posted by LinkC

2010.03.28 11:06 WarGame


문제 설명입니다

credentials: ctf4.codegate.org port - 9000, 9002, 9004, 9005, 9006 (you can choose any port)

BINARY FILE: http://ctf.codegate.org/files____/easy


해당 포트에 접속해보면



매우 간단해 보이네요

바이너리 파일은 위 주소에서 구할 수 있습니다

간단한 오버플로우 문제 같군요

먼저 hex ray로 소스를 보면




약간 꼬아놓긴 했습니다만 오버 플로우 취약점이 있다는 것은

누구나 매의 눈으로 찾아 낼 수 있습니다

일반적인 경우는 아니군요

쉘 코드를 집어넣을 적절한 장소가 필요합니다

마침 func 함수에 적절한 크기의 변수가 할당되어 있군요

할당된 크기를 보면 char형의 264크기의 배열이 할당되었다고 보시면 되구요

저기에 쉘 코드를 넣은 다음 RET을 시작 주소로 바꿔주면 되겠습니다만

요는 저 문제에 적용된 Overflow 방지 기법이겠죠

문제 2번에서 제공된 ID , PW 로 ctf4 서버로 접속해서 확인해보면




힙, 스택 주소가 계속 바뀌는걸 볼 수 있습니다

조금 전에 생각했던 RET 을 dest의 주소로 덮어씌우는 단순 방식은

정확한 stack 주소를 얻어내야 하기 떄문에

좀 어렵게 되었군요  

[ 윈도우에서도 Vista 부터 같은 원리의 기법이 적용된 바 있는데요

ASLR(Address Space Layout Randomization) 으로 불리며

Reversecore님의 잘 정리된 자료는

http://www.reversecore.com/69 에서 참고하실 수 있습니다 ]

이를 우회하는 방식은 발표 자료로 정리한게 있는데

http://linkc.tistory.com/entry/26-kernel-에서의-BOF

를 보셔도 좋구요

ASLR 우회 기법을 샘플 코드와 그림까지 첨부한 문서인

http://www-users.rwth-aachen.de/Tilo.Mueller/ASLRpaper.pdf

을 보시면 됩니다

문제 풀이에는 RTL  기법을 적용하는 방법이 있겠습니다만

이번 문제는 문제 자체 소스의 특성을 이용해 보도록 합시다

memcpy가 func 함수에서 가장 나중에 쓰인 것을 볼 수 있습니다

memcpy가 리턴값으로 Destination address를 준다는 건 혹시 알고 계신가요?

이를 이용해봅시다

그러니까 리턴값을 저장하는 eax는  Dest 의 주소를 가진다는 거겠죠

이 eax를 이용해 볼까요?




이런식으로 Exploit이 진행 될 수 있습니다

이제 전체적인 코드를 짜볼까요

먼저 필요한건

1. shell code

2. shell code와 eax를 채워줄 dummy byte

3. call eax 를 실행하는 text 영역의 주소


*이 3가지는 스택이나 힙 변화에 영향을 받지 않으므로

이 문제를 해결하는데 유효 합니다


먼저 ctf4 서버에 접속해서 reverse shell 이나 bind shell 등

뭐가 좋을까 봤는데

어째 문제 서버에서 외부로 연결이 잘 안되군요 -.-

애초에 문제 포트를 빼고 외부로의 연결을 막아놓은 건지는 잘 모르겠습니다만

저는 reverse shell 을 하되 주소를 127.0.0.1 으로 주어 서버 자신의 포트로 reverse telnet 을 걸었고

서버에 미리 접속해서 그  특정 포트에서 응답을 대기하도록 했습니다

dummy byte는 shell code + dummy byte = 264 byte

로 간단히 쉘코드 길이를 계산해서 넣으면 되겠쬬

그다음은 call eax 를 실행하는 text 영역의 주소가 필요합니다

이는 IDA 를 사용하거나 Metasploit을 이용하면 되겠군요






두 주소 모두 같은 명령어니까 아무거나 집어넣어도 상관 없습니다

0x080484df를 이용해봅시다




문제 서버에 접속해서 미리 포트를 열고 대기하고

공격을 하면...






P.S

http://coma.0x3f.net/uncategorized/codegate2010-ctf-level-4

에서 풀이도 봤습니다

쉘 코드가 264 byte에 충분히 들어가지만

안들어가는 경우를 생각했던건지

다소 복잡하지만 재밌는 방법을 사용했더군요








Posted by LinkC
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday37
Today47
Total314,320

달력

 « |  » 2018.07
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

최근에 받은 트랙백

글 보관함


. .