'리버싱/리버싱 핵심원리'에 해당되는 글 18건

  1. 2020.04.05 PE 파일구조 복습1차 (구조체!)
  2. 2020.04.05 EAT
  3. 2020.03.29 IAT
  4. 2020.03.11 RVA to RAW
  5. 2020.03.09 PE File Format : PE Heder
반응형

서론

 

사실 저는 c언어를 거이 모릅니다... 제가 프로그램을 접하게 된 계기는 아마 고등학교 수업시간에 배우기 시작했고 관심을 가지고 파이썬을 독학 하기 시작했습니다. 하드웨어에 관심이 많아서 아두이노 그러니까 C++ 기반의 아두이노를 많이 다루었습니다. 해킹은 램 섬웨어에 걸리면서 안전한 사이버 환경을 만들자는 꿈을 가지고 배우기 시작했습니다.

그러면서 파이썬으로 많은 프로그램도 제작을 하고 자료구조도 공부했습니다 자바는 객체 지향을 공부하기 위해 공부를 했습니다 그리고 램 섬웨어가 자바스크립트로 짜인 코드라 자바스크립트를 배우기 전에 한번 공부해봤습니다. 알고 보니 완전 다른 언어지만요 ㅎㅎ.... c언어는 학교 방과 후 학교에서 배웠는데 방과 후 수업은 포인터 전까지 수업을 진행했습니다.

그 이후에 리버싱을 배웠는데 리버싱을 하면서 가장 많이 알게 된 것은 컴퓨터의 구조와 메모리였습니다. 메모리를 학습하니 그 어렵다고 사람들이 말하는 포인터는 정말 쉽고 매우 기초적인 것이란 것을 알게 되었고 리버싱을 배우면서 하나하나 배워가고 있습니다.

최근 대학교 수업 중에 pi를 써야 하는 과제가 있어서 math.h 라이브러리를 불러오는 계기가 있었고 특히 PE 파일에서 도대체 어떻게 저게 4바이트 고 왜 저게 2바이트인지 저는 전혀 몰랐는데 오늘 우현이 알게 되었습니다.

오늘 PE 파일 구조를 끝내고 한 번 더 복습을 하기로 결정을 하게 되었습니다.

 

많은 사람들이 말하길 PE 파일 포맷은 2번 보고 3번 봐도 알 수 없지만 그러면 조금씩 보이기 시작한다고 말합니다.

사실 원래의 계획되로라면 조금 더 진도를 나가고 복습을 할 예정이었으나 워낙 기초적이고 중요한 내용이라 생각이 돼서 빠르게 복습을 하게 되었습니다. 저번에는 이론이 중심이었다면 이번에는 실습을 위주로 복습이 진행이 될 것 같습니다.

 

1. 구조체

 

자료형에 의 정보를 저장하는 의미를 가집니다.

이로 인해서 자료형을 구조체로 정의하여 프로그램을 제작하면 매번 변수를 선언하지 안 해도 된다는 장점이 있습니다.

 

 

 

 

이런식으로 사용이 간단합니다.

 

그리고

 

이런식으로 전역 변수를 설정할 수도 있습니다.

 

typedef로 구조체를 정의할 경우에는 strucy 없이 사용이 가능합니다. 

 

typedef는 별칭을 붙이는 용도로 사용을 하는데 많이 쓸 일은 없을 것 같습니다.

 

2. 자료형

저는 c언어를 잘 몰라서.. 잘 보시면 WORD가 보입니다.

아마 자료형의 종류겠죠?

 

WORD란 typedef로 재정의된 정수형 자료형입니다.

운영체제를 만든 사람들이 만든 자료형으로 win API에 정의된 WORD

이름 크기
BYTE 2bit
WORD 16bit
DWORD 32bit
QWORD 64bit

이제 PE파일 포맷을 다시 공부하면 되겠군요!

 

===================================================================

아 시발 자취하는게 생각보다 ㅈㄴ 안정적이다. 정말 하루하루가 긴장의 나날들이었는데.... 혼자만의 시간을 가지고 혼자만의 독립된 공간을 가진다는 게 이렇게 행복할 줄 몰랐다. 그렇다고 먹고 싶을 때 자고 싸고 일어나는 것은 아니다. 오히려 전보다 엄격하게 시간을 관리하고 있다. 3시 세끼 밥을 해서 먹는다. 진짜 매일 패스트푸드만 먹고 어떻게 사는지 모르겠다. 밤에는 편안하게 독서도 하고 저번에 꽃병에 꽃아 둔 개나리는 너무 잘 자라서 뭔가 좋다. 파도 잘 자라다가 요즘 천천히 자란다. 내가 많이 잘라먹어서 그런 것 같기도 하고 어쩃든 채소도 길러볼 계획이다. 문제는 이 일상의 행복이다. 일상의 행복에 젖어서 그냥 하루하루 보내면 안 된다. 매일 수업에 열심히 임하고 자기 관리에 힘써야 한다. 근데 그러기가 너무 힘들다... 미치겠다.

반응형

'리버싱 > 리버싱 핵심원리' 카테고리의 다른 글

EAT  (0) 2020.04.05
IAT  (0) 2020.03.29
RVA to RAW  (0) 2020.03.11
PE File Format : PE Heder  (0) 2020.03.09
도대체 리버싱을 어떻게 공부해야 하나요?  (0) 2020.03.04
Posted by 53C
,
반응형

EAT(Export Address Table)

라이브러리 파일(함수를 모아 놓은 파일(ex:ELL,SYS))에서 제공하는 함수를 다른 프로그램이 가져다 사용할수 있도록 하는 핵심 매커니즘을 말한다.

1. EAT 를 이용해야 해당 라이브러리에서 익스포트하는 함수의 시작 구소를 정확하게 알수있다.

2. PE파일내에 특정 구조체 (IMAGE_EXPORT+DIRECTORY)에 익스포트 정보를 저장하고 있다.

 

 

반면에 PE파일은 여러개의 라이브러리를 동시에 임포트할수 있기 때문에 IAT(프로그램이 어떤 라이브러리에서 어떤 함수를 사용하고 있는지를 기술한 테이블)를 설명하는 IMAGE_IMPORT_DECRIPTOR 구조체는 여러개의 멤버를 가진 배열의 형태로 존재한다.

 

IMAGE_IMPORT_DIRECRTORY 구조체의 시작주소 : IMAGE_OPTIONAL_HEADER32.DataDirectory[0]의 RAV값

IMAGE_OPTIONAL_HADER32 는 NTHEADER - OptionalHader에 위치한다.

kernel32.dll

0000262C = RAV(VitualAddress)

0000C6FD = Size 멤버

 

하... 시발 좃같네 일단 다시 PE해더부터 다시 공부하면서 해야겠다..

 

반응형

'리버싱 > 리버싱 핵심원리' 카테고리의 다른 글

PE 파일구조 복습1차 (구조체!)  (0) 2020.04.05
IAT  (0) 2020.03.29
RVA to RAW  (0) 2020.03.11
PE File Format : PE Heder  (0) 2020.03.09
도대체 리버싱을 어떻게 공부해야 하나요?  (0) 2020.03.04
Posted by 53C
,
반응형

IAT: Import Address Table

 

IAT란

프로그램이 어떤 라이브러이에서 어떤 함수를 사용하고 있는지를 기술한 테이블

 

DLL 파일

 소프트웨어 개발에서 자주 쓰고 기초적인 함수들을 중복 개발하는 것을 피하기 위해서 표준화된 함수 및 데이터 타입을 만들어서 모아 놓은 것이다

 

역사

DOS시절에는 DLL 파일이라는 개념자체가 존재하지 않았다.

프로그램에 필요한 바이너리 코드를 모아 프로그램안에 입력 시켜놓았다.

어런식으로 프로그램을 실행하면 프로그램의 크기도 커지고 window 의 멀티테스팅 기능을 활용하기 어려웠다.

그래서 개발자들은 프로그램에 라이브러리를 포함시키지 않고 라이브러리를 모아 놓은 파일을 만들어서 필요할때 꺼내어 쓰자 라는 아이디어로  DLL 파일이 탄생하게 되었다. 

쉽게 말해서 DLL파일은 라이브러리를 모아놓은 프로그램이다.

 

DLL파일을 로딩하는데 필요한 기술이 IAT와 메모리 매핑 기술이다.

 

DLL파일의 로딩 방법

 

1. 프로그램에서 라이브러리 호출 -> DLL 파일 로딩 -> 라이브러리 사용 종료 -> 메모리 해체

2. 프로그램 실행 -> DLL파일 로딩 ->프로그램 종료 -> 메모리 해체

 

 

=================

아직 완벽히 이해 못했지만 아마 포랜식을 배울떄 다시 보지 않을까 싶다...

반응형

'리버싱 > 리버싱 핵심원리' 카테고리의 다른 글

PE 파일구조 복습1차 (구조체!)  (0) 2020.04.05
EAT  (0) 2020.04.05
RVA to RAW  (0) 2020.03.11
PE File Format : PE Heder  (0) 2020.03.09
도대체 리버싱을 어떻게 공부해야 하나요?  (0) 2020.03.04
Posted by 53C
,
반응형

각섹션에서 메모리의 주소(RVA)와 파일 옵셋을 메핑하는 과정

1. RVA가 속한 섹션을 찾는다.

2. 비례식을 이이용해서 파일옵셋(RAW)를 찾는다.

 

RAW - PointerTORawData = RVA - VirtualAddress

RAW = RVA - VirtualAddress + PointerToRawData

 

 

반응형

'리버싱 > 리버싱 핵심원리' 카테고리의 다른 글

EAT  (0) 2020.04.05
IAT  (0) 2020.03.29
PE File Format : PE Heder  (0) 2020.03.09
도대체 리버싱을 어떻게 공부해야 하나요?  (0) 2020.03.04
11_Lenas_Reversing_for_Newbies 책보고 풀이  (0) 2020.03.02
Posted by 53C
,
반응형

위에 보이는 구조가 PE 파이르이 구조이다.

앞으로 하나씩 공부해보자

 

 VA/RVA

 

VA: 프로세스 가상 메모리의 절대 주소

RVA :어느 기준 위치(ImageBase) 부터의 상대적인 주소

 

 

위에 3가지를 PE 헤더라고 한다.

 

1. DOS header

 

앞서 PE파일은 호환성에 중점을 두었고 DOS파일에 대한 하위 호환성을 위해서 만들어졌다.

그래서 PE 헤더의 첫부분에 DOS EXE Header 을 확장 시킨 IMAGE_DOS_HEADER 구조체가 존재한다.

 

 

특징

  • 구조체의 크기는 40이다.
  • e_magic : DOS signature (4D5A => 아스키 값 "MZ")
  • e_lfanew : NT header 의 옵션을 표시 파일마다 가변적인 값을 가진다.

2. DOS Stud

 

중요도 X

 

3. NT Header

 

IMAGE_NT_HEDARS 는 3개의 맴버로 이루어져 있다.

크기는 F8 = 248

 

3.1 Signature 

50450000h("PE" 00) 값을 가진다.

3.2 File Header

 

파일의 개략적인 속성을 나타내는 IMAGE_FILE_HEADER 구조체이다.

  • Machine : CPU 고유넘버를 뜻한다.
  • Number Of Sections : PE파일을 섹션으로 코드 데이터 리소스로 분리하는데 그 섹션의 갯수를 나타내므로 0보다 커야한다.
  • SIze OFtional Header :  IMAGE_OPTIONAL_HEADER32구조체의 크기를 나타내며 이미 결정이 되어 있다. 64비트와 차이가 난다.
  • Characteristics: 파일의 속성을 나타내며 bit Or 형식으로 조합된다.
  • Time Date Stamp : 빌드 시간

3.3 Optional Hader

 

PE헤더의 구조체 중에 가장 크기가 크다.

 

  • Magic : 32 구조체의 경우 10B / 64 구조체의 경우 20B 의 값을 가진다.
  • AddressOfEnterPoint : EP의 RAV값으 가진다.
  • ImageBase : PE 파일의 로딩 시작주소로
    ex) EXE,Dll->user mamory(0~7FFFFFFFF)
         SYS-> kernelmamory(800000000~FFFFFFFFFF)
    로딩후 EIP = ImageBase + AddressOfEnteryPoint
  • SectionAlignment = 메모리에서 섹션의 최소단위
  • FileAlignment = 파일에서 셕션의 최소 단위
  • SizeOfImage = 메모리에 로딩후 가상 메모리에서 PE Image의 크기
  • SizeOfHeader = PE헤더의 전체크기
  • Sudsystem = 파일의 개인정보

의미 비고
1 Driver File 시스템 드라이버
2 GUI File 창기반 애플리케이션
3 CUL File 콘솔기반 애플리케이션

 

  • NumberOfRivaAndSizes = DataDirectory 배열의 갯수를 나타낸다.

3.4 섹션 헤더

 

각 섹션의 성질을 정리한 것이 섹션 헤더이다.

종류 엑세스 권한
codr 읽기/--/실행
data 읽기/쓰기/--
recourse 읽기/--/--

섹션 헤더의 중요 구조체를 알아보면

IMAGE_SECYON_HEDER 구조체
VirtualSize 메모리에서 섹션이 차지하는 크기
VirtualAddress 메모리에서 섹션이 시작하는 주소(RVA)
SizeOfRawData 파일에서 섹션이 차지하는 크기
PointToRawData 파일에서 섹션의 시작 위치
Characteristics 섹션의 속성(bit OR)
  • VirtualAddress 와 PointToRawData는 IMAGE_OPTIONA_HEADER32에 정의 된 SectionAlignment 와 FileAlignment의 해서 결정이된다.
  • VirtualSize와 SizeOfRawData 은 일반적으로 다른 값을 가진다. 이를 통해서 파일에서의 섹션의 크기와 메모리에 로딩되는 섹션의 크기는 다르다는 이야기가 된다.

 

IMAGE 란 PE 파일이 메모리에 로딩된 상태를 뜻하는 말이다.

 

 

========================================================

PE 헤더의 각 구조체와 섹션 헤더에 대해서 알아봤다. 그동안 책도 다시 여러번 읽어도 보고 다른 사람 강의도 찾아봤는데 한국어로된 강의는 찾기 힘들었다. 아무튼 PE파일의 구조중 가장 앞부분에 대해서 포스팅을 적은 나에게 칭찬을 하고 싶다. 그동안에 많은 실폐 끝에 작은 성공을 이룬것이 나에게 좋은 의미가 되었다고 생각이된다. 

요즘 코로나 때문에 밖에 나가기 힘들어서 스트레스도 쌓이는데 이번에 책을 또 사왔다. 평소에 읽어보고 싶었던 '빨간머리 앤' 이라는 책이다. 다음에 포스팅 하겠지만 남녀노소 모두에게 도움이되는 책이다. 정말 감명 깊게 보고 있다.

반응형

'리버싱 > 리버싱 핵심원리' 카테고리의 다른 글

IAT  (0) 2020.03.29
RVA to RAW  (0) 2020.03.11
도대체 리버싱을 어떻게 공부해야 하나요?  (0) 2020.03.04
11_Lenas_Reversing_for_Newbies 책보고 풀이  (0) 2020.03.02
11_Lenas_Reversing_for_Newbies 분석 실폐  (0) 2020.02.28
Posted by 53C
,