활용 강의
유튜브 - Fin
스택(Stack)
FILO 구조
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
타입에 따라 반환 값이 다르다
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) - 실행 압축
: 실행 파일을 암호화하거나, 압축하여 소스코드를 볼 수 없도록 하는 것 > 분석을 어렵게
일반 압축과는 다르게 패킹된 파일 내부에 패킹을 해제하는 코드가 같이 들어가 파일을 실행시키면 스스로 패킹을 풀 수 있으며,
또한 확장자 바뀌지 않는다는 특징이 있다
파일을 실행 시키면 입력 후 시리얼을 체크하는 것 같은 버튼이 나온다
아무 값이나 입력해보면 Wrong serial!!! 문구가 뜬다
분석 툴을 이용하여 확인하면 UPX로 패킹되어 있음을 확인할 수 있다
문제를 해결하기 위하여 언패킹하여 확인해보기로 한다
확인해보면 제대로 언패킹이 된 모습이다
문제에서 요구한 OEP(시작 지점)
: 00401360
Serial을 찾기 위해 이전 실행 시 확인했던 Wrong serial 문자열을 찾아가봤다
점프 구문 위 test eax, eax 이 눈에 띈다
시리얼 값을 비교하는 부분으로 예상하고 위로 올려보면
입력한 문자열과 AD46DFS547와 비교한다
Serial 값을 AD46DFS547로 예상하고, 값을 넣어 비교해보면 맞다!
정답 = OEP + Serial
: 00401360AD46DFS547
'동아리 > 팀 스터디' 카테고리의 다른 글
[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 |