분류 전체보기
-
[2022/02/28][짤막한 이야기 - 주소 체계]짤막한 이야기 2022. 2. 28. 13:04
[2022/02/28][짤막한 이야기 - 주소 체계] 주소 체계는 프로그램을 분석함에 있어서 매우 중요한 개념 중 하나이다. 주소 체계라는 것이 별도로 존재하는 이유는 프로그램이 “파일”일 때의 상태와 “프로세스”일 때의 상태가 조금 다르기 때문이다. 흔히들 설명하는 예시로는 파일은 접힌 우산, 프로세스는 펼쳐진 우산에 비유된다. 파일은 하드디스크에 저장되어 있는 상태의 오브젝트를 의미하며, 말 그대로 EXE와 같은 실행파일을 더블클릭하여 실행하기 전의 상태를 의미한다. 반면 프로세스는 파일을 실행하여 메모리에 적재한 상태를 의미하며, 이는 파일과 확실하게 대비되는 개념이다. (요즘은 사용할 수 있는 더 좋은 Viewer가 많지만) PEView의 경우 주소 체계를 명확하게 구별하여 4가지 상태로 보여준다..
-
[2022/02/28][짤막한 공지 - 복귀, 루니프]짤막한 공지 2022. 2. 28. 11:58
[2022/02/28][짤막한 공지 - 복귀, 루니프] 안녕하세요, 루니프입니다. 2021년 10월부터 수많은 일정과 사정이 있어서 컨텐츠가 전혀 업로드되지 않았던 루니프의 보안/핀툴 이야기를 다시 시작하고자 합니다. 각 채널에서 3월 2일부터 복귀하게 될 예정이며, 운영방침에서 다소의 변경사항이 있을 듯 하여 공지글을 먼저 올립니다. 변경사항) 1. “짤막한 공지”와 “짤막한 이야기”에서 더이상 영문 자막을 제공하지 않습니다. - 꾸준한 컨텐츠 업로드 및 활동을 위하여, 그리고 앞으로 제공할 컨텐츠에서 글자제한 수를 완화하기 위하여 영문 자막을 폐지하기로 결정하였습니다. 2. “짤막한 이야기”의 컨텐츠가 다양해집니다. - 기존에는 짤막한 이야기에 보안 이야기(SW보안, 암호학 등) 및 핀툴 이야기(Pi..
-
[2021/10/06][짤막한 이야기 - 루틴]짤막한 이야기 2021. 10. 6. 06:28
[2021/10/06][짤막한 이야기 - 루틴] "루틴(Routine)"은 프로그램을 구성하는 단위 중 하나로, PinTool에서 활용되는 개념이다. 흔히 알고있는 함수(Function)를 PinTool에서 칭하는 개념이며, 따라서 PinTool에서는 루틴과 함수가 동일한 의미로 혼용된다. 루틴의 경우 하나의 섹션 내에서 여러 개가 존재할 수 있다. 따라서 섹션에서와 마찬가지로 특별한 순회 방법을 사용하게 된다. 참고로 PinTool의 가장 큰 구성 단위는 앱(App)이며, 앱 아래에 다수의 이미지(Image)가 있다. 즉, 앱 내에서 여러개의 이미지가 존재할 수 있기 때문에 이미지의 특별한 순회 방법도 존재한다. 루틴은 "RTN_"을 포함하는 계측 함수(RTN_AddInstrumentFuction)가 ..
-
[2021/10/01][짤막한 이야기 - 섹션]짤막한 이야기 2021. 10. 1. 06:36
[2021/10/01][짤막한 이야기 - 섹션] "섹션(Section)"은 프로그램을 구성하는 단위 중 하나로, PinTool에서도 매우 중요한 개념이다. 왜냐하면 이 섹션이라는 단위를 기점으로 분석의 난이도가 올라가기 때문이다. 섹션은 하나의 이미지 내에 존재하는 단위이며, 하나의 이미지 내에 여러 개가 존재한다. 따라서 메인이미지(분석 대상 프로그램)의 모든 섹션을 분석하기 위해서는 특별한 순회 방법을 사용하여야 한다. 기본적으로 C언어의 "for"문을 이용하지만, 이미지의 첫 섹션에서부터 마지막 섹션까지의 순회는 API를 이용하여 이루어진다. 그리고 각 섹션에 대하여 메모리 상의 주소와 파일 상의 주소가 상이하기 때문에, 주소 변환 체계를 이해하지 못한다면 예시의 소스코드를 정확히 이해하기 어려울 ..
-
[2021/09/30][짤막한 이야기 - 이미지]짤막한 이야기 2021. 9. 30. 06:46
[2021/09/30][짤막한 이야기 - 이미지] “이미지(Image)”는 PinTool에서 분석 대상이 되는 프로그램의 구성 요소 중 하나이다. 구성 요소 중 거의 제일 큰 개념이라고 생각하면 되며, EXE 파일, DLL 파일 등을 PinTool에서는 각각 이미지라고 칭한다. 만약 PinTool을 이용하여 어떤 프로그램을 분석한다고 하면, 보통은 그 프로그램 자체를 분석하려는 목적일 것이다. 즉, 프로그램을 실행할 때 필요한 부가적인 이미지(즉, DLL)들은 분석 대상에서 제외하고 프로그램 그 자체를 분석하는 것이다. 이를 위해서 PinTool에서는 프로그램과 부가 이미지를 구별할 수 있는 API를 제공하며, 프로그램 자체만 분석할 수 있도록 구조체를 잘 구성해두었다. 위의 예시코드는 분석대상 프로그램..
-
[2021/09/29][짤막한 이야기 - 계측 & 분석]짤막한 이야기 2021. 9. 29. 11:07
[2021/09/29][짤막한 이야기 - 계측 & 분석] “계측”과 “분석”은 PinTool을 구성하는 가장 기본적이며 중요한 개념이다. 계측은 "분석용 코드를 삽입할 위치"를 나타내는 용어이다. 분석은 "분석용 코드의 분석 행위"를 나타내는 용어이다. PinTool의 구현에는 두 개념을 반드시 포함하여야 한다. 두 개념은 함수 형태로 정의되며, 먼저 삽입할 위치를 정의한 후 삽입할 코드를 정의한다. 이를 각각 “계측 함수(Instrumentation Function)”와 “분석 함수(Analysis Function)라고 한다. 메인 함수에서 계측 함수를 호출하고, 그 계측 함수에서 (특정 조건을 만족시) 분석 함수를 호출한다. 계측 함수(INS_AddInstrumentFunction)에서 “INS_”는..
-
[2021/09/28][짤막한 이야기 - EFLAGS]짤막한 이야기 2021. 9. 28. 08:31
[2021/09/28][짤막한 이야기 - EFLAGS] "EFLAGS"는 레지스터의 한 종류이며 Extended FLAGS 레지스터라고 생각하면 편하다. 플래그 레지스터는 범용 레지스터(EAX, EBX, ECX 등등. 32비트 운영체제 기준 4바이트로 구성됨)와 달리 특정 상황을 0과 1로 표현한다. 예를 들어 제로플래그(ZF)가 1인 경우 이번 연산의 결과로 0을 생성하였다는 의미이다. 0과 1은 1비트로 표현가능하기 때문에 범용 레지스터와 같은 크기로 할당하면 불필요한 공간이 많이 소비된다. 따라서 모든 플래그(ZF, SF, CF, OF 등등) 레지스터를 합하여 하나의 EFLAGS 레지스터(4바이트)에 할당하는 것이다. 예를 들어, EFLAGS의 6번째 비트가 ZF를 나타내는 것이다. 이것이 중요한 ..
-
[2021/09/27][짤막한 이야기 - 임포트 주소 테이블 복원(상세)]짤막한 이야기 2021. 9. 27. 06:38
[2021/09/27][짤막한 이야기 - 임포트 주소 테이블 복원(상세)] 앞선 포스트에서 IAT 복원과 관련한 PinTool 소스코드를 아주 일부만 제공하였다. 제공된 소스코드는 특정 함수가 호출되는 시점에서 해당 함수의 인자값과 반환값을 읽어들이는 기능의 명세 부분에 해당한다. "LoadLibraryA"와 "GetProcAddress" 함수의 동작 원리를 검색하여본다면, 이것이 어떻게 IAT를 복원하는지 쉽게 파악할 수 있다. 실제로 인자값과 반환값의 기록을 수행하는 부분은 그림과 같다. 이 때, "메모리 쓰기"를 모니터링하여 실제 IAT가 언패킹 과정 중 복원이 되는 "위치"를 파악하여야 하는데, 이에 대한 소스코드도 함께 제시한다. "메모리 쓰기"는 특정 함수가 수행하는 것이 아니라 특정 명령어(..