레나 듀토리얼 - 3

리버싱|2021. 3. 26. 16:35

With 보안프로젝트

 

 

내그 제거

 

PE 구조 분석

 

nag를 없애기 실습

 

첫번째 nag를 제거(EP 수정)

두번째 nag를 제거 (nop 패치)

 

 

Oops의 Entry Point 쫓아가서 BP 잡는 방법 설명

 

Oops의 올리에서 제대로 실행되지 않는 이유를 분석

 

 

 

 

 

Pe 구조를 보기위해서는 peview를 많이 사용하게된다.

 

 

그래서 레나듀토리얼 3번 파일을 peview로 켜봅니다.

 

 

 

 

 

주요내용은 section 부터 들어가게됩니다.

 

 

 

 

앞에 헤더들은 어떤모양을하고있고 어떻게 올라가 있고 이정도라고 생각하면됩니다.

이 파일은 어떤거고 라고 설명하는 거라고 생각하면된다.

 

dos 헤더는 옛날에 사용하던 그것이지만

현재는 그냥 호환성을 위해서 냄겨두는 거라고 생각하면됩니다.

 

Offset to EXE Header에서 새로운 헤더에 대한 위치를 알려주고있다.!

 

도스모드에서 사용하지 못하는 것을 알수있습니다.

 

 

 

 

NT HEADERS가

있는데 이거는 새로운 헤더라고 생각하면됩니다.

실제로 c0위치에 새로운 헤더가 위치해 있습니다.

 

 

PE 헤더를가지고있고

 

 

 

 

FILE_HEADER에서는

이게 32비트또는 64비트에서돌아가는지

 

컴파일된 이프로그램이 만들어진시기,

 

어떤 특징을 가지고있는지를 알려줍니다.

 

 

OPTIONAL_HEADER에서는

 

NT_OPTIONAL_HDR 어떤 매직정보를 넣는데 그렇게 중요하지않다

 

그리고 밑에는 버전에대한 내용이 나온다

 

Major Linker Version , Minor Linker Version

어디에서컴파일됬는지 알수있다 EXE파일이 어디에서 컴파일되있는지에 대한정보 

 

 

Size of Code는

코드의 양이얼마냐~ 라는것 

사용하는 커맨드영역이 400 바이트라고 써있다.

 

 

 

Size of Initialized Data

데이터영역은 초기화했을때 A00바이트에대한내용

 

 

Address of Entry Point

1000이 적혀있는데 

 

 

 

 

image Base에서는 

가상메모리 400000번지에 올라간다.

 

 

40만번지에 가면 PE Header가 올라가있고

exe파일이 40만 번지에 올라가있는것!

 

 

 

 

그래서

Address of Entry Point

1000이 적혀있는데 

 

image Base에서는

가상메모리 400000번지에 올라간다.

 

즉 이게 무슨말이냐면

 

 

이미지베이스 (40만번지)에 1000바이트(Entry Point) 쯤에 진입점이있고

 

프로그램을 시작하게되면 401000 부터 시작을 하겠다! 라는 의미라고 볼수있었습니다.

 

 

 

 

Base of Code

 

코드가 올라가는 영역

명령어가 1000바이트 부터 올라왓는데

size of code가 400바이트밖에되지않았는데 401000번지에올라온다 라는 것입니다.

 

 

여기서 알수있는 사실은

 

40만 1000번지이면은 

 

 

Section Alignment 

 

1000바이트씩 짤라서 배치하겠다 라고 써있습니다.

파일 크기보다 조금더 커지면서 1000바이트 맞춰지면서 올라간다.

 

 

 

File Alignment는

 

200고

Section Alignment는 1000 이지만 1000바이트씩 짤라서 올라가는거고

 실제 파일자체로 존재할때는 200바이트씩 짤려서 존재합니다.

 

 

Size of Image

 

이미지의 사이즈는 얼마인지

 

exe파일 자체가 이미지인데

exe파일의 이미지 사이즈가 얼만지 헤더의 사이즈가 얼마인지 라는것을 이야기하는것

 

 

 

 

 

Checksum은

 

전체파일 데이터에 문제가있는지 확인하는 것

 

 

 

Subsystem

 

윈도우에 여러가지 서브시스템이있는데 

 

 

 

 

Number of Data Directories 뒤부터는 이제

 

데이터가 어떻게 헤더데이터들이 배치되있는지 

 

가 장중요하게 보는 것은 EXPORT Table 과 IMPORT Table 정도라고 생각합니다.

 

 

 

 

section header 쪽은 이 섹션들이 어떤 특징들을 가지고있는지 설명해줍니다

 

 

Name

 

이름

 

 

Virtual Size

 

가상메모리는 400인데 올라갈때는 21A로 올리겠다

라는 의미가 담겨있고

 

 

Characteristics는

권한에 대한 내용을 이야기하고있다.

실행가능한권한을가지고있다 읽기 가능한 권한을 가지고 있다

EXECUTE,   READ

 

 

 

 

이제 파일을 켜보게되면 

이 레지스터라는 프로그램에서 nag를 제거해달라 라는 의미입니다.

 

 

nag를 패치해서 삭제를 해라 라는 의미의 메세지박스가 나옵니다.

 

nag모냐면 그냥 경고창을 없애라!!!

 

 

 

 

 

이것을 올리디버거에 열어봅시다 이제

 

 

 

 

 

 

 

GetModuleHandle

 

을 사용하고있는데

현재의 모듈이 핸들을 얻는 방법인데 그다지 쓰이는 방법이아닌거같다

 

 

 

 

 

CALL을 하고 eax에서 나온값을 살펴보면

 

EAX 에 40만이 있다

모듈에대한 핸들 값을 얻으면 40만번지가 나오는 것이다

올라와있는 구조 

 

 

 

Hex에서 40만번지로 가게되면

MZ 헤더가 있고 PE헤더가 잘위치하게되는 것입니다.

 

 

 

 

그다음 CMP EAX,0 에서 절대로 0이 될수 없다는 것을 알수있으니까

 

점프 할일이 절대로 존재하지않는다.

 

그이유는 아까 EAX에 40만이나왔는데 0이랑 비교해서 비교한 값이 같아서

제로플레그가 1으로 올라갈 확률이 없기 때문이다

 

 

JE 

값이 전보다 작으면 점프해란 의미로 점프를 하게되는데

 

그래서 점프를 할수가없다.

 

하지만 점프를 해줘야하는데 점프를 하는게 불가능합니다.

 

점프를 바꿔주거나 그래야하는데

 

 

우리는 Entry point를 수정해서 풀어봅니다.

 

 

 

401000번지로 되어있는 entry point를 (진입점) 401024에서 시작을 하게 만들면

 

점프를 수정하지않아도가능하다

 

하지만 밑에부분에

 

 

 

 

 

 

뒤쪽에는 이런내용이나오는데 점프를 할수있는 방법이 없으니까

 

NOP으로 실행하지 않게 바꿔줍니다.

 

 

 

즉이렇게 바꿨고

 

Binary -> Fill with NOPS

 

 

이제 JE는 직접들어가서 수정을 해봅시다.

 

 

 

JE를 들어가면

 

위창에 M을 누른다.

 

메모리에 직접들어가는거.

 

 

 

 

이부분을 더블클릭을들어가면

 

 

peview에서 봤던것을 올리디버거에서 보는 느낌이라 생각하면된다.

 

 

 

 

이렇게 볼수가 있고

 

 

여기에 entry point에 대한 내용을 볼수있다

 

 

즉 entrypoint가 4000e8번에 존재를 한다.

 

 

 

 

그래서 peview로 가서 확인을 해봅니다.

 

 

VA 즉 가상 어드레스에 대한내용

 

 

 

 

여기서도 Entry point가 4000E8번에 있다는 것을 알 수 있습니다.

 

 

 

다시 올리디버거로 가서 덤프창에서 따라가봅시다.

 

 

C버튼을 누르게되면 다시돌아오게되고

 

 

 

돌아올수있고

 

 

 

 

 

 

4000E8번의 주소를 검색하니 리틀인디안 방식으로

 

1000 이였던게 00 10 으로 들어가 있게됬습니다.

 

 

00앞에있는부분을 

ctrl+ e를 진행해서

 

24로 바꾸게되면

 

entrypoint 가 1024 니까

 

 

우리가원했던 entry point 를 00401024 번지로 바꿀수있다

 

 

우리가 바꾼

 

NOP 에대한 내용과 우리가 원했던 00401024 번지로 Entry point를 저장을 합니다.

 

 

 

파일을 저장을 하기위해 누릅니다.

 

 

 

 

파일을 저장합니다!

이름을 crack 으로 바꿧습니다.

 

 

 

우리가 변경한 크랙파일을 키게되면

첫메세지박스가 이걸로 바뀌게 되었습니다.

 

 

 

 

그전에봤던  이 내용이  우리가 크랙을 만들게 되서

 

 

사라지게 됬습니다.

 

하지만

 

 

 

이 잔소기는 사라지지가 않았으니까

 

 

NOP을 저장을 안하게된 것입니다.

 

 

Copy to executable -> All modifications

 

 

copy all을 누르고

 

 

저장하기

 

 

 

저장을 마지막으로 합니다

 

 

그럼이제 이거 하나만 뜨게됩니다!

 

 

 

 

 

 

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

 

 

 

 

 

 

Oops의 Entry Point 쫓아가서 BP 잡는 방법

 

1. Entry Point 직접 가서 잡는다.

 

2. Pe 구조가 이상해서 에러 ~ PE 구조 수정

 

 

 

 

 

 

 

 

 

 

Peview를 두개열어줍니다.

 

 

두개의 파일을 비교하기위해서

 

 

이미지 헤더를

잘보니까 Oops 파일은 어느순간부터 짤렸습니다. 

 

애는 올바른 pe구조가아닙니다

 

윈도우가 실행할때 모든것을 가지고 해석해서 실행하는게 아니라 실행해도 똑같이 나옵니다.

 

올리디버거를 통해서 실행하는 경우에는 제대로 실행되지않습니다.

 

올바른 pe구조가 아니기때문입니다

 

 

 

 

 

 

PE 도 잘잡는 것을 알 수 있습니다.

 

 

File Header에서도 동일하게 유지가 되고있습니다.

 

 

하지만 optional header 부터는 아예 읽지도 못하고 있습니다.

 

여기서는 동일한 분석을 할수없습니다.

 

pe구조가 온전히 있을때만 확인할 수있는데

 

불가능 하니까 

 

 

 

 

 

HXD 프로그램을 사용합니다.

 

 

 

 

HXD에 원본파일인 RegisterMe.exe를 엽니다.

 

 

덤프창에 있는것처럼 보여준다 올리디버거에서 본것처럼

 

 

 

 

analysis -> compare가 존재하는데

 

데이터비교 -> 비교를 누릅니다.

(한국어는)

 

 

 

이렇게 원본파일과 Oops 파일을 비교합니다.

 

 

 

이렇게 f6을 계속눌러주면 다른적을 계속 찾아줍니다.

 

 

 

 

 

잘보면 entry 가 40만번지에 올라가야 하지만 정상파일은 그렇지가 않습니다.

 

 

 

여기서는 

 

 

그리고 sizeofcode 가 임의로 변경이됬습니다 (Oops)에서는

 

 

 

원래는 

 

00000400을 리틀 인디언 방식으로

 

00 04 00 00 으로 되야하지만

00 04 00 40 으로 변경되있다는 뜻입니다.(Oops파일)

이렇게 변경이된거는 엄청나게 커진 것입니다.

왜냐 리틀인디언 방식으로하면

 

00000400

-> 변형되서

40000400 이기때문입니다.

 

 

 

이부분을 수정을 해줍니다.

 

00 04 00 40->

 

00 04 00 00으로

 

바꿔줌

 

 

 

 

 

 

 

 

 

 

 

 

 

이부분을 보니까

 

00 0A 00 00 

->

00 0A 00 40 으로 변경이 됬습니다

(Oops파일)

 

 

peview에서 찾아보니까 Size of Initialized Data였고

 

 

00000A00

->

40000A00 이렇게 변경됬으니까

 

다시바꿔줍니다.

 

 

00 0A 00 40

->

00 0A 00 00 으로

 

 

 

 

 

 

 

 

 

 

 

 

 

그리고 또 000000EF 부분이 또 바뀌게됬습니다.

 

그래서보니까

Base of Code 부분을 또 수정한 것입니다.

 

코드의 베이스가 어디냐 라는 의미인데

 

 

코드가 어디에 올라가냐 라는 의미입니다.

 

 

 

 

이부분이 바뀌게 된것이고

 

00 10 00 00 

->

00 10 00 40 으로 변형

 

 

 

00001000 

->

40001000

으로 엄청나게 변형이됬습니다.

 

그래서 이부분을 또 수정

 

 

 

 

 

 

 

 

 

 

다음을 가도 또 바뀌어있어서 수정을 합니다

 

수정완료

 

 

 

 

 

 

 

 

 

 

 

 

또 비교하니까 이친구는 오히려 사이즈가 줄었습니다.

 

즉 10에서 -> 4로 줄었다.

 

 

그래서 뭔지 궁금해서 peview로 찾아보니까

 

 

오히려 크기를 줄여서 뒤에따라오는 데이터 디렉토리들을 없애 버린 것입니다.

 

 

 

총 10개인데 4개만 있게되는것입니다. 디렉토리 10개에서 4개로 줄였기 때문에 

10개로 똑같이 만듭니다.

 

 

 

그래서 10 으로 수정 완료

 

 

 

 

00000010

이 

40000010

으로 바뀌어있습니다.

 

 

10 00 00 00 

->

10 00 00 40

으로 바뀐것

 

 

여기까지 number of directories의 것이기때문에

 

10 00 00 40을

 

10 00 00 00으로 바꿔준다

 

 

 

 

 

 

 

여기서는 00 00 00 00

->

00 00 50 00 으로 바뀌었습니다.

 

00000138 부터 시작이므로

 

 

 

EXPORT Table이 또 변경됬었고

 

 

이제 전부 다 f6으로 비교하면서 바꿔줍니다.

 

 

 

 

 

 

그다음꺼로 가서

 

이거를

00으로 수정하니

 

이제 비교할 것이 없어졌기 때문에 원본을 다 살린것 같은 느낌이다.

 

 

 

 

 

 

이렇게 peview로 수정한 파일을 열어보니까

 

이제 이 파일의 헤더가 잘나오게되고 잇습니다.

PE 구조를 복구했습니다.

 

그 전에는 다 짤려서 나왔기 때문입니다.

 

 

 

 

 

이제 올리디버거에서 이제 열수가 있게됬다 PE구조가 복구됬기 때문이다.

 

 

 

 

내그를 제거하고 

PE 구조를 분석했고 (거기서 Entry point의 위치를 알수 있었고)

메모리에 데이터가 올라간다라는거 약속된 것들이있고

 

이런게 잘못되면 올리디버거에 인식하지못하고 peview도 인식이 불가능하고

 

마지막으로 pe 구조를 복구까지 진행 해봤습니다.

 

 

 

 

'리버싱' 카테고리의 다른 글

upx 수동언패킹  (0) 2021.03.28
레나 듀토리얼 - 4  (0) 2021.03.26
레나 듀토리얼 - 2  (0) 2021.03.25
레나 듀토리얼 - 1  (0) 2021.03.24

댓글()