취약점 분석 55

LZ77 알고리즘

LZ77 알고리즘 (LZ77 Encoding): LZ77알고리즘은 사전 방식 ( Dictionary methods )을 채택한다. 즉, 반복적으로 나오는 문자열을 압축한다. zip, gzip, pkzip 등에서 사용되는 압축 알고리즘이다.다른 알고리즘과 결합되어 deflate 방식 등으로 사용된다. Pseudo-Code 는 다음과 같다.1 begin2 fill view from input3 while (view not empty) do4 begin5 find longest prefix p of view starting in coded part6 i = position of p in window7 j = length of p8 x = first char after p in view9 output( i , ..

Deflate 알고리즘

Deflate 알고리즘: zip, gzip 등의 프로그램에서 압축방식으로 사용하는 알고리즘. Deflate 알고리즘은 LZ77 알고리즘과 허프만 부호화 알고리즘이 결합된 압축방식이다. 그림으로 설명하면 다음과 같다. 1. Data가 있다. 2. 먼저 LZ77알고리즘을 통해 압축하여 LLD블럭들이 나온다. 3. 이 LLD들을 가지고 허프만 부호화 알고리즘을 거친다. 4. deflate 압축 완료.

ZIP Archive file format

[ ZIP Archive file format ]: https://en.wikipedia.org/wiki/Zip_(file_format): https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html [ 구성도 ] ZIP Archive 포맷 구조는 위 그림과 같다. [ Local file header + Data + Data descriptor ] 가 한 세트를 이루어 파일별로 쭉 쓰인다.Data descriptor는 Optional한 헤더로 Flag의 3번째 비트(0x08자리)가 set 된 경우에만 추가되고, 보통은 header+data가 한 세트이다. Central directory file header는 Local file header의 확장으로,..

windbg 포인터 참조하기

WinDBG 포인터 참조하기 70634b48이라는 메모리 주소에 6e26a330이라는 값이 담겨있습니다. call dword ptr [eax+0Ch] 처럼 어셈블리 명령어에서는 내부의 값을 참조한다는 의미로 [] 대괄호가 사용됩니다.하지만 이를 그대로 메모리창 (Alt+5)에서 확인하려고 똑같이 대괄호를 쓰면 원하는 값이 나오지 않습니다. 어셈블리 명령어 그대로 [eax+0ch]를 입력해보겠습니다.그림에서 보듯이 eax+0ch 와 [eax+0ch] 출력 시 값이 같게 나옵니다. 메모리창에서도 마찬가지구요. 어셈블리에서 쓰이는 값참조의 의미가 아닌 수식을 위한 괄호로 인식하기 때문입니다. 보다 정확하게 보자면 덧셈과 곱셈 연산에 괄호유무에 따라 값이 바뀌는 걸 확인할 수 있습니다. 어셈블리 명령어의 대괄호..

Windbg LFH 동작시킨 상태로 디버깅하는 방법

Win7부터는 Low Fragment Heap이 default Frontend heap으로 설정되어 LFH 힙을 고려해야할 때가 자주 있습니다. 디버거에 기본적으로 Heap 관련 GFlags 들이 동작하기 때문에, 디버거 상에서 Open Executable로 파일을 열면 LFH가 동작하지 않습니다.이러한 GFlags들이 꺼진 상태여야 LFH가 enable 됩니다. !heap: 해당 명령어로 맨 첫번째에 있는 base heap 주소를 얻고, dt _heap [힙베이스주소]ex) dt _heap 550000: 힙 정보 값 조회. [LFH 미동작] [LFH 동작] 가장 쉬운 방법은 프로그램을 실행시킨 후 Attach 하는 방식으로 디버깅을 진행하면 LFH가 enable 된 상태에서 디버깅이 가능합니다. 두번째..

실질적으로 할당된 힙 크기 구하기

동적으로 할당되는 힙(heap)의 정확한 크기 구하기. 할당받는 힙의 크기는 요청한 크기와 정확하게 일치할 때도 있지만 조금의 차이가 있을 수도 있다.요청한 Size와 동일한 크기의 Chunk가 존재한다면 딱 맞게 주겠지만, 아니라면 조금 더 큰 Chunk에서 잘라내어 할당하기도 한다. Chunk의 크기는 8bytes의 배수이기 때문이다. 따라서 요청한 Heap 크기보다 조금 더 크게 할당 될 수도 있다.(=-> 때문에, Bins로 관리 시 Size의 나머지 3bit를 | N | M | P |의 Flags로 사용함.) 코딩 시 할당된, 사용 가능한 힙 크기를 정확하게 알아야할 때가 있는데 함수를 통해 구하는 법을 알아보자. 윈도우즈 플랫폼 같은 경우는_msize(힙주소) 리눅스와 유닉스의 경우에는mall..

힙(Heap) 구조 - Linux

[구조] - (line당 4bytes단위)(Header)━━━━━━━━━━━━━━━━━━━━━━━━━ (malloc chunk)Prev_Size━━━━━━━━━━━━━━━━━━━━ (actual chunk)Size | N | M | P | -- 힙 크기가 8bytes 단위이므로, 뒤의 3bit는 "Flags"로 사용된다.-----------------------(Data)FDBKFD_nextsize ┐BK_nextsize ┘ LargeBin에서만 사용됨. 크기가 다른 첫번째 Chunk를 가리킴.[Chunk data....][Chunk data....][Chunk data....]━━━━━━━━━━━━━━━━━━━━━━━━━Prev_Size -- 인접한 다음 Chunk의 Prev_Size도 현재 Chunk..