'rop'에 해당되는 글 2건

  1. 2010.08.22 ISEC 2009 Challenge6 with GOT OverWrite
  2. 2010.08.17 Memory protection mechanisms in Windows (4)

2010.08.22 00:08 WarGame

*이 풀이는 Vnsecurity 에 올라온 ISEC 2009 Challenge6 풀이를 제 나름대로 정리하여 포스팅한 글임을 알립니다

ISEC 2010 일정이 최근에 공개 되었습니다

지난해 ISEC에 참여는 못했지만 CTF 풀이 문서는 남아 있을 것 같아서

뒤적 거렸더니 풀이 문서는 발견할 수 있었습니다

아쉽게도 문제 링크는 다 죽었더군요 -.-

풀이중에 GOT를 Overwrite 해서 그것도 꽤 특이한 방법을 쓴 것이 있어서

정리하여 둡니다

6번 문제는 Remote BOF 문제라고 합니다

핵심이 되는 주요 함수는 다음과 같습니다



23번째 줄에 있는 strcpy가 첫번째 관문입니다

이후에 있는 34번째 줄의 strncmp의 조건을 만족하기 위해서 이를 활용해야겠죠

randbuf 는 이후로 memset에 의해 초기화가 되니 이를 손댈수는 없고

randnum을 손대야 합니다

buf128에서 32byte를 입력받고

16byte의 destbuf16에 strcpy를 하니까 16byte가 Overflow 됩니다

여기서 randnum을 수정해줘야 하는데

소스상으로 약간 잘못된거 같네요

풀이자가 hand ray 로 풀어낸 모양입니다

아무튼 , 사실 randnum이 destbuf16보다 먼저 선언 되어 있어서

덮어쓸수 있다는 거죠

Dummy byte를 포함해서 쭉 덮어씌워야 합니다

속편하게 32byte 쭉 채워주면 되겠죠

첫번째 입력은 32byte만큼 특정 값을 채워줍니다

그 다음에 32번째에서 다시한번 입력을 받는데요

이번엔 128byte만큼 받습니다

바로 이곳이 Core 라는 겁니다

strncmp로 조금 전에 넣어두었던 randnum에 일치하는 수를 넣어줍니다

예를 들어 A로 채워주었다면

buf128에도 A를 채워넣어주면 되겠죠

는 풰이크고 사실 25번째 줄

snprintf(randbuf12, 5, "%d", randnum)

 에서 5자리만큼 잘려들어갔기 때문에

16337 이 들어갔을 겁니다

사실 randnum 에는 AAAA가 들어갔다고 했을 때 , 1633771873 이라는 값이 들어갔을 것이고

이는 int형의 MAX 값. 2^31-1 = 2147483647 을 넘지 않기 때문에 고스란히 들어갔겠죠

여기서 5자리가 잘려서 16337이 됩니다

또 34번째

if ( strncmp(buf128, randbuf12, 4) ) 

 에서 앞 4자리만 비교를 하게 되니

1633만 넣어주면 되겠죠

처음 4byte 는 1633 입니다

그 다음이 문젠데요

키를 읽어놓고 정작 출력을 해주지 않습니다

황당하기 그지 없는 경우죠

여기서 주목해야 할 점은 printf문 앞의 두 strcpy 문입니다

  strcpy(randbuf12, buf128);  
  strcpy(buf_ptr, buf128);

괜히 집어 넣은게 아니겠죠

buf_ptr이 가리키는게 없던것도 걸립니다

두번째에는 buf_ptr의 값을 맘대로 변경할 수 있게 했구요

네, 그러니까 buf_ptr는 '어디든지 문'이라고 보시면 됩니다

마법의 포인터죠

buf_ptr가 가리키고자 하는 곳의 주소를 입력하면

그 후의 strcpy에서 그 값을 바꿀수 있게 합니다

정말 멋집니다

이제 뭘 해야 할까요?


....




Local 이라면 이것저것 해보겠는데 Remote 라는게 뭐 어쩔 수가 없네요

Printf 문의 "eldhkcalb"  문자열을 keystr 의 주소를 바꾸면 되..

지 않겠네요

포인터로 가리키고 있다면 keystr를 가리키도록 바꾸면 될텐데 직접 문자열로 접근하고 있습니다

주소를 알아봤자 말짱 헛것이라는 거죠

생각해보니 우리가 원하는 것은 printf 문도 아닙니다

그렇다면 소켓으로 keystr을 보내주는 sendsocket 함수를 짜서 보내야될텐데

남은 버퍼에 그것이 다 들어가지도 않을 것이고 , Return Address를 손 댈 상황도 아니며

정확한 Buffer의 주소도 알 수 없습니다






정신을 추스리고 다시 살펴보죠

printf 문의 호출을 다른 함수로 바꿀수 있다면?

Windows의 Hooking 떠오릅니다

여기서 접근 한 것이 GOT 입니다

Global Offset Table의 줄임말로 함수의 정보를 담고 있는 Table 인데요

Windows에서 따지자면 IAT와 같은 역할을 하고 있다고 보시면 됩니다

흡사 Windows 에서 Hooking 하듯이 Linux에 적용해보는 겁니다

다만, 이 경우는 코드의 자유도는 떨어집니다

전에 있던 코드들을 짜깁기 해야만 하죠

흡사 ROP의 개념을 보는 것 같군요

Binary 가 없어서 직접 캡처해서 찍을수 없어 풀이자의 자료를 첨부합니다

<그림1. printf 와 fread의 GOT>

우리의 목적을 먼저 정의해봅시다

sendtosocket(fd , keystr, 32) 함수를 호출 하는 것입니다

이는 fread( keystr, 32, 1 , stream) 과 sendsocket( fd , "~~" );

로 합성될 수 있습니다


마침 인자 순서도 적절하군요

그림1을 보시고 뭔가 감이 오시나요?

printf 문을 호출 할 때 fread의 함수 일부를 호출 - fread를 호출할 때 sendsocket의 일부를 호출

이렇게 연쇄적으로 호출하면 우리가 원하는 목적을 달성할 수 있습니다

이런 류의 문제를 본적이 없어서 이해하는데 꽤 걸려버렸습니다




이를 토대로 Exploit 코드를 짜봅시다

처음 입력 받을 때 a 등의 문자로 32 byte 입력합니다

두번째 입력을 받을 때는 초기 4byte는 첫번째에 넣어주었던 값을 고려해서 strncmp를 통과할 수 있도록 넣어줍니다

이후 code가 핵심인데요

1) buf_ptr 가 우리가 원하는 값을 가리킬수 있도록 dummy byte를 넣어줍니다

<그림2. buf_ptr 하위의 메모리 구조>
* buf_ptr의 값은 아직 미정

2) dummy byte에는 printf의 GOT를 덮어씌울 주소가 들어갑니다

GOT 구조에 따라 이 dummy byte의 구성이 달라집니다

문제 풀이를 보니

0x0804A2FC : waitpid GOT
0x0804A304 : fread GOT
.....
0x0804A316 : printf GOT

이런 식으로 구성이 되어 있는것 같습니다

초기 4byte 때문에 fread 전에 있던 어떤 함수의 GOT부터 수정해 나가야 합니다

그게 바로 waitpid 로군요

이를 토대로 짜보면..

<그림3. Exploit 을 위한 메모리 구조, 변경 전>

그림1 을 참고 했을 때, printf 에는 fread의 일부가

fread 는 sendtosocket이 들어갑니다

<그림3. Exploit 을 위한 메모리 구조, 변경 후>

이를 토대로 짠 Exploit Code 입니다



** 제 나름대로 이해한 방법으로 글을 풀어보았습니다만, 제가 이해를 잘못했다거나 풀이자의 의도를 오해했을 수 있습니다

뭔가 틀린것 같다면 댓글로 남겨주세요 시정하겠습니다 :D
Posted by LinkC

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
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

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

공지사항

Yesterday49
Today11
Total323,945

달력

 « |  » 2018.12
            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          

최근에 받은 트랙백

글 보관함


. .