최근 Webkit 프로젝트의 Javascript Engine 파트 Javascript Core 의 Race condition 버그를 찾게되었는데요!

 

아는분의 도움을 받아 RIP Controll 에 성공했습니다. YAY~~~

 

물론 리서치 도중에 패치되어 Report 까지는 이어지지는 못했습니다 ㅠ-ㅠ 세상의 슈퍼 짱짱짱 쩌는 해커들이 너무 많아서 힘들어요..

 

https://github.com/sweetchipsw/vulnerability/tree/master/Apple/JavascriptCore

 

sweetchipsw/vulnerability

Contribute to sweetchipsw/vulnerability development by creating an account on GitHub.

github.com

(Repository 스타와 팔로우 부탁드립니다.. 허헣)

 

그리고.. 더 얼마전에 해당 취약점 POC를 Github에 공개하게 되었습니다. (Exploit은 작성되었고 버전 정보 및 조건들은 조만간 새로운 블로그에 Write-up과 함께 동시에 업데이트 할 예정입니다)

 

이렇게 굳이 버그에 대한 예고(?) 글까지 쓰게 되는 이유는.. 개인적으로 원래 4월에 포스팅을 하는걸 목표로 했으나 게으름과 회사생활의 연속.. + 놀고먹기 등의 갖가지 핑계로 인하여 포스팅 일정이 무기한 연기가 계속되어 얼른.. 끝내버리고 싶은 마음에 올리게 되었습니다..

 

또 한가지 소식은.. 영어 쓰기 공부도 좀 하고 블로그를 글로벌 하게 운영하고 싶은 마음에 영문 블로그를 새로 만들게 되었습니다.

 

아무래도 영어로 좀 공을 들여 쓰다보니 글을 쓰는데 피로도가 x2배 기도 해서 느려지는것 같습니다.

 

새로운 블로그 주소는 https://bughunting.io/ 인데요! 나름 레어 도메인을 먹게 되었습니다!

 

앞으로 개인적으로 공부했지만 그중에서도 조금 더 '열심히' 공부 또는 연구했던 내용은 저 블로그에 '영문' 으로 올라갈 예정입니다.

 

그도안 안다녔던 회사를 다시 다니게 되면서 체력이 딸린다는 핑계로 그동안 개인 연구를 많이 못했지만... 그동안의 게으름을 반성하고 차차 다시 개인적인 연구를 진행하고 싶네요..

 

뜬금없지만 회사 다니면서 새벽에 연구 하시는분들 리스펙!

 

다음글은 새로운 글을 작성한 이후에 찾아뵙도록 하겠습니다.

안녕하세요 오랜만에 글을 업로드 해봅니다.


사실 좀 기간이 지나긴 했지만 가끔씩 물어보시는 분들이 계셔서.. 흠흠


몇달전에 제 깃헙에 지금까지 제가 발견했던 취약점들중 일부 POC를 공개했던 적이 있습니다!


모든 취약점을 공개할 수는 없어서 벤더사와 버그바운티사의 허락을 받은 취약점의 POC 만 공개합니다. (주로 브라우저 및 OS, 오픈소스 프로젝트 가 올라가있기도 하고 추가로 올라갈 예정입니다)


POC들은 대부분 웨포나이징의 목적이 아닌 취약점 증명이 목적이라 코드가 그리 깔끔하지 않습니다.


일부 POC는 EIP를 바꾸는 것도 있습니다. (IE 취약점 중엔 Vtguard 를 Memory Leak을 사용하지 않고 우회한 POC도 있었습니다 ㅎㅅㅎ)

Microsoft

Internet Explorer

  • CVE-2014-1799
  • CVE-2015-0037
  • CVE-2015-1712
  • CVE-2015-1714
  • CVE-2015-2447
  • ZDI-CAN-2712

Apple

OSX

  • CVE-2016-1818
  • CVE-2016-4780


아무튼 제 POC가 공부에 도움이 되시길.. ㅋㅋ


링크는 : https://github.com/sweetchipsw/vulnerability 입니다.


마지막으로..... 도움이 되셨다면 Star도 하나 박아주시면 정말 감사하겠습니다~ ㅎ





드디어.. 우리 동아리 SSG에서 빵빵빵 세미나 라는 자리에서 sweetmon 을 공개하고 Github에 공식적으로 릴리즈했습니다.


상세한 설명은 아래 sweetmon 주소를 참고해주시고..


첫번째 오픈소스 프로젝트라서 부족한 점이 많습니다.. (버그도 오늘 시연도중에 하나 발견했네요 ㅋㅋㅋ)


그리고 생각보다 버그가 많아서.. 하나하나 수정할 예정입니다.. ;ㅅ;


PEP 코딩 컨벤션도 지키지 않아서 개발자 분이 본다면 경악하실 수도 있겠습니다만.. (원래 혼자 쓰려고 했다는 말로 핑계를 대봅니다.. ;ㅅ;)


그래도.. 다시한번 sweetmon 을 소개해드리면


sweetmon은 Fuzz tester 들을 위해서 제작된 퍼져 및 크래시 모니터링 서비스로 다수의 VM에서 퍼징을 할 때 간단한 코딩으로 쉽게 크래시를 한 서버로 모아주고 알림해주는 서비스입니다.


코드는 모두 오픈소스이며, MIT 라이센스를 적용하였습니다.


프로젝트 및 디테일은 아래 링크에서 확인하실 수 있습니다.


https://github.com/sweetchipsw/sweetmon


https://github.com/sweetchipsw/sweetmon_client


버그 및 건의는 Issue 또는 Pull Request를 이용해주세요~



오랜만의 포스팅!


퍼져 모니터링 시스템인 sweetmon의 개발 상황을 메모 해두고자 오랜만에 포스팅 합니다!


우선 sweetmon 제가 Fuzzing 연구를 할때 다수의 VM에서 퍼징을 돌리곤 합니다.


그럴때마다 크래시가 새로 나올때마다 VM 하나하나 들여다보면서 나왔나 안나왔나.. 보는게 좀 많이 귀찮아서 그냥 한곳으로 파일을 쏴주는 스크립트를 제작하곤 했습니다.


하지만 귀찮음으로 인하여 계속 버그도 생기고 문제가 자주 발생해서 아예 (이전 보다는) 제대로 한곳으로 크래시를 모아주는 것을 만들어보자! 라고 해서 시작한 프로젝트가 sweetmon입니다.


그래서 기반 언어는 멀티플랫폼을 지원하는 Python을 선택했고 Django 프레임워크를 이용하여 개발했습니다.


프론트는 부트스트랩 템플릿인 Dashgum Free버전을 이용하여 개발했습니다!


현재는 잠시 퍼징 연구를 멈춰서 개발을 중단했다가 잉여한 방학생활을 의미있게 보내기 위해서 다시 개발을 시작했습니다.


그리하여.. 기능도 하나 둘 추가로 생기고 있습니다.



우선 현재 돌아가고 있는 각 Fuzzer의 상태를 모니터링 할 수 있고! (Fuzzer에서 웹 서버에 Ping을 때리면 돌고 있는 상태로 간주합니다)


몇개의 크래시가 나왔는지, 몇개의 테스트케이스가 돌았는지(이거는 사라질 수도 있는 기능..)을 모니터링 할 수 있습니다.


그리고 IDX옆에 있는 버튼을 누르면 Fuzzer의 IP, 타겟, 운영체제 등을 상세하게 볼 수 있습니다.



그리고 크래시의 목록들..


32번 ~ 35번을 보시면 됩니다!


각 크래시는 어떤 퍼져에서 나왔는지, 어떤 타겟이고 언제, 몇개의 동일한 크래시가 나왔는지 볼수 있습니다.



그리고 크래시 정보에 들어가면 이름, 리포트된 날짜, 타겟, 퍼져, 로그(로그는 퍼져가 직접 서버로 쏴줘야 합니다), 해시, 크기 등을 볼 수 있습니다.


아 그리고 간단하게 코멘트를 달 수 있는 기능도 있군요.


그리고.. 크래시 샘플을 다운로드 받을 수 있도록 다운로드 기능과 다른 사람에게 크래시를 공유하고 싶다면 1회용 링크를 생성해서 공유할 수 있습니다.


또한 중복된 크래시 샘플의 리스트를 쭉 볼수 있습니다. (가끔 퍼징을 하다보면 중복 크래시가 많이 나올때 최대한 작은 샘플을 구하고 싶을때가 있죠?)




그외 여러 기능들이 있지만 아직은 완성되지 않은 기능들이고..


일단 완성된 것들을 알려드리면


텔레그램 및 이메일 알림기능을 추가했고 유저가 쉽게 켜고 끌 수 있습니다. (전송 테스트도 가능해요!)


또한 싱글 유저에서 여러명이 사용 가능한 멀티 유저로 코드를 갈아 엎었고..


sweetmon과 개발자 정보도 넣었습니다. (추후에 오픈소스로 공개시 도움이 된 분들은 비트코인으로 Dontation을.. 읍읍..)



그리고 사진에 있지 않은 기능들은..

 - 제보한 취약점에 대해서 메모할 수 있는 기능

 - sweetmon-client 와 그나마 쉽게 연동 가능하도록 퍼져의 정보를 한번 등록해두면 자동으로 설정정보를 생성해주는...?

 - 메인 메뉴의 통계.. (매우 허접하여 없어질 가능성이 큼)

 - Fuzzer 등록 관리, 크래시 및 로그 전송, 핑 체크 등 퍼져와 연결할 수 있는 기능들


앞으로 개발 할 내용은..

 - 유저간 크래시를 공유

 - 크래시 암호화?

 - 기타 잡다한 기능들


등등이 있겠습니다.


그리고 지난번에 잠깐 언급한 sweetmon-client 는 웹 서버와 본인의 퍼져를 쉽게 연결할 수 있고 확장성을 고려하여 프레임워크같이 제작했습니다.


install.py를 실행하면 서버와 연결할 수 있는 정보가 생성되는데 이떄 제 유저 토큰을 입력하면 퍼져 리스트에 올라오도록 합니다.


(사진 재탕)


바로 7번 처럼 올라오게 되고


아래 코드를 이용하여 핑체크 및 크래시, 로그 전송이 가능합니다.


from sweetmon import *


F = Fuzzer(FUZZERINFO)

print("TEST PING", F.Ping())

print("TEST UPLOAD", F.Upload("test title", "here\nis_l0g", "/tmp/crashsample"))

print("END OF TEST..")


이렇게 업로드된 크래시는 


( 또 재탕)


이렇게 서버에서 확인할 수 있게 됩니다.


나머지 기능은 또 귀찮음으로 인해 언제 개발이 될지는 모르겠네요..


언젠가 제 첫번째 오픈소스 프로젝트가 되면 좋겠습니다 후후


끝!


요즘 한창 개발중인 프로젝트 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만 지원되는 환경일때 각 퍼져에 맞게 간단한 코딩만 해주면 퍼져 및 크래시를 서버에서 모니터링을 할수 있게 됩니다.




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


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


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


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

'0x10 정보보안 > 0x11 security' 카테고리의 다른 글

sweetmon 릴리즈!  (4) 2017.09.23
sweetmon 진전 상황  (5) 2017.08.16
GITHUB 업데이트 완료!  (0) 2017.04.04
무료 SSL 인증서 발급 받기 (letsencrypt)  (0) 2017.02.02
MSRC Top 100 선정!  (5) 2015.08.16

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


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


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


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


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


https://github.com/sweetchipsw

얼마전에 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 디렉터리에 했다면 심볼릭링크로 새로운 인증서로 자동으로 연결되므로 경로를 바꾸거나 하지 않아도 좋다.



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 은 위처럼 결과가 나온다.


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

+ Recent posts