// http://www.androidpub.com/1851206

1. 입출력 문제 


# 1000


raw_input은 날것으로 문자열로 잘라서 저장하고, 

input은 유두리있게 숫자는 숫자로 (int, float)  문자열은 문자로 ""로 감싸져 있는경우만, 아니면 오류) 저장한다.


//참고 http://gangju.tistory.com/6



a.split(s)는

a(문자열)을 s기준으로 잘라서, 

나눠진 문자열 리스트로 반환한다.


 join은 나눠진 리스트를 문자열로 반환


//참고 http://agiantmind.tistory.com/31

//http://ourcstory.tistory.com/46


[입력]


1 2


[출력]




[코드]


input=raw_input()

inputS=input.split()

print int(inputS[1]) + int(inputS[0])


 


A B =input()

print A,B

이렇게, 공백으로 문자를 나누어 받는것은 안된다.


A,B =input()

print A,B

이것만 된다.



#10172

이스케이프 시퀀스

"                문자와
\(백슬래쉬)  문자는
출력하려면 \가 있어야 한다. 

[코드] 

print "|\_/|"

print "|q p|   /}"

print "( 0 )\"\"\"\\"

print "|\"^\"`    |"

print "||_/=\\\\__|"

 




#10172


# -*- coding: cp949 -*-

print "강한친구 대한육군"

print "강한친구 대한육군"

 











USB 마운팅이 가능하게 해야한다.


FAT구조 중에서 Reserved Area가 깨진것으로 보인다.  시그니쳐가 제자리에 있지 않기 때문.


0번1번 섹터에 있는 ~~는 6번과 7번 섹터에 백업본이 있으므로 섹터수를 계산해서 제자리에 잘 넣어준다. (0,1,6,7번 섹터에)




Reserved Area가 끝나면, 오는 FAT Area의 위치는 Reserved Area에 정의되어 있다.




따라가서, 그 위치에 FAT Area가 맞게 오도록 수정해준다.



그렇게 하면 FTK Imager에서 열리게 되고, 




2차 테러계획이라는 문서를 열어서 장소가 'Rose Park'라는 것을 확인하였고,


여기서, 이 문서의 수정시간은 02:44:02라고 되어있는데,


인증이 안되서 한참 헤맸다.


실제, 내 컴퓨터에서 열어보니 시간이 11:44:02라고 되어있다.


FTK에서는 그냥 UTC로 시간이 표시되나 보다.


문제에서 요구하는시간값은 UTC+9이므로 


lowercase(MD5(2016-05-30_11:44:02_Rose Park))는 


8ce84f2f0568e3c70665167d44e53c2a


이다.




주어진 파일은 NTFS 파일시스템을 가진 이미지파일이다.


어떤 파일이 파일시스템에서 마운팅 되어, 파일로 인식되기 위해서는 


MFT영역의 MFTEntry에 메타데이터가(파일이름, 생성시간,...등) 들어있고, 

- Resident 파일이라면( $Data 속성 header 다음 contents영역 )안에 // 대부분 700바이트 이하의 경우 resident (항상은 아님)

- Non-Resident 파일이라면 클러스터 런을 통해서 , DATA 영역의 클러스터를 찍어줘야한다. 


DATA area에는 클러스터 단위로 파일이 저장되어 있다. 클러스터 런에 따라서!  









따라서 해당 파일에 유니코드로  MFT가 있는지 검색해서 $MFT 파일이 있는지 봤더니 없었다.


그런 경우에는 파일 카빙을 통해 사진 파일이 있는지 확인해야 한다. // 참고 1) 데이터복구 - file carving이란 



File Digger라는 툴을 사용해서 카빙을 한다.



플래그를 가진 PNG 사진 파일을 발견했다.


클러스터런이 끊겨있는데, MFT정보가 사라져서 그런것 같다.








PNG 구조를 보면, 청크 단위로 되어 있는데, 


한 청크당 


CHUNK = length(4byte) + chunk type(4byte) + chunk data (length만큼byte) + CRC (4 byte)


의 구조를 가지고 있다.




시그니쳐와, 클러스터 크기로 유추해서 경우의 수를 줄인 뒤, 여러 개 해보면 될 것 같다. 





해당 파일을 HxD로 열면, VBR에서 SectorPerCluster가 2이므로 


한 클러스터는 1024byte(0x400)이다.  





HxD에서 "IDAT"를 검색하니, 여러개가 나오고


"IEND"로는 하나의 검색결과가 나온다.



1) %PNG   797000

2) IDAT     797050+8   ffa5  ok

3) IDAT     7A7000+8   FFF4  ok

4) IDAT  19E96400+C   FFF4

          ~19E97000      BFC

          ~19E97900     14FC 

 NULL

            19E9A400~  F004 해당 CRC는 "87 DB 8B 0D" (F000)

5) IDAT   19EA9400   A561 해당 CRC는 "8D B9 90 31"



다행히, 2)와 3) 그리고, 3)과 4) 사이에는 티나는 공백이 있어서 그대로 이어붙이니 그림파일이 늘어났다.







4)와 5) 사이에는 공백을 지우고 이어주는 것만으로 사진파일이 생기지 않았다.


0x500의 쓰레기 값이 있었는데, (클러스터 기준으로 기록되기 때문에 해당 파일이 아닌 바이트가 있다.)


클러스터 기준으로 자른다음, CRC 영역을 확인해서 어떤 클러스터에 있는 값이 사진파일인지 확인해 준다. // 참고 2) CRC란 

   

PNG Chunk에서 crc는 name과 data로만 계산한다.


그렇게 찾고나서 "IEND"까지 연결하면 




이렇게 플래그가 뜬다.







참고1) 파일카빙이란    // http://hy00un.tistory.com/107




 

참고 2)) CRC란


암호화 알고리즘의 하나로,


http://mwultong.blogspot.com/2006/06/qna-zip-rar-crc32-crc-crc.html // crc 영역


http://schaik.com/png/pngcsum.html // PNG에서 crc는 name과 data로만 계산한다.


http://noteroom.tistory.com/entry/PNG-%ED%8F%AC%EB%A9%A7-1 // png 포맷


 













< 문제 풀이>


주어진 이미지는 USB의 이미지 이다. 


이 이미지는 NTFS 파일 시스템을 가지고 있다. // 참고1) NTFS 이미지 파일의 구조


 

USB를 인식하기 위해서는


MBR의 Partition Table이 파티션의 위치를 잘 가리키고 있고,


해당 (NTFS)파티션의 VBR이 MFT를 잘 가리키고 있어서,  


MFT와 DATA영역을 읽어들여야 


해당 이미지 파일에 어떤 파일이 들어있는지 파일 구조를 볼 수 있다.


((그림))

  MBR ---> VBR --->MFT

   ---> VBR --->MFT



USB를 마운팅 했을 때,  unallocated area로 읽히면  


파티션부터 제대로 인식되지 않는다는 것이다.  

( ENCASE에서도 partiton finder을 이용해서 VBR의 시그니쳐="   NTFS"를 검색하고 'add partition'을 눌러 추가해 주었었다.) 


따라서, MBR의 Partition table를 제대로 수정을 해 주어야 한다.


※부팅과 마운팅의 차이점


부팅은 운영체제가 설치되어 있는 파티션에서 꺼져있는 


마운팅은 이미 부팅되어 있는 시스템 파일 시스템을 읽어들여서 파일 내부 구조를 볼 수 있는 것을 말한다.











MBR은 맨 첫 번째 섹터에 있는 영역인데(크기 : 0x200), 없는 것으로 보인다. // 참고 2) MBR의 구조


부팅을 할 것은 아니므로, Partitoin Table만 추가를 해주면 된다.  // 참고3) 부팅과 마운팅이란.





Partitoin Table에는 VBR 영역(크기 : 0x200+추가코드 조금)의 시작주소를 찍어야 하는데, 


VBR은 백업 형태로 맨 아래에 한 번 더 저장되어 있다. // NTFS - VBR





VBR에서는 MFT를 상대주소지정방식으로 찍기 때문에 // NTFS - MFT


MFTStartingAddr= VBRStartingAddr + ( "StartOfMFT" * SizeOfCluster(0x10000) ) 


VBR backup을 올바른 위치에 위치시켜야 한다. 안그럼 백업파일이 있는 주소를 기준으로 MFT를 읽으려고 시도한다.





VBR은 보통 정해진 위치에 있는경우가 많고, 


이 문제의 경우에는 힌트로 0x1000주소에 NTFS가 잔뜩 들어있다.


혹은, $MFT를 유니코드로 검색한 후, 


MFT mirr가 아닌, 진짜 MFT의 주소로부터 VBR을 위치시켜야 할 값을 역으로 찾는다.


VBRStartingAddr = MFTStartingAddr - ( "StartOfMFT" * SizeOfCluster(0x10000) ) 


이 위치에 ctrl + B 해주면 된다.





그러면 FTF imager을 통해  열 수 있고,  


삭제한 파일과 삭제되지 않은 파일은 


현재 시스템에 마운팅 시켜보면 알 수 있다.



"hidden_key_picture.png"가 삭제되지 않은 파일이고 답이지만 키를 알 수 없다.


hidden key라고 하는 것을 보니 스테가노 그라피인것 같다. // 참고 4) 테가노그라피란



스테가노 그래피 툴 OpenStego를 받아서 키 값을 받으면 된다. // https://github.com/syvaidya/openstego/releases


키 값은 :  HS_{I_LIKE_HORROR_MOVIE}



CF) HxD를 관리자 권한으로 열면 현재 내 컴퓨터의 하드디스크나 메모리의 값을 HEX로 볼 수 있다. -->실습가능



참고 블로그 )) 

NTFS 구조 따라가기 실습 : http://ezbeat.tistory.com/405


삭제된 데이터 복구 // http://jmoon1601.tistory.com/86


삭제된 파일복구 자체는 상용화된 툴이나 오픈소스를 이용하는것이 편하다


MBR 파티션 구조 설명 자세하게 : http://hyd3.tistory.com/124

 




※ Partiton Table에서 LBA address는 상대 클러스터 지정 방식으로 되어있다. 




※ NTFS에서 주소를 가리킬 때는 


절대(이미지 전체에서 몇번째 Sector or Cluster)방식과 

상대 (해당 영역의 시작주소 + Sector of Cluster)방식이 있다. 


클러스터의 경우 = 곱하기 0x10000 ( Sector per Cluster가 8개인 경우)

섹터의 경우 = 곱하기 0x200 하면 된다. 





 참고 ))

 MFT mirr은 4섹터만 저장된다.


 





---------------------------------------------------------------------------------------------------------------------------------------


<문제를 풀면서 스스로 한 추론>


여러사진의 파편이 있을것으로 예상.

사진파일은 JPEG, PNG, GIF 등이 있고 - 이미지 파일의 종류?


여러장의 이미지중, 삭제하지 않은 한 이미지를 찾는것이 중요.

-> 삭제되지 않았으면 MFT가 그대로 있을테니, MFT가 남아있는 파일을 찾으면 되지 않을까?



인식이 안되는 이유는 

-> 파일 시그니쳐가 없다. MFT는 있으려나. 시그니쳐로 검색을 해봐야겠다.


---------------------------------------------------------------------


파일디거로 찾아보니 많은 JPEG랑 PNG가 있다.

파일 자체에 삭제여부는 없을테니,


MFT에서 찾아야 한다.




NTFS로 꽉찬 파일 하나를 보니짤리지 않고 잘 들어가있다. 

아마 0x1400 = 5120 바이트만큼이 클러스터 크기인가 보다. 

이건 출제자가 일부로 힌트를 주려고 바이너리를 조작한 것이다.



0x800(2048바이트)만큼이 밀려있는것 같다.




hint )) MBR과 VBR을 공부하시오 



카빙이라는 기법은 파일시스템 메타데이터가 없을때(덮어써졌을때) 복구하는 방법입니다. 따라서, 파일명을 알 수가 없기 때문에 도구마다 각자의 방법으로 파일명을 생성합니다. 






MFT Entry Header 구조



Q. 부팅 = 마운팅? 

A. 부팅은 운영체제가 설치되어 있어서 윈도우즈에서 

마운팅은 이미지파일 혹은 디스크의 파일 구조를 볼 수 있도록 뷰어로 여는것??


내생각 ) 마운팅 시킬 땐, 부트코드가 필요없고 그냥 파티션 테이블만을 읽어들이는것 같다.



http://www.hackerschool.org/HS_Boards/zboard.php?id=QNA_Network&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=184

Disk

: 시스템에 장착되어 있는 파티션(볼륨)을 나누어 사용하는 저장장치.

자기를 가진 둥근 원반을 회전시켜서 자성을 이용하여 데이터를 기록하는 HDD와 같은 드라이브를 의미하나

반도체를 사용하는 플래시 메모리, SSD / 주 기억장치의 공간을 활용하는 RAM 드라이브 

모두를 디스크로 분류하여 관리한다.


* 포함되는 것 - HDD(hard disk drive), Flash memory drive, RAM 

* 종류 - 고정 디스크(HDD, SSD, ram에 생성된 RAM 디스크)

  이동식 디스크(usb), 

  가상 디스크 : 다른 저장 매체에 존재하며 언제든지 시스템이 연결되거나 분리될 수 있다. (이미지파일?)

cf) Disc : 레이저를 이용해 데이터를 기록하는 광디스크로, CD, DVD, 블루레이 등이 있다.





Volume 

: 파일 시스템으로 포맷된 디스크상의 저장영역.

볼륨에는 드라이브 문자가 할당된다.

윈도우 7에서는 디스크 관리에서 더이상 파티션이란 단어를 사용하지 않는다.

기본 디스크의 파티션과 동적 디스크의 볼륨 --> 모두 볼륨으로 취급!


* 파티션과 비슷한 의미로 쓰이긴 하지만 엄밀하게는 같은게 아니다.

동적 디스크에서는 볼륨은 여러개의 디스크로 스팬될 수도 있다.

기본 디스크에서 저장영역 = partition / partition 후에 포맷가능. 

따라서, 기본 디스크에서는 하나의 파티션이 하나의 볼륨이 된다.

여러 디스크에 걸쳐 있을 수도 있고하나의 디스크가 여러 개의 볼륨을 가질 수도.

Cf) 파티션 – 단일 물리디스크 // 볼륨 – 하나 또는 그 이상의 파티션





Partition

: 1) 디스크의 공간을 논리적으로 분할(할당, 파티셔닝) 해 놓은 공간으로 나누어진 영역이며, 독립적으로 동작한다.

: 2) 별도의 디스크처럼 작동하는 하드디스크의 일부


* 목적 – 하나의 디스크를 서로 분리된 여러 개의 디스크처럼 쓰는 것. 

  바이러스에 대한 피해를 최소화 할 수 있고서로 다른 운영체제를 쓰는 등 활용가능.

  운영체제별로 나온 프로그램을 이용하여 파티셔닝이 가능하다.

* 주요 파티셔닝 방식 - MBR, GPT / cf) window와 dos는 FAT 파티션을 이용?

* 종류 - 1) 주 파티션 : 기본디스크에서 만들 수 있다. 갯수 제한이 있다.

  2) 확장 파티션 : 기본디스크에서 만들 수 있다. 개수 제한이 없고 주파티션과 동일.

  3) 논리 드라이브 : 기본디스크의 확장 파티션에서 만들 수 있다.  개수 제한이 없고, 주파이션과 다르게 부팅불가

* 할당되지 않은 공간 = 파티션이 생성되지 않은 공간 = 포맷 불가능, 데이터 기록 불가능

  파티션이 없다 = 디스크의 전체 공간이 할당되지 않은 빈 공간으로 되어있다.

  '디스크의 전체 공간을 단일 파티션으로 생성하여 사용하고 있다.' --> O






File System

:  저장 장치에 파일을 어떻게 쓰고, 관리하고, 찾고, 읽을 것인지에 대한 규칙, 체계.

이러한 체계가 있어야만 파일을 읽고 쓸 수 있다. 


* 목적 - 저장 장치에 데이터를 기록하고 사용하기 위해

* 주요 파일 시스템 - FAT16, FAT32, exFAT, NTFS

Format - 저장장치에 이러한 파일 시스템을 구죽하는 것.




Data Unit

: 특정 파일 시스템에서 사용가능한 데이터 스토리지의 최소 독립 유닛







 요약 하자면,


 디스크 = 시스템에 장착된 저장매체

 파티션 = 별도의 디스크처럼 작동하는 하드디스크의 일부

 볼륨 = 파일 시스템으로 포맷된 디스크 상의 저장영역 - usb를 인식시키면 볼륨이 인식된다.

 파일 시스템 = 저장매체에 어떻게 파일을 쓰고 관리할 것인지에 대한 체계


 " 디스크를 파티셔닝해서 파일시스템을 포맷하면 볼륨이 된다. " 








참고 블로그))

http://cappleblog.co.kr/135   : 파일시스템

http://cappleblog.co.kr/130   : 디스크, 파티션, 볼륨


슬루스킷 설치를 하고 분석과정들을 보며 검색을 하던중

"GRR (Google Rapid Response) : 원격 라이브 포렌식에 중점을 둔 침해사고대응 프레임워크"

라는 글을 접하고, 프레임 워크란 무엇인지에 대해 알아보았다.



라이브러리와 프레임 워크는, 

개발자로 하여금 원하는 기능을 구현하는데 있어 편리함을 제공한 다는 점에서는 공통점을 지닌다.


라이브러리는 

자주 쓰일만한 함수(유틸, 클래스)들을 묶어두어 개발자가 필요할 때 편리하게 쓸 수 있도록 한 것이어서 

동일한 개발자가 동일한 프로그램을 짜더라도 그 클래스의 구조나 데이터 저장방식등이 현저하게 다르게 나타날 수 있다.


반면에, 

프레임 워크에는, 제작자가 미리 만들어 놓은 '확장 가능한 기반코드'라는 것이 있다.

이 코드와 클래스들은 향후에 이 프레임워크를 이용하는 사람들이 기능을 추가하고 뺄 것을 충분히 고려하여 만들어 놓은 틀로,

이 기반코드를 벗어나고자 하면 제약사항이 생기거나, 혹은 비효율을 초래한다.

즉, 개발자는 설계의 기반이 되는 '기반코드'를 바탕으로

추가적으로 주어진 '라이브러리'를 이용하여 원하는 대로 기능을 추가하면 되는 것이다. 

따라서, 일정 수준 이상의 품질을 보장받으면서 빠른 시간안에 완성과 유지 보수가 가능한 환경을 제공하게 된다.



"프레임 워크란, 

소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것"

 




SetWindowsHookEx

1. 역할

: 특정 hook을 설치해둔다. (모든 프로세스가 체크 됨)

그러면, 어떤 프로세스에서 해당 메시지가 발생햇을 때 

OS가 해당DLL파일을 해당 프로세스에 injection하고 

등록된 hook procedure을 호출


즉, injection하고 바로 내가 원하는 콜백함수 호출.


2. 인자 값

- int idHook                 // hook type

- HOOKPROC lpfn         // hook procedure은 운영체제가 호출해주는 콜백 함수       DLL 내부에 존재해야 한다. ex)KeyboardProc

HINSTANCE hMod      // 위 함수가 속한 DLL의 인스턴스 핸들

DWORD dwThreadId   // hook을 걸고 싶은 thread의 ID 값    ex) 0을 넣으면 global hook이 설치된다.


3. 반환 값










'CODING(C) > WIN API 32' 카테고리의 다른 글

window API 주요 구조체 및 변수  (0) 2016.07.27

참고 블로그 : http://sweeper.egloos.com/m/2991972


윈도우 프로그램에서는 


하나의 프로그램이 많은 윈도우들을 가질 수 있고,

하나의 프로그램이 여러 개의 모듈 즉, (메모리에 올라간) 코드 덩어리들을 가지고 있을 수 있다. 


HINSTANCE / HMODULE 

: 프로그램 코드를 담고 있는 모듈(메모리에 올라가있는)/인스탄스에 대한 핸들.


cf) HMODULE과 HINSTANCE는 32비트에서는 같은 의미로 사용된다고 봐도 무관하다.

32비트 윈도우에서 인스턴스 핸들은 메모리 공간에 할당된 실행 모듈의 베이스주소(0x00400000)를 가리킨다.


HWND 

: 화면 출력을 위해 여러 윈도우들의 영역을 관리하는 리소스.


WPARAM

: unsigned int형, 주요정보 (주로 window procedure이나 callback function 의 인자)


LPARAM

: signed int형, 추가정보



'CODING(C) > WIN API 32' 카테고리의 다른 글

SetWindowsHookEx  (0) 2016.07.27

+ Recent posts