Tiny Bunny

동아리/팀 스터디

[8기 기초] 리버싱 팀 03

bento 2023. 10. 11. 19:49

활용 강의

유튜브 - Fin

스택(Stack)

FILO 구조

http://www.tcpschool.com/c/c_memory_stackframe

 

ESP (Extended Stack Pointer):

  • 현재 스택의 최상단을 가리키는 포인터

EBP (Extended Base Pointer):

  • 현재 스택 프레임의 시작 주소를 가리킴(ESP값을 저장)

 

스택 프레임(Stack Frame)

EBP를 통하여 스택 내 변수 파라미터 복귀 주소에 접근하는 기법

EX.

PUSH EBP      ; 함수 시작 -> 스택에 EBP 백업
MOV EBP, ESP  ; ESP값을 EBP에 저장
.
.
.
MOV ESP, EBP  ; ESP값을 복원
POP EBP       ; EBP 복원
RETN

함수 내에서 ESP값이 변해도 EBP를 기준으로 안전하게 해당 변수나 파라미터, 복귀주소에 접근이 가능하다.


CodeEngn

 

Basic RCE L01


*GetDriveTypeA

https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea

타입에 따라 반환 값이 다르다

CD-ROM의 경우 5인 것을 찾아본다면 그냥 확인 가능. .

하지만 다른 방법으로 확인해보기로 한다


처음 실행시키면 해당 창이 뜬다

CD-Rom으로 인식시키라고 한다

 

1. ZF값을 변조 시켜 점프 시킨다.

00401000 | 6A 00                    | push 0                                  |
00401002 | 68 00204000              | push 01.402000                          | 402000:"abex' 1st crackme"
00401007 | 68 12204000              | push 01.402012                          | 402012:"Make me think your HD is a CD-Rom."
0040100C | 6A 00                    | push 0                                  |
0040100E | E8 4E000000              | call <JMP.&MessageBoxA>                 |
00401013 | 68 94204000              | push 01.402094                          | 402094:"c:\\\\"
00401018 | E8 38000000              | call <JMP.&GetDriveTypeA>               |
0040101D | 46                       | inc esi                                 | esi:EntryPoint
0040101E | 48                       | dec eax                                 |
0040101F | EB 00                    | jmp 01.401021                           |
00401021 | 46                       | inc esi                                 | esi:EntryPoint
00401022 | 46                       | inc esi                                 | esi:EntryPoint
00401023 | 48                       | dec eax                                 |
00401024 | 3BC6                     | cmp eax,esi                             | esi:EntryPoint
00401026 | 74 15                    | je 01.40103D                            |
00401028 | 6A 00                    | push 0                                  |
0040102A | 68 35204000              | push 01.402035                          | 402035:"Error"
0040102F | 68 3B204000              | push 01.40203B                          | 40203B:"Nah... This is not a CD-ROM Drive!"
00401034 | 6A 00                    | push 0                                  |
00401036 | E8 26000000              | call <JMP.&MessageBoxA>                 |
0040103B | EB 13                    | jmp 01.401050                           |
0040103D | 6A 00                    | push 0                                  |
0040103F | 68 5E204000              | push 01.40205E                          | 40205E:"YEAH!"
00401044 | 68 64204000              | push 01.402064                          | 402064:"Ok, I really think that your HD is a CD-ROM! :p"
00401049 | 6A 00                    | push 0                                  |
0040104B | E8 11000000              | call <JMP.&MessageBoxA>                 |
00401050 | E8 06000000              | call <JMP.&ExitProcess>                 |
00401055 | FF25 50304000            | jmp dword ptr ds:[<GetDriveTypeA>]      |
0040105B | FF25 54304000            | jmp dword ptr ds:[<ExitProcess>]        |
00401061 | FF25 5C304000            | jmp dword ptr ds:[<MessageBoxA>]        |

00401026 | 74 15 | je 01.40103D

 

ZF는 연산 결과 값이 0이면 1반환(참)

 

ZF가 0 > 점프하지 않고 계속 진행

ZF가 1 > 40103D로 점프

 

해당 부분에서 ZF가 0임을 확인할 수 있고

이를 1로 변조시켜주면

 

해결할 수 있다.

 

2. 조건 분기 명령어 je 대신 jmp로 바꿔준다


그래서 HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴 값을 구해보면

이때 EAX는 3, ESI는 0임을 알 수 있는데

중간에 EAX 값은 총 -2, ESI 총 +3 되는 것을 볼 수 있다

EAX-2 = 0+3

EAX = 5

 

정답 = CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴 값

: 5


Basic RCE L06

 


패킹(Packing) - 실행 압축

: 실행 파일을 암호화하거나, 압축하여 소스코드를 볼 수 없도록 하는 것 > 분석을 어렵게

 

https://brainfreeee.tistory.com/33

일반 압축과는 다르게 패킹된 파일 내부에 패킹을 해제하는 코드가 같이 들어가 파일을 실행시키면 스스로 패킹을 풀 수 있으며,

또한 확장자 바뀌지 않는다는 특징이 있다


파일을 실행 시키면 입력 후 시리얼을 체크하는 것 같은 버튼이 나온다

아무 값이나 입력해보면 Wrong serial!!! 문구가 뜬다

 

분석 툴을 이용하여 확인하면 UPX로 패킹되어 있음을 확인할 수 있다

 

문제를 해결하기 위하여 언패킹하여 확인해보기로 한다

 

확인해보면 제대로 언패킹이 된 모습이다

 

문제에서 요구한 OEP(시작 지점)

: 00401360

 

Serial을 찾기 위해 이전 실행 시 확인했던 Wrong serial 문자열을 찾아가봤다

 

점프 구문 위 test eax, eax 이 눈에 띈다

시리얼 값을 비교하는 부분으로 예상하고 위로 올려보면

 

입력한 문자열과 AD46DFS547와 비교한다

 

Serial 값을 AD46DFS547로 예상하고, 값을 넣어 비교해보면 맞다!

 

정답 = OEP + Serial

: 00401360AD46DFS547

728x90

'동아리 > 팀 스터디' 카테고리의 다른 글

[8기 기초] 리버싱 팀 06  (0) 2023.11.10
[8기 기초] 리버싱 팀 05  (0) 2023.11.10
[8기 기초] 리버싱 팀 04  (0) 2023.10.14
[8기 기초] 리버싱 팀 02  (0) 2023.09.29
[8기 기초] 리버싱 팀 01  (0) 2023.09.28