취약점 분석 55

아드레날린 SEH 취약점 분석

1 아드레날린 POC exploit-db에 올라온 exploit poc이다. POC 내용을 보면 [BOF유발’A’*2140개 + SEH overwrite + 쉘코드]로 심플하게 구성돼있다. POC 파이썬 스크립트를 실행하면 .wvx 파일이 생성된다. 아드레날린을 열고 .wvx파일을 드래그하면 계산기가 팝업된다. 왜 그런지, 실제로 어떻게 동작하게 되는 건지 원인으 분석해보자. 2 POC 실행 테스트 아무 BP없이 무작정 poc파일을 올려보았다. 앞서 POC 스크립트를 봐서 SEH 취약점이라는 것을 알고있기도 하지만, 쉘코드가 진행되지 않고 예외처리를 묻는 과정에서 멈춘다는 점에서 다시한번 SEH 취약점이구나를 짐작할 수 있다. 우측 스택을 보면 이미 수 많은 "AAAA"들로 가득차서 BOF가 진행된 상태..

[Anyburn 4.3 x86] SEH Unicode Exploit 분석

[Anyburn 4.3 x86] SEH Unicode Exploit https://www.exploit-db.com/exploits/46507 스택기반은 원인 근처에서 터지므로 딱히 원인분석이라 하기도 민망하다. Image file name에서 BOF 취약점 발생. 때려박아 넣자. [원인] 1. 입력값의 길이는 계산 되었으나 2. 목적지와의 크기 검증이 없음. 입력값의 크기가 계산된 후 _write_string 함수를 호출하는데, 목적지 크기와의 검증이 없다. 입력값의 크기가 loop counter로 들어와 wchar 한글자씩 옮기는 loop. 1. 목적지 버퍼와의 크기 검증이 없어 목적지 버퍼를 훨씬 넘어서는 스택을 다 덮어버리고 2. 스택 끝까지 도달하여 강제 예외발생. 3. 덮어쓴 SEH를 통해 E..

immunity debugger 가젯 검색 팁

immunity debugger 가젯 검색 팁 1. 보통 mona.py 를 이용해서 rop, seh, stackpivot 등 원하는 가젯 찾는 자동화 기능 지원, 2. 또한 !mona findwild -s "명령어 # 명령어 # 명령어" 등으로도 찾기 가능. (r32, * 와일드카드 제공) 3. 디버거 옵션으로도 찾아보자. Search for All Sequences 에서 CONST, R32 등 와일드카드를 이용하여 add esp, CONST; pop R32; ret; 이런식으로 이뮤니티 디버거 혹은 올리디버거 내에서 순차적으로 검색 가능. [모나 메뉴얼] https://www.corelan.be/index.php/2011/07/14/mona-py-the-manual/ mona.py – the manua..

ascii to unicode 변환 (codepage별 정리)

Ascii to Unicode 변환 (Codepage 별로 정리) 많은 사람들이 ascii에 그냥 00붙는 거 아니냐? 하곤 한다. - ex) 0x01 --> 0x01 0x00 - ex) 0x0a --> 0x0a 0x00 절반만 맞다. int MultiByteToWideChar( UINT CodePage, --- 어떤 unicode로 변환할래? DWORD dwFlags, LPCSTR lpMultiByteStr, --- 변환 할 문자열이 담긴 곳 int cbMultiByte, LPWSTR lpWideCharStr, --- 변환 결과 문자열이 담길 곳 int cchWideChar ); ascii -> unicode로 변환은 MultiByteToWideChar 함수를 통하는데, 여기서 CodePage에 따라 ..

shift 연산으로 원하는 값 만들기 팁

shift 크기를 내가 마음대로 결정할 수 있는 경우가 있다. shift 연산이야 그냥 하면 되는데 왜 이런 글을 썼을까? 32비트 기준으로 맨오른쪽에 있는 비트 1이 맨왼쪽끝으로 오려면 shl 31 할 때이다. 즉 shl 32 부터는 32비트 레지스터에 담겨있던 기존의 모든 값이 shift 연산으로 날아간다. 그래서 0이 되는 것이 아닌가? 했는데 결과가 그렇지 않아서 의문이 생겼다. x86 guide에 따르면 다음과 같다. “shifts counts of greater than 31 are performed modulo 32” 따라서 mov eax, 1 shl eax, 89 결과는 0x200이 된다.

힙 손상 탐지(2-2) - 힙 오버런, 언더런 (Full PageHeap)

힙 손상 탐지(2-2) - 힙 오버런, 언더런 (Full PageHeap)힙 손상 탐지(2-1) - 힙 오버런, 언더런 (Normal PageHeap) 를 먼저 읽고 보자. gflags를 이용한 풀 페이지힙 적용 방법gflags.exe /p /enable /full/p : 페이지 힙/enable : 특정 옵션을 킴/full : 풀 옵션으로~! [ 풀 페이지 힙 - 할당 ][시나리오]1) 0x30 크기만큼의 힙을 할당 / 해제.2) Full PageHeap 적용 후 windbg에서 분석 1) 0x30 크기의 힙을 요청에 성공하고2) EAX에 유저 영역 시작 주소를 반환 받았다. 명령어 : !address 할당받은 0x30크기의 힙을 !address로 봤더니 Heap이 아닌 PageHeap으로 뜨는 것을 볼..

힙 손상 탐지(2-1) - 힙 오버런, 언더런 (Normal PageHeap)

힙 손상 탐지(2-1) - 힙 오버런, 언더런 (Normal PageHeap) 힙 버퍼 오버플로우. 참 많이 접해 본 단어이다.할당된 공간을 넘어서 인접한 다른 힙 청크를 덮어쓰는 것 뿐인데 어떤 문제를 야기할 수 있을까?예를 들어보자.덮어써진 힙에서 참조한 값으로 출발지 힙의 크기를 계산하여 소스힙을 할당한다던지 -> 또 다른 버퍼오버플로우 유발 가능.덮어써진 영역이 가상함수 테이블이라면..? -> 가상함수 호출 시 EIP가 제어됨. 띠용?!메타데이터가 변조되어 링크가 엉뚱한 곳을 가리키고, 이후 힙 할당/해제 시에 문제를 유발할 수 있음.결론적으로 취약점을 정교하게 잘 악용한다면 프로그램의 실행흐름(EIP)도 가져올 수 있다는 얘기다. 힙 버퍼 오버플로우는 스택과 다르게 원인이 되는 부분과 한참 떨어..

힙 손상 탐지(1) - 초기화 안 된 상태로 사용

힙 손상 탐지(1) - 초기화 안 된 상태로 사용 공간을 할당했으면 초기화를 하고 사용해야함.포인터 변수를 다뤄봤다면 알겠지만, 뭐가 들었을 지 알고 초기화도 안하고 사용하나?! 1) 할당만 받고 초기화 하지 않은 채 사용한다면 문제가 발생할 수 있으므로 잡아야한다.2) Free 한 이후에도 사용하는 것은 문제를 야기할 수 있고 정상적인 사용방법이 아니다.스택은 문제를 야기하는 원인 근처에서 크래시가 발생하므로 추적이 쉬움.힙 문제는 원인과 결과가 한참 차이나는 경우가 많음 (변조는 이미 되었으나 오류 발생은 실제 사용 시점에서 발생하므로)Crash 시점부터 백트레이스는 너무 많은 비용 소모, 힙 손상이 발생 시점에 트랩하자.대안: 디버깅 하에서 실행 시 채움 패턴 사용.(디버거 하에서 프로세스를 시작한..

힙의 세부 항목 조회

힙의 세부 항목 조회 힙 주소를 얻었으면 조회를 해봐야지.명령어 : dt _HEAP 0:000> dt _heap 00500000ntdll!_HEAP +0x000 Entry : _HEAP_ENTRY +0x008 SegmentSignature : 0xffeeffee +0x00c SegmentFlags : 0 +0x010 SegmentListEntry : _LIST_ENTRY [ 0x5000a8 - 0x5000a8 ] +0x018 Heap : 0x00500000 _HEAP +0x01c BaseAddress : 0x00500000 Void +0x020 NumberOfPages : 0x100 +0x024 FirstEntry : 0x00500588 _HEAP_ENTRY +0x028 LastValidEntry : 0..

힙 블럭 합병(Coalecing), 해제 과정

힙 블럭 합병(Coalecing), 해제 과정 [ 합병(Coalecing) ]1) free된 영역이 서로 인접하다면2) 병합시켜 큰 블럭으로 관리.과정:힙 블럭 해제 요청 -> 인접 영역이 free 상태인지 확인 -> 그렇다면 병합 -> 프리리스트 갱신 인접한 free 블럭을 기존 프리리스트에서 제거, 합병과정을 거친 후 합병된 블럭을 크기에 맞는 프리리스트로 갱신-> 비용이 많이듬! 그런데도 굳이 합병을 하는 이유는??: 힙 단편화(heap fragmentation)를 회피하기 위해. 합병 방식을 알았으니, 합병을 고려한 힙 해제 과정을 정리하자. [ 힙 해제 과정 ]1) 프런트엔드 할당자가 해당 프리 블록을 처리할 수 있는 지 요청.2) 힙 관리자는 인접한 프리블록이 있는 지 확인.3) 있다면 합병인..