기본 콘텐츠로 건너뛰기

11월, 2017의 게시물 표시

AU-file-structure

AU 파일 구조 Sun microsystems에서 개발한 오디오 파일 포맷으로 초기 웹 페이지에서 많이 사용되었다. offset size contents 4 “.snd” ID 4 4 Header size 8 4 DataSize 12 4 Encoding Type 16 4 Sample Rate 20 4 Channels 24 (x) Data 데이터 인코딩 포맷: 1 = 8-bit G.711 µ-law 2 = 8-bit 선형 PCM 3 = 16-bit 선형 PCM 4 = 24-bit 선형 PCM 5 = 32-bit 선형 PCM 6 = 32-bit IEEE 고정 소수점 7 = 64-bit IEEE 고정 소수점 8 = 조각난 샘플링 데이터 9 = DSP 프로그램 10 = 8 비트 고정 소수점 11 = 16 비트 고정 소수점 12 = 24 비트 고정 소수점 13 = 32 비트 고정 소수점 18 = 16 비트 linear with emphasis 19 = 16 비트 linear compressed 20 = 16 비트 linear with emphasis and compression 21 = Music kit DSP commands 23 = 4 비트 ISDN u-law compressed using the ITU-T G.721 ADPCM 음성 데이터 인코딩 스킴 24 = ITU-T G.722 ADPCM 25 = ITU-T G.723 3-bit ADPCM 26 = ITU-T G.723 5-bit ADPCM 27 = 8-bit G.711 A-law 출처 : 위키피디아 - Au

MIDI-file-structure

MIDI 파일 구조 전자 악기끼리 디지털 신호를 주고 받기 위해 각 신호를 규칙화한 일종의 규약이다. MIDI 파일은 실제 오디오의 녹음물이 아니기 때문에, 악기 명령들의 모음으로 녹음된 오디오 파일보다 용량이 훨씬 작다는 장점이 있다. offset size contents 4 “MThd” Header ID 4 4 Header Size 8 2 Format Type 10 2 Number Of Track 12 2 Time Division Track 4 “MTrk” Track Header ID 4 4 Track Chunk Size 8 (x) Track Data 8+(x) Track(n) …

힘내라 청춘. 20171130

Secure-Coding-C-preprocessor-1

C 언어 시큐어코딩 - Preprocessor 1 Universal character name을 연결을 통해서 생성하지 않는다. C 에서는 식별자, 문자 상수 및 문자열 리터럴에서 기본 문자 집합에 없는 universal character names의 사용을 지원한다. Universal character name \Unnnnnnnn 은 8 자리의 문자 nnnnnnnn 로 나타낸다. 유사하게 \Unnnn universal character name은 nnnn ( 0000nnnn )으로 나타낸다. 리터럴 값 그 자체로, 고정된 값을 의미한다. 예를 들어 const int b = 8; 에서 b는 상수이고 8은 리터럴이다. The C Standard, 5.1.1.2, paragraph 4 에 따르면 토큰 연결을 통해 생성한 universal character name의 동작은 정의되지 않는 것 으로 서술되어 있다. 이에 반드시 필요한 경우를 제외하고는 universal character names를 통한 식별자 정의를 피한다. 잘못된 코드 예제 #define assign(uc1, uc2, val) uc1##uc2 = val void func( void ) { int \u0401; /*...*/ assign(\u04, 01 , 4 ); /*...*/ } 상세 정보 이 코드는 Microsoft Visual Studio 2013을 사용하여 컴파일 및 실행되며 예상대로 변수에 4가 할당된다. Linux에서 GCC 4.8.1은 이 코드를 컴파일하는 것을 거부한다. universal character를 참조하는 assign 매크로에서 ‘프로그램 이탈’을 반환한다. 올바른 코드 예제 Universal character name를 사용하지만 토큰 연결을 사용하여 universal charater name를 생성하지 않는다. #define assign(ucn,

힘내라 청춘. 20171129

힘내라 청춘. 20171128

힘내라 청춘. 20171127

OGG-file-structure

OGG 파일 구조 멀티미디어 컨테이너 포맷으로 멀티미디어 비트스트림을 효율적으로 전송하고 처리할 수 있게 하기 위해 Xiph.Org 재단에서 개발한 것이다. Byte order ; Little endian offset length contens 0 4 OggS 4 1 Stream structure version (0x00) 5 1 Packet flag: bit 0: true if page continued bit 1: true if first page bit 2: true if last page bit 3..7: reserved 6 8 The end pcm sample position (64bit integer) 14 4 Stream serial number 18 4 Page number 22 4 Check sum 26 1 Number of segments(s) 27 (s) Sengment table 27 + (s) (b) Body (b := header[27] + header[27+!] + … + header[17+s-1])

AIFF-file-structure

AIFF 파일 구조 AIFF(Audio Interchange File Format)는 개인용 컴퓨터와 기타 오디오 전자 장비에서 사용하는 오디오 파일 형식으로 비압축 무손실 압축 포맷이며 고품질 오디오 CD를 굽는데 사용할 수 있다. 1988년에 애플이 일렉트로닉 아츠의 인터체인지 파일 형식(Interchange File Format, IFF)을 기반으로 공동 개발하였다. 주로 애플 매킨토시에서 사용된다. 파일 확장자는 .aiff, .aif, .aifc를 갖는다. offset length contents Header 0 4 “FORM” 4 4 File size - 9 8 4 “AIFF” Chunk 4 chunk magic 4 chunk data size(x) (x) chunk data COMM(Must) 0 4 “COMM” 4 4 COMM chunk size (==18) 8 2 Number of channels 10 4 Number of frames 14 2 bits/samples 16 10 Sample rate FORM 0 4 “FORM” 4 4 FORM chunk size(x) 8 (x) FORM chunk INST 0 4 “INST” 4 4 INST chunk size(x) 8 (x) INST chunk MARK 0 4 “MARK” 4 4 MARK chunk 8 (x) MARK chunk size(x)

힘내라 청춘. 20171124

[Fighting-youth]First-project

힘내라 청춘 - 첫 번째 프로젝트 오디오 파일 포맷 퍼징_첫 번째 기록 2017년 목표 중에 하나 였던 취약점 찾기를 한해가 끝날 무렵 시작하게 되었다. 취약점은 프로그래밍 실수에서 비롯된다는 점에 착안하여 비교적 쉬운 파일 구조의 오디오 파일 퍼징을 프로젝트 주제를 잡았다. 복잡한 단일 모델 처리와 간단한 다중 모델 처리 시 프로그래밍 실수는 언제 더 많이 발생하는 가에 대한 고민을 했을 때, 복잡성이 낮더라도 여러 모델을 처리해야 할 경우 논리적 결함이 발생할 확률이 더 높지 않는 가하는 결론에 도달했다. 먼저 파일 구조 분석을 시작한 것은 WAV와 AIFF 파일이다. WAV 파일은 검색 시 자료를 쉽게 구할 수 있으며, Peach Fuzzer에서 Tutorial로 제공해주는 파일 구조라서 도입 단계에서 진행 계획을 수립하기에 적합하다고 판단되었다. AIFF 파일은 개발된지 상당히 오래된 구조로 무손실 음원을 위해 활용되는 파일이다. WAV 파일 다음으로 AIFF 파일을 선택한 이유는 파일 퍼징 시 코드 커버리지를 높일 수 있는 방법은 해당 프로그램이 지원하는 파일 형식을 모두 대입하는 것 또한 하나의 방법이 될 수 있지 않을 까하는 판단에서 선택하였다. 많이 사용되는 mp3 나 mp4 와 같은 파일 형식은 이미 여러 퍼저들의 다양한 데이터 모델을 통해서 검증되었으리라 생각된다. 이에 비교적 검증 횟수가 적은 코드 경로를 거치기 위해서 사용률이 낮은 파일 형식을 선별하여 퍼징 테스트를 진행하고자 한다. 목표 프로그램 테스트 수행 전 단계로 VUPlayer를 활용하고 있으며, 아래는 현재 작성 중인 AIFF 데이터모델이다. <?xml version="1.0" encoding="utf-8"?> < Peach xmlns = "http://peachfuzzer.com/2012/Peach" xmlns:xsi = "http://www.w3.org/2001

힘내라 청춘. 20171123

WAV-file-structure

WAV 파일 구조 웨이브 파일 형식은 멀티미디어 파일 저장을 위한 마이크로소프트의 RIFF 사양의 하위 집합니다. RIFF 파일은 데이터 청크가 붙은 파일 헤더로 시작한다. 웨이브 파일은 데이터 형식을 지정하는 fmt 청크와 실제 샘플 데이터가 들어있는 data 청크라는 두 개의 하위 청크로 구성된 단일 wave 청크가 있는 RIFF 파일인 경우가 많다. endian field name field size(bytes) comment big ChunkID 4 “RIFF” 청크 설명자 little ChunkSize 4 “RIFF” 청크 설명자 big Format 4 “RIFF” 청크 설명자 big Subchunk1ID 4 “fmt” 하위 청크 little Subchunk1Size 4 “fmt” 하위 청크 little AudioFormat 2 “fmt” 하위 청크 little NumChannels 2 “fmt” 하위 청크 little SampleRate 4 “fmt” 하위 청크 little ByteRate 4 “fmt” 하위 청크 little BlockAlign 2 “fmt” 하위 청크 little BitsPerSample 2 “fmt” 하위 청크 big Subchunk2ID 2 “data” 하위 청크 little Subchunk2Size 4 “data” 하위 청크 little data 4 “data” 하위 청크 WAVE 형식은 RIFF 헤더로 시작한다. offset size name comment 0 4 ChunkID

힘내라 청춘. 20171122

IDAPython-simply-DataRef

IDAPython 데이터 참조 코드에 색상 설정 코드 “What” 문자열 위치 확인 후 해당 주소를 참조하는 코드에 빨간색을 설정하는 코드 findStr = "What" # 검색할 문자열 startPoint = MinEA ( ) # 최소 주소 endPoint = MaxEA ( ) # 최대 주소 while startPoint < endPoint : # 최대 주소를 넘지 않을 때 까지 "startPoint" 증가시키며 반복 수행 startPoint = idc . FindText ( startPoint , SEARCH_DOWN | SEARCH_NEXT , 0 , 0 , findStr ) # 문자열 검색 if startPoint == idc . BADADDR : break # 가능한 주소가 아니라면 while문 종료 elif '.rdata' == idc . SegName ( startPoint ) : print "Target : " , hex ( startPoint ) , idc . GetDisasm ( startPoint ) # 문자열 위치 정보 출력 for refAddr in DataRefsTo ( startPoint ) : print "Ref : " , hex ( refAddr ) , idc . GetDisasm ( refAddr ) # 참조 위치 정보 출력 idc . SetColor ( refAddr , CIC_ITEM , 0x2020c0 ) # red color # 참조 위치 빨간색 설정 startPoint = idc . NextHead ( startPoint ) # 검색 진행을 위해 "startPoint"에 다음 instruction 설정

IDAPython-simply-patching

IDAPython을 이용한 데이터 패칭 _printf 함수 인자 값 전달 전 EAX 레지스터에 저장된 데이터 주소를 확인하여 해당 주소에 데이터를 xor 패치 후 _printf 함수를 호출하는 간단한 IDAPython 코드이다. def DecodeKey (eax) : for n in range( 0 , 5 ): print "target: " , chr(Byte(eax + n)) # 수정될 문자 PatchByte(eax + n, Byte(eax + n)^ 0x33 ) # xor 연산 print "patch: " , chr(Byte(eax + n)) # 수정 후 결과 def BreakManager (startPoint, targetPoint) : AddBpt(startPoint) # 패치 수행할 위치 afterFunc = idc.NextHead(targetPoint) AddBpt(afterFunc) # _printf 수행 후 위치 findCode = "89 44 24 04" # mov [esp+4], eax targetFunc = "_printf" # 패치한 결과를 전달할 목표 함수 startPoint = MinEA() while True : startPoint = idc.FindBinary(startPoint, SEARCH_DOWN|SEARCH_NEXT, findCode) # 코드 검색 if startPoint == idc.BADADDR: break else : targetPoint = startPoint for ni in range( 0 , 2 ): targetPoint = idc.NextHead(targetPoint) if targetFunc == id

CVE-2017-1081_FreeBSD_ipfilter_UAF

FreeBSD ipfilter use-after-free 취약점 해당 글은 xorl %eax %eax의 취약점 분석 포스팅 을 참고하여 작성하였습니다. FreeBSD의 ipfilter에서 Use-After-Free 취약점(CVE-2017-1081)이 발생하였다. sys/contrib/ipfilter/netinet/ip_frag.c static ipfr_t * ipfr_frag_new(softc, softf, fin, pass, table #ifdef USE_MUTEXES , lock #endif ) ... ipfr_t *fra, frag, *fran; ... /* * 가능한 경우 메모리를 할당하고, 실패 시 기록 후 NULL 반환 */ KMALLOC(fran, ipfr_t *); if (fran == NULL) { FBUMPD(ifs_nomem); return NULL; } ... /* * 이미 존재하지 않는 지 확인 */ for (fra = table[idx]; (fra != NULL); fra = fra->ipfr_hnext) if (!bcmp(( char *)&frag.ipfr_ifp, ( char *)&fra->ipfr_ifp, IPFR_CMPSZ)) { RWLOCK_EXIT(lock); FBUMPD(ifs_exists); KFREE(fra); return NULL; } fra = fran; fran = NULL; fr = fin->fin_fr; fra->ipfr_rule = fr; if (fr != NULL) { MUTEX_ENTER(&fr->

힘내라 청춘. 20171121

힘내라 청춘. 20171120

IDAPython-basic-code-snippet

IDAPython 시작하기 많이 사용되는 기본 구문 바이트 : idc.Byte(ea) 워드 : idc.Word(ea) 더블 워드 : idc.Dword(ea) 쿼드 워드 : idc.Qword(ea) Float : idc.GetFloat(ea) Double : idc.GetDouble(ea) 현재 커서 위치 읽어오기 : ea = idc.ScreenEA() 어셈블리 코드 읽어오기 : idc.GetDIsasm(ea) 명령어 읽어오기 : idc.GetMnem(ea) 인자 읽어오기 : idc.GetOpnd(ea, n) 인자 형식 읽어오기 : idc.GetOpType(ea, n) 유효 주소 확인 : if BADADDR != here(): 섹션 출력하기 : for seg in Segments(): print idc.SegName(seg), idc.SegStart(seg), idc.SegEnd(seg) 함수 목록 출력하기 for fun in Functions(): print hex(func), idc.GetFunctionName(func) 사용 가능한 함수 목록 확인하기 ea = ScreenEA() func = idaapi.get_func(ea) print dir(func) 특정 주소가 위치한 함수 영역 구하고 어셈블리 코드 출력하기 ea = ScreenEA() func = idaapi.get_func(ea) start = func.startEA end = func.endEA print "Start: 0x%x, End: 0x%x" % (start, end) while start <= end: print hex(start), idc.GetDisasm(start) start = idc.NextHead(start, end) 코드 상호 참조 찾기 strcpy_addr = idc.LocByName( "st

힘내라 청춘. 20171118

힘내라 청춘. 20171117

Windows-Cpp-Exception-via-SEH-1

SEH를 거치는 Windows C++ Exception 윈도우에서 사용되고 있는 Structured Exception Handling(SEH) 는 Exception 관리 시스템이다. 하지만 C++은 자체적으로 Exceptoin을 관리한다. 우리는 예제를 작성하여 WinDbg에서 어떻게 Exception이 관리되는 지 볼 것이다. Structured Exception Handling(SEH) Exception은 프로그램이 실행되는 동안 발생되는 이벤트로 프로그램이 정상적인 제어 흐름을 벗어날 때 야기된다. Exception은 hardware exception 과 software exception 크게 두가지 종류로 분류된다. Hardware exception 은 CPU에 의해 시작된다. 0 나누기 연산이나, 접근 불가 메모리에 접근을 시도하는 명령어 구절을 실행하려고 할 때 발생한다. Sofrware exception 은 응용 프로그램이나 운영체제에 의해 발생한다. 예를 들어, 유효하지 않은 인자에 값을 지정할 때 감지될 수 있다. Structured exception handling 은 hardware와 software exception 양쪽을 처리하는 메커니즘이다. 그리므로 코드는 hardware와 software exception을 동일하게 처리할 수 있다. Structured exception handling 은 디버거, 모든 프로그래밍 언어와 기계를 지원하며 제어를 가능하게 한다. ( Vectored exception handling 은 structured exception handling 이 확장된 개념이다.) 시스템 또한 termination handling 을 지원하므로 보호된 코드 본문이 실행될 때 마다 지정된 종료 코드 블록이 실행되도록 할 수 있다. 종료 코드는 어떻게 보호된 본문을 빠져나갈 것인지에 대한 제어 흐름과 관계없이 실행된다. 예를 들어, termination handler 는 코드의 보호

힘내라 청춘. 20171116

Windows-Kernel-Network-Debugging

Windows Kernel Network Debugging 설정하기 윈도우 커널 네트워크 디버깅은 윈도우 8 이상에서 지원해주는 디버깅 옵션으로 네트워크 기반으로 편의성을 지원한다. 기존 케이블(파이프, USB) 기반 디버깅은 최대 전송 데이터 양이 낮아 디버깅 시 느린 속도로 답답함이 있었다. 이에 반해 네트워크 디버깅은 기가 바이트 급 속도로 빠른 디버깅 속도를 보여준다. 설정 디버깅 설정에 앞서 먼저 장치 관리자 에서 네트워크 어댑터의 BusNumber, DeviceNumber, FuctionNumber를 확인하고 진행한다. bcdedit /dbgsettings net host: < 디버거 ip > port: < 디버거 port > key:1.2.3.4 bcd edit /set {dbgsettings} busparams < BusNumber > . < DeviceNumber > . < FunctionNumber > bcdedit -debug on 디버거 호스트에서 지정한 포트와 키 값으로 WinDBG를 실행한 후 디버기 호스트 재부팅을 진행하면 연결되는 것을 확인할 수 있다.

힘내라 청춘. 20171115

X-Frame-Options-Test

X-Frame-Options 테스트하기 X-Frame-Options 페이지 구성 시 삽입된 프레임의 출처를 검증하여 허용하지 않는 페이지 URL일 경우 해당 프레임을 포함하지 않는 확장 응답 헤더이다. 보안 목적으로 사용되는 확장 헤더로 아직 적용되지 않은 사이트들이 많지만 앞으로 점차 적용될 것으로 보인다. X-Frame OptionsDENY, SAMEORIGIN, ALLOW-FROM 옵션을 이용하여 세부 정책을 설정한다. 옵션 설명 DENY Frame 비허용 SAMEORIGIN 동일한 ORIGIN에 해당하는 Frame만 허용 ALLOW-FROM 지정된 ORIGIN에 해당하는 Frame만 허용 크롬 4.1 , IE 8 , 오페라 10.5 , 사파리 4.0 , 파이어폭스 3.6.9 이상에서는 DENY , SAMEORIGIN 이 적용되며, ALLOW-FROM 은 각 브라우저 마다 지원 현황이 다르다. https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/X-Frame-Options 해당 확장헤더는 브라우저에서 처리하는 응답 헤더이므로 미지원 브라우저 사용 시 설정과 무관하게 페이지 내 포함된 모든 Frame을 출력한다. (검증 테스트: Opera 5.0.0) 테스트 코드 DENY <!DOCTYPE html> < html lang = "en" > < head > < meta http-equiv = "X-Frame-Options" content = "deny" /> < title > Deny option Test </ title > </ head > < bod

힘내라 청춘. 20171114

os-x-windows-kernel-debug

맥에서 윈도우 커널 디버깅 설정하기 1) 타겟 가상 이미지와 디버거 가상 이미지를 준비한다. 2) 타겟 가상 이미지를 구동하여 디버깅 설정을 한다. Windows XP (boot.ini에 디버그 옵션 추가 혹은 기존 항목 복사하여 새 부팅 목록 생성) notepad C:\boot.ini /debug /debugport = com1 /baudrate=115200 Windows 7 bcdedit / copy {current} /d "Debug" msconfig 실행 - 부팅 > "Debug" 항목 선택 > 고급 옵션 > 디버그 항목 선택 후 디버그 포트 "COM1:" 으로 설정 3) 타겟 가상 이미지 전원을 끈 후 시리얼 포트 설정을 한다. - 가상 이미지 폴더에 확장자 VMX 파일 수정 serial0 .present = "TRUE" serial0 .fileType = "pipe" serial0 .fileName = "/private/tmp/com1" serial0 .tryNoRxLoss = "FALSE" serial0 .pipe .endPoint = "server" serial0 .startConnected = "TRUE" serial0 .yieldOnMsrRead = "TRUE" 4) 디버거 가상 이미지 시리얼 포트 설정을 한다. serial0 .present = "TRUE" serial0 .fileType = "pipe" serial0 .fileName = "/private/tmp/com1" serial0 .tryNoRxLoss = "FALSE" serial0 .pipe .endPoint = "

힘내라 청춘. 20171113

Windbg-windows-kernel-debugging

VMware 윈도우즈 커널 디버깅 환경 설정 윈도우즈 커널 디버깅을 위해 VMware를 활용해보자. 1) 호스트 PC에 Windbg를 설치한다. 검색엔진에서 Windbg 설치 를 검색하면 쉽게 마이크로 소프트 페이지를 찾을 수 있다. 설치 프로그램을 다운받아 설치를 진행한다. 2) 가상 머신의 전원을 끈 후 VM > Settings > Add > Serial Port 를 선택하여 Serial Port를 추가한다. 생성 시 Output to named pipe 옵션을 선택하고 \\.\pipe\[이름 지정] 의 형식으로 Name Pipe를 설정한다. 3) 가상 머신의 전원을 켜 C:\boot.ini 파일을 생성한다. [boot loader] timeout = 30 default =multi (0) disk (0) rdisk (0) partition (1) \ WINDOWS [operating systems] multi ( 0 )disk( 0 )rdisk( 0 )partition( 1 )\ WINDOWS = "Microsoft Windows XP Professional" /fastdetect /debugport= COM1 /baudrate= 115200 4) 호스트 PC에서 명령 프롬프트 실행 후 Windbg 설치 디렉터리로 이동한다. windbg.exe" -k com:port=\\.\pipe\[지정한 이름],baud=115200,pipe,reconnect 명령어를 실행하여 연결을 기다린다. 5) 가상 머신을 재시작하면 호스트 PC의 Windbg에서 연결에 성공한 것을 확인할 수 있다. 6) Break( Ctrl + Break ) 버튼 선택 시 디버그 모드가 동작한다. 7) File > Symbol File Path 를 선택하여 심볼을 설정한다. SRV *c :\symbols *http : //msdl .microsoft.com/download/symbols 웹 심볼