전체 글(476)
-
56일차 파이썬 CDR 개발 - 16
오늘은 전체 스토리지와 스트림의 목록과 속성을 가져오는 소스코드를 작성했다. 1. Full Array 'Name' 스토리지와 스트림의 속성 정보는 80Byte의 크기로 저장이 되어 있다. Root를 통해 프로퍼티를 만든 다음에, 프로퍼티를 통해 스토리지와 스트림의 속성들을 딕셔너리로 저장한다. 2. Full Array 'Type, Left, Right, Child, Start, Size' Root Storage ID Name : 0x600 ~ 0x63F Name Length : 16 00 ==> Name의 문자열 크기는 16+1 = 17Byte Type : 05 ※ 0–Empty, 1–Storage, 2–Stream, 3–Lock Bytes, 4–Property, 5–Root Storage Left No..
2020.10.28 -
55일차 파이썬 CDR 개발 - 15
오늘은 SBAT와 Base64 대한 소스코드를 작성했다. 1. SBAT Array SBAT도 BBAT처럼 Depot가 존재한다. 그래서 SBAT Depot를 통해 Chain을 만든다. 2. Base64 Base64Decode를 통해 UTF-16LE으로 변환하여 원하는 값을 수월하게 얻을 수 있다.
2020.10.27 -
54일차 파이썬 CDR 개발 - 14
오늘은 섹터의 체인을 만들고 찾아서 합칠 예정이다. 1. BBAT Chain 한글문서의 스트림은 ID를 가지고 있다. 그 ID를 통해 섹터 체인을 만들고 합쳐야한다. 2. BBAT Array BBAT Chain을 통해 얻은 값들을 BBAT Array에 딕셔너리 타입으로 저장한다.
2020.10.26 -
53일차 파이썬 CDR 개발 - 13
BBAT Depot 읽고 BBAT 찾아서 합치기 위에 적힌 소스코드의 역할 1. BBAT Depot 읽기 (0x03) 2. BBAT 찾아가기 (0x03) 3. BBAT 합치기
2020.10.25 -
52일차 파이썬 CDR 개발 - 12
※ 헤더 부분을 읽기 위한 함수 1. Rader_ID BBAT의 공식 : (n+1) * 512(BBAT Size) 2. BBAT_List BBAT Depot는 한글 문서의 0x4c ~ 0x1ff 까지이다. 이후에 BBAT Depot에 존재하는 섹터들을 찾아가서 합쳐야 한다.
2020.10.24 -
51일차 파이썬 CDR 개발 - 11
오늘은 CDR을 구현하기 위한 순서도를 작성해보았다. 1. 파일 입력 2. 헤더 읽기 3. Storage, Stream 프로퍼티 읽기 4. BBAT, SBAT Depot 읽기 5. BBAT, SBAT 찾아가서 합치기 6. Sector 찾고 합치기 7. SBAT Stream 찾기 .... 우선은 위의 순서에 맞게 차차 진행하면서 소스코드를 작성 및 수정하려고 한다. 1. 파일 입력 2. 헤더 읽기 Signature : D0 CF 11 E0 A1 B1 1A E1 ==> HWP문서의 고유 시그니처 Version : 3E 00 03 00 Byte Order : FE FF ==> FE(Little – Endian), FF(Big Endian) BBAT Size : 09 00 ==> 2^9 ==> BBAT 1 Se..
2020.10.23 -
50일차 파이썬 CDR 개발 - 10
파이썬으로 CDR 개발을 시작하면서 막히게 되는 부분이 많아졌는데, 다시 C언어를 하면서 생각이 전환될만한 것을 찾아볼까 한다. 문제 단일 연결 리스트의 길이 구하기 설명 노드의 길이를 int 형으로 반환하는 length 함수 만들기 단일 연결 리스트의 구조(노드 구조는 struct Node) § 연결 리스트 • 리스트의 연결 자료구조로 표현 • 연결하는 방식에 따라 단순 연결 리스트와 원형 연결 리스트, 이중 연결 리스트, 이중 원형 연결 리스트 § 연결 리스트의 노드 • 연결 자료구조에서 하나의 원소를 표현하기 위한 단위 구조 • 데이터 필드 (Data Field) − 원소의 값을 저장 − 저장할 원소의 형태에 따라서 하나 이상의 필드로 구성 • 링크 필드 (Link Field) − 다음 노드의 주소..
2020.10.22 -
49일차 파이썬 CDR 개발 - 10
CDR을 위해서는 hexdump 모듈이 아닌 직접 hexdump를 구현해야 한다는 사실을 알았다. 공개된 오픈소스들을 통해 HexDump의 원리를 이해하고 CDR에 필요한 HexDump를 구현이 필요하다고 느꼈다.
2020.10.21 -
48일차 파이썬 CDR 개발 - 9
마지막으로 데이터들을 리틀 엔디안 방식으로 정렬하게 하는 함수를 이용해서 OLE Parser가 구현이 된다. 이제 OLE Parser에 대한 흐름이 어떠한지 잡혔으니 CDR 구현을 위한 소스코드 작성에 돌입할 예정이다. OLE Parser를 구현하도록 도와준 많은 오픈소스 제공자분들에게 무한한 감사를 느끼고있다.
2020.10.20 -
47일차 파이썬 CDR 개발 - 8
오늘은 Property를 작성해봤다. Root Storage Chain Entry 2 -> Entry 21 -> Entry 483 -> Entry 484 - Property - [ 0 ] Root Entry [ 1 ] File Header [ 2 ] Doc Info [ 3 ] Hwp Summary Information [ 4 ] Body Text [ 5 ] BinData [ 6 ] Prv Image [ 7 ] Prv Text [ 8 ] Doc Oprions [ 9 ] Scripts [ 10 ] JScript Version [ 11 ] Default JScript [ 12 ] _Link Doc [ 13 ] BIN0001.jpg [ 14 ] Section 0 Python
2020.10.19 -
46일차 파이썬 CDR 개발 - 7
오늘은 SBAT 참조에 대해 알아봤다. SBAT Depot (0x1E5) ◈ _Link Doc Type : 02 – Stream Node Color : 0x01 Left Node : 0xFF 0xFF 0xFF 0xFF Right Node : 0xFF 0xFF 0xFF 0xFF Child Node : 0xFF 0xFF 0xFF 0xFF Start Sector ID : 0x49 ( Entry 73 ) SBAT 참조를 통해 Section 0를 찾기 위해서는 Root Entry를 통해 BBAT 참조를 먼저 해야한다. Root Entry : 0x1EF = Entry 495 Root Entry Chain Entry 495 -> Entry 496 -> Entry 497 -> Entry 4 -> Entry 6 -> E..
2020.10.18 -
45일차 파이썬 CDR 개발 - 6
오늘은 BBAT 참조하는 구조에 대해 알아봤다. ◈ Prv Image Type : 02 – Stream Node Color : 0x01 Left Node : 0xFF 0xFF 0xFF 0xFF Right Node : 0x08 Child Node : 0xFF 0xFF 0xFF 0xFF Start Sector ID : 0x16 Object Size : 0x284EA = 165,098Byte BBAT에서 0x16 Entry ~ End 까지 따라가면 Prv Image의 Chain이 완성된다. Python
2020.10.17 -
44일차 파이썬 CDR 개발 - 5
오늘은 테스트 파일의 Storage, Stream의 구조를 파악했다. [ Type : 1 - Storage ] ◈ Root Entry Type : 05 – Root Storage Node Color : 0x00 Left Node : 0xFF 0xFF 0xFF 0xFF Right Node : 0xFF 0xFF 0xFF 0xFF Child Node : 0x01 Start Sector ID : 0x1EF ◈ Body Text Type : 01 – Storage Node Color : 0x01 Left Node : 0x02 Right Node : 0x06 Child Node : 0x0E Start Sector ID : 0x00 ◈ Bin Data Type : 01 – Storage Node Color : 0x0..
2020.10.16 -
43일차 파이썬 CDR 개발 - 4
오늘은 BBAT Depot에 대한 구조를 알아보려고 한다. BBAT Depot : 0x03 0x81 0x101 0x05 0x21 0xA3 0x07 0x03 Block (0x03 + 1) * 0x200 = 0x800 Root Storage Mapping Root Storage Chain Entry 2 (0x15) -> Entry 21 (0x1E3) -> Entry 483 Entry 2 Entry 21 Entry 483 Entry 484 Python
2020.10.15 -
42일차 파이썬 CDR 개발 - 3
오늘 필요한 작업은 Root Storage에 접근하는 것이다. Root Storage는 항상 0x40위치에 고정적으로 존재한다. 하지만 값은 변동될 수 있으니 주의하자. Root Storage ID : 0x02 Root Storage를 찾아가기 위한 계산 (0x02 + 1) * 0x200 = 0x600 Root Storage ~ 512Byte Python 위의 공식을 기억한다면 보다 쉽게 이해할 수 있다. 예를들어, sectorID = 0x02라고 가정한다면 offset = (0x02 + 1) * 512 = 0x600 self.seek(offset)은 내 위치에서 0x600만큼 이동한다는 뜻이다. 즉, self.seek(offset) = 0x800 그리고 buf는 0x800 + 0x200의 값을 가지게 ..
2020.10.14 -
41일차 파이썬 CDR 개발 - 2
오늘은 Directory의 구조에 대해 알아보려고 한다. Name : 0x52 0x6F 0x6F 0x74 0x20 0x45 0x6E 0x74 0x72 0x79 Name Length : 0x16 Type : 0x05 ※ 0–Empty, 1–Storage, 2–Stream, 3–Lock Bytes, 4–Property, 5–Root Storage Node Color : 0x00 ※ 0-Red, 1-Black Left Node : 0xFF 0xFF 0xFF 0xFF Right Node : 0xFF 0xFF 0xFF 0xFF Child Node : 0x01 Start Sector ID : 0x04 Object Size : 0x2140 Python
2020.10.13 -
40일차 파이썬 CDR 개발 - 1
내가 CDR을 개발하려고 했지만 정작 파일구조에 대한 제대로 된 이해가 없었다는 생각이 들었다. 대략적인 이해로 프로그램을 만들려고 했었다니 스스로에 대한 반성을 깊게 했다. 앞으로는 어떤 개발을 하던 간에 완벽한 이해를 토대로 개발을 해야된다는 것을 많이 느꼈다. 그래서! 오늘이! 제대로 된 CDR 프로그램을 개발하기 위한 첫 출발인 날이다. Header Signature : D0 CF 11 E0 A1 B1 1A E1 Version : 0x3E, 0x03 Byte Order : FE (Little - Endian) FF (Big - Endian) BBAT Size : 0x09 SBAT Size : 0x06 BBAT Depot Count : 0x07 Root Storage ID : 0x02 SBAT Re..
2020.10.10 -
39일차 파이썬 백신개발 -14
오늘은 CDR하는 범위를 늘리고 사용자에게 직접 파일경로를 입력받도록 소스코드를 변경했다. 이제부터는 여러 옵션을 추가해 볼 예정이다. 스트림과 스토리지 목록을 보여주거나 헥스값을 보여주는 그러한 옵션들을 추가해볼까한다.
2020.10.09 -
38일차 파이썬 백신개발 -13
드디어.. 실마리를 찾고! OLE객체 전체 무해화에 성공했다. 한글문서 내부 스토리지 BinData에 들어있는 모든 스트림의 값을 0으로 치환해버리는! 소스코드를 만들었다. 누군가는 정말 쉽게 만들겠지만 나처럼 파이썬 초보자가 만들기에는 정말 고난의 연속이었다. 매일매일 고민하고 생각했는데 이렇게 만드니까 정말 뿌듯하기 그지없다. 이제는 OLE객체만이 아니라 다른 콘텐츠도 무해화할 수 있는지 생각할 예정이다.
2020.10.08 -
37일차 파이썬 백신개발 -12
도대체 어떻게 하면 BinData 스토리지 안에 있는 스트림만 출력할 수 있을지에대해 계속 고민해보다가 결국 답을 찾았다. 고민할 때는 정말 답이 안보이고 답답했는데 막상 답을 찾으니까 너무 허무하고, 이 쉬운걸 왜 여태까지 몰랐던 걸까라는 생각이 계속 든다. 그래도 뿌듯함은 있으니 다행이다. 독학으로 공부하려니까 헤딩을 너무 많이하게되고 진도도 느리지만 뭔가 해냈다는 기분은 정말 많이 든다.
2020.10.07 -
36일차 파이썬 백신개발 -11
소스코드 분석 prefix = 스토리지의 현재 위치, 루트 디렉토리를 포함한 모든 스토리지의 목록을 보여준다. node = 현재 노드 = node.name : 노드를 문자로 보여준다. entry = 스트림 목록을 보여준다 entry.entry_type == STGTY_STORAGE = 여기서 entry_type이란, 디렉토리의 타입 값을 말한다. 한글 파일에는 디렉토리 타입이라는게 존재하는데, 이는 아래와 같다. 0 : Empty 1 : Storage 2 : Stream 3 : Lock bytes 4 : Property 5 : Root Storage 즉, 위의 소스코드는 1번 스토리지에 해당하는 값과 2번 스트림에 해당하는 값을 보여주는 소스코드이다.
2020.10.06 -
35일차 파이썬 백신개발 -10
오늘은 Stream의 경로를 입력받아서 Hex값을 전부 0으로 치환하는 소스코드를 작성해봤다. 모듈에서 원하는 명령어의 코드를 수정하는게 쉽지 않은 일이라는 것을 뼈저리게 느끼며... 앞으로도 공부할게 많다는 것과 타인이 개발한 소스코드를 알아볼 수 있도록 실력을 향상시켜야 한다고 많이 느꼈다.
2020.10.05 -
34일차 파이썬 백신개발 -9 2020.10.04
-
33일차 파이썬 백신개발 -8
WinHex로 한글파일을 열어보면 OLE 파일은 '4F 00 4C 00 45'이고, BIN 파일은 '42 00 49 00 4E' 이다. 고민해봤을 때, OLE파일을 모두 무해화를 하기 위해서는 모든 OLE파일의 값을 0으로 변경하면 된다는 생각이 들었다. 우선은 olefile 모듈을 이용해 OLE파일의 값을 0으로 치환할 수 있는지 확인해봤다. 위의 코드를 실행해서 SSViewer로 파일을 열어 제대로 값이 바뀌었는지 확인해봤다. 성공적으로 값이 변경이 됬으며, OLE 스트림이 무해화가 된 것을 확인할 수 있었다. 이제 고민해야할 부분은 1. OLE 객체의 바이너리 값을 Hex 값을 통해 찾아서 전체 무해화를 할 수 있는가? 2. 각각의 스트림을 비우는게 아니라 BinData의 스토리지 안의 스트림 전체..
2020.10.02 -
32일차 파이썬 백신개발 -7
OLE 위치를 찾고 파싱하기 위해서 한참을 찾아다니면서 결국 찾아냈다. 그건 바로 파이썬에는 olefile이라는 모듈이 존재한다는 사실이었다! olefile을 통해 파일에 존재하는 스토리지와 스트림의 목록을 알 수 있었다. 그리고 hexdump라는 모듈도 발견했는데, 이 모듈은 파일의 hex값을 보여주는 모듈이다. ============================================== olefile 외에도 아래와 같은 포렌식 모듈이 존재한다. python-oletools: a package of python tools to analyze OLE files and MS Office documents, mainly for malware analysis and debugging. It includ..
2020.10.01 -
31일차 파이썬 백신개발 -6
현재 개발하는 프로그램의 목표 공부 및 자료수집 중인 내용
2020.09.30 -
30일차 파이썬 백신개발 -5
한글파일에 대한 내부 구조를 분석하고 싶어서 열심히 구글링을 해봤더니 SSViewer라는 분석 툴이 있었다. 이러한 프로그램을 만들어준 개발자분께 무한한 감사인사를 드리고싶은 심정이다. 파이썬을 처음 접해보니 파일을 열고 읽는 방법을 터득하는데만 한참이 걸린 것 같다. 여차저차해서 코드를 짜보니 너무 간단해서 헛웃음이 나왔다. 아무튼, 위의 코드를 이용해 한글 파일의 바이너리 데이터를 읽어봤다. b'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\x00\x03\x00\xfe\xff\t\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x..
2020.09.29 -
29일차 파이썬 백신개발 -4
---------------------------------------------- PY3 = sys.version_info.major == 3 # PY3은 파이썬 3.xx 버전을 뜻한다. sys.version : 현재 파이썬 인터프리터의 사람이 읽을 수 있는 버전정보가 포함 된 문자열을 반환한다. 그러나 '주 릴리스 번호' 및 '마이크로 릴리스 번호'와 같은 정보는 코드에서 추가로 사용하기 위해서 추가 처리가 필요하다. sys.version_info : 버전 정보를 명명 된 튜플로 반환하여 이 문제를 쉽게 해결한다. - 반환되는 버전 데이터 - majar : 주요 출시 번호 micro : 패치 릴리스 번호 minor : 부 릴리스 번호 releaselevel : '알파' , '베타' , '후보자' 또는..
2020.09.28 -
28일차 파이썬 백신개발 -3
__future__ : improt 문을 분석하고 import하는 모듈을 발견하리라고 기대하는 기존 도구가 혼동하지 않게 하려고 쓴다. 즉, __future__는 파이썬 2와 3의 버전 차이로 인해 생기는 문제를 방지하고 호환이 되도록 하기 위해 사용한다. 2의 기능을 3에 가져와서 사용할수있다. from__future__ import absolute_import : 이를 사용하면 절대 임포트(absolute_import)를 기본으로 만들 수 있다. 예를들어, glux.draw.pixmap 모듈에서 import cairo하면 glux.draw.cairo, glux.cairo, cario 순으로 임포트를 시도한다. 만약 glux.draw.cairo라는 모듈이 우연히 존재했다면 원래 의도했던 cario 모듈..
2020.09.27 -
27일차 Code Up 문제풀이
보호되어 있는 글입니다.
2020.09.26