틀린 부분이 있다면 언제든지 댓글 남겨주세요!
CodeEngn_Challenges Basic RCE L01
L01. HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가
이 파일이 몇 비트의 파일인지 찾는 방법은 많지만 그 중 파일 포멧 구조를 통해 찾아보았다.
NT HEADER 내의 IMAGE_FILE_HEADER의 구조체 중 machine의 값은 CPU 별로 고유한 값을 의미한다.
32 bit Intel 호환 칩은 0x014C의 값을 가지며 64 bit Intel 칩은 0x0200의 값을 가진다.
32비트 파일이라는 것을 알았으니 ollydbg를 통해 파일을 열어보았다.
401000이 EntryPoint이고, 차례로 실행시켜보면 MessageBox API호출 후 찾고자 하는 GetDriveTypeA API가 호출되는 것을 볼 수 있다.
차례로 실행시켜보면 GetDriveTypeA의 리턴값이 3이라는 것을 알 수 있다.
msdn에 나와있는 GetDriveTypeA의 리턴값이다. CDROM으로 인식된 경우 리턴값이 5이다.
리턴 이후의 코드를 살펴보면 결과적으로 (ESI+3), (EAX-2)의 연산을 한 값을 비교하여 같은 경우 40103D로 분기하는 것으로 보인다. 분기되면 CDROM으로 인식되었다는 메시지박스가 출력되는 코드로 간다.
기존의 값이 ESI=0, EAX=3이었으므로 결과적으로 ESI=3, EAX=1이 되어 분기되지 않고 다음줄로 넘어간다.
이 부분을 수정하여 분기되도록 해야한다.
2가지 방법을 이용해보았다.
1) 리턴값인 EAX의 값을 5로 바꾸는 방법
2) 연산 중간에 JMP코드를 수정하여 EAX와 ESI의 값이 같도록 연산하는 방법
401023으로 JMP하게 되면 (ESI+1), (EAX-2) 연산을 하기 때문에 0이었던 ESI는 1, 3이었던 EAX도 1이 되어 두 값이 같아진다.
값 변경 후 계속해서 코드를 진행하면 EAX=ESI이므로 40103D로 분기하여 다음과 같은 메시지박스를 띄운다.
+) 패치한 파일 저장
코드 변경 후 [마우스 우클릭 > Edit > Copy to executable] 후 뜬 창에서 [마우스 우클릭 > save file] 해서 '예' 클릭 후 파일명 변경하고 .exe파일로 저장해주면 된다.
기존 파일과 패치한 파일을 실행시켜 보았다.
_Challenges Basic RCE L02
L02. 패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겼다. 패스워드가 무엇인지 분석하시오
이 파일은 손상돼서 실행되지 않는다. 따라서 HxD에서 파일을 열어 어느 부분이 손상되었는지 바이너리 코드를 확인해본다.
L01에서 사용했던 ollydbg는 디버깅시키면서 분석하는 동적 도구이기 때문에 정적 도구 위주로 사용해 볼 것이다.
바이너리 코드를 보면 DOS header의 MZ(4550)은 있으나 그 외 PE header, signature나 DOS stub등 많은 부분이 손상된 것으로 보인다.
파일을 원상복구하기는 어려워 보여 확인할 수 있는 문자열 위주로 문제를 해결해본다.
다음은 프로그램에서 사용되는 API들로 보인다.
Nope, try a gain! 과 Yeah, you did it! 문자열이 나란히 있는 걸로 보아 이 부분에서 패스워드가 맞는지 확인 후 메시지박스를 출력하는 것으로 보인다.
따라서 패스워드는 JK3FJZh이라고 추측된다.
_Challenges Basic RCE L03
L03. 비주얼베이직에서 스트링 비교함수 이름은?
파일을 실행시켜 보면 다음과 같은 메시지박스가 뜬다.
ollydbg에서 파일을 열고 에러 메시지의 문자열을 단서로 하여 패스워드 비교 부분을 찾는다.
[우클릭 > search for > All referenced strings] 으로 문자열만 확인해 "Error ! Das Passwort ist falsch!" 문자열을 찾는다.
이 문자열 윗 줄에 "2G83G35Hs2"가 패스워드로 추측되고, 그 윗 줄의 문자열 "Danke, das passwort ist richting!"이 패스워드가 맞았을 때의 문자열 인 것 같다.
더블클릭으로 해당 주소로 갈 수 있다.
Arg1과 Arg2를 vbaStrCmp API를 통해 일치하는지 확인 후 패스워드가 맞았는지 출력하는 코드로 보인다.
따라서 vbaStrCmp이 비주얼 베이직의 스트링 비교 함수로 추측된다.
'Security > Reversing' 카테고리의 다른 글
[CodeEngn] Challenges Basic RCE L07, L08, L09 (0) | 2021.08.09 |
---|---|
[CodeEngn] Challenges Basic RCE L04, L05, L06 (0) | 2021.08.06 |
GDB 실습 1 (0) | 2021.05.16 |
GDB 사용법 (0) | 2021.05.05 |
Reversing Basic Challenge #2 (0) | 2021.04.25 |
댓글