반응형

위에 보이는 구조가 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
,
반응형

1. 목표

저의 목표는 저를 괴롭힌 랜섬웨어를 완전히 패치시켜버리기 위해서 이 길을 선택하게 되었습니다.

저도 항상 흔들릴때가 많습니다.. 하지만 그럴대 마다 조금씩 쉬어주고 램섬웨어에 걸렸을때를 생각하며 칼을 갈아나가고 있습니다.

 

2. 긍정적인 마인드

저도 이번에 해킹동아리에 관심을 가지고 대학에 지원을 하게 되었고 해킹동아리를 같이 할 친구들을 모으면서

많은 친구들이 해킹에 대해서 많은 잘못된 편경을 가지고 있습니다. 저도 처음에는 이런 편견이 강했습니다.

이런 편견을 바구게 해준게 정보보안영재원이 이었습니다. 저보다 웹해킹이 뛰어나지만 그렇다고 많은 언어를 알필요도 없었습니다. 그곳의 많은 친구들도 많은 지식이나 많은 코드를 아는게 아닙니다. 하나하나 문제를 해결해 나가면서 배워나갔습니다. 저의 경우 대학과정에 자바가 있고 3대 언어 c python java 에대한 약간의 편경 때문에 자바를 완파 했습니다. 사실 자바는 리버싱을 하는데 큰도움이 되지 않는데도 말이죠 ㅋㅋㅋ

저또한 파이썬이나 c 자바를 완벽하게 아는게 아닙니다. 그저 필요할때 검색해서 알아가고 문제를 해결해 갑니다.

 

3. 재미를 느껴야 한다.

음.. 저는 crack me 중 암호화 된 패스워드를 알아내는 문제를 풀었을떄 그리고 매번 문제를 나의 방법으로 해결해 갈때 많은 성취감을 느낌니다. 이런 성취감이 저를 신나게 하는것 같습니다.

 

4. 검색의 생활화

저는 요즘 노력을 하고 있는 부분 입니다. 문제를 풀어가면서 모르는 어셈블리어를 자주 검색하고 정리를 합니다. 특히 자주 나오는 몇몇게는 조금씩 기억해 나간다는게 재미있습니다.

 

5. 제일중요한것은 실천이다.

저도 이부분에서 많은 공감을 했습니다.

가장 중요한것은 실천입니다. 

 

6. 느긋한 마음을 가지세요

이부분은 저에게는 조금 어렵습니다. 저는 조금함 때문에 풀이를 보기도 전에 문제에 정답을 찾기 위해 하루정도 혼자 싸울떄도 많았습니다. 조급함은 양날의 칼과 같습니다. 잘 이용한다면 더 힘이 된다고 생각합니다.

 

드디어 기초 리버싱 단원을 끝냈습니다. 저는 항상 마지막 스퍼트가 가장 힘듭니다. 이시기에는 내가 돠염 지금까지의 내용을 완벽하게 이해 했을까? 하는 불안감 때문에 완벽히 끝내지 못하는 경향이 있는데요. 책에서는 이렇게 말합니다.

'가슴 한편에 간직해두고 알아가자' 처음 이책을 읽고 완벽하게 이해하는 사람도 있겠지만 저는 아닙니다. 실천과 반복이 저를 강하게 만들기 때문에 물론 이해를 못한 부분도 있겠지만 마음 한편에 간직하고 이책을 마무리한후 다시한번 볼때 메모해 두었던 부분의 모르는 부분을 찾고 넘어가도록 해보겠습니다.

 

앞으로 힘내자! 

반응형
Posted by 53C
,
반응형

첫 번재 해결점은 NAG(잔소리)를 없애는 것이다. 이것의 의미를 파악할 수가 없었는데

간단히 문자열이 드지 않게 하는 것이었다. 방법은 매우 많지만 에를 들어 함수가 호출되는 부분을 찾아서 호출이 되지 않돍 점프시키는 등 방법은 잇지만 책을 따라가기로 했다.

NAG를 클릭하면 처음 보이는 함수이다.

함수안으로 들어가서 찾아보면 진짜 메세지를 호풀하는 부분을 찾을 수 있다. 책에 나온 정석적인 방법으로 풀이를 해보 겠다.

함수 호출을 저지 시킨다.

 

이렇게 되는데 14=E  16진수로 생각을해보면

 

CLL 함수는 5바이트의 크기를 가진다. ADD 명령어는 3바이트를 가져서 남은 곳을 NOP로 채워주었다..

이렇게 하면 문제가 생기는데 함수내에서의 변수를 제대로 처리를 하지 못한다. 그래서 내가 처음 찾은 NAG에서 함수를 들어간후 처음보는 코드를 그냥 RET 4 해버려서 함수에서 바로 바져나오도록 처리를 해버렸다

이렇게 처리를 해주면 1가지 문제가 긑나고 어제 하루종일 찾아본 분기문에 가보면

문자열을 분기하는 API 위에 함수에 들어가는 인자를 찾을 수 있다.

어제는 왜 못찾았지....

그러면 성공이다.

 

결론....

일단 뭐 많은 웨게임 문제들의 의도를 파악하는것은 제일 함든데 뭐.. 이번 문제는 비교적으로 쉬웟다...

반응형
Posted by 53C
,
반응형

앞서 소개한 원하는 코드를 빨리 찾는 4가지를 나는 지금까지 적극적으로 활용해서 지난 문제들을 비교적 매우 쉽게 풀었다.

특히 프로그램을 실핼시키면서 BP를 잡아서 동적 분석의 장점을 잘 활용해 왔지만 윈도우 베이직 코드는 너무 장벽이 높았다. 내가 풀어본 문제들은 스택 또는 덤프에 어떤 형식으로든 내가 입력한 값이 들어오는 것을 확인하고 변수가 호출되는 부분을 중심적으로 찾아냈다. 핸들이 있는 프로그램의 경우 이러한 방식으로 BP잡는 것에서 많은 고난이 있었다. 하지만 비교적 빠르게 주요 함수르르 찾아내는 데는 성공한것 같은데... 앞서 말했듯이 내가 입력한 값을 어떠한 형태로든 저장하는 과정을 찾을 수가 없었다... 아마 핸들러가 작동을 하면서 변수를 읽는것 같은데 문제는 제대로 프로그램 구동이 되지 않아서 올바른 지점에 BP를 걸지를 못한다..... exex는 ida로도 분석이 어렵다... 많은 EP코드들은 어느정도 걸러 냈지만 시리얼 키가 어떤 것인지 알아내지는 못했다.. 문제를 오늘 하루 동안 풀어보면서 뭔가 어느 한부분에서 부족함을 느꼈다... 이건 시리얼 키를 찾는 프로그래램이 맞는 것일까? 하는 의문이 들었고... 일단 오늘은 풀지 못했다..

이번주말 일정이 어떻게 될지는 모르겠지만 조만간 책을 보고 내가 부족했던 점을 찾아봐야 겠다.

반응형
Posted by 53C
,
반응형

함수호출 규약이란 함수를 호출할때 파라미터를 전달하는 방식을 뜻한다.

 

cdecl stdcall fastcall
가변길이 파라미터의 관리가 가능하다. ADD ESP,XXX 등 함수의 파라미터를관리하는 코드가 없어서 코드가 짧아진다. 파라미터를 레지스터에 관리한다. 더 빠른 함수의 호출이 가능하지만 관리가 어렵다.

몇몇 부분이해가 가지 않았던 부분은 파라미터의 변수 값을 알아내는 법과 ESP의 레지스터 값을 정리하는 과정이 조금 이해가 힘들었다. 2숫자이면 4바이트 씩일것이고 더하는 연산을 하더라도 4바이트여야 하는데 왜 8바이트 인지 조금 이해가 어려웠다.

 

특히 cdecl 은 c언어에서 많이 사용되는 방식이고 stdcall 방식은 winAPI 같은 코드에서 호환성을 좋게 하기 위해서 많이 사용된다. EP코드를 구별할때 많이 사용될것 같다. 크랙미를 풀면서 이와 같이 스택을 정리하는 부분을 많이 봤기 때문이다.

반응형
Posted by 53C
,