L01. HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가
GetDriveTypeA 함수는 디스크 드라이브가 이동식, 고정, CD-ROM, RAM 디스크 또는 네트워크 드라이브인지 확인하는 함수이다. 올리디버거에서 MessageBoxA 함수 살펴보면 출력 메시지 내용을 알 수 있다.
GetDriveTypeA 리턴값 보기 위해 GetDriveTypeA 함수까지만 실행한다. 그리고 EAX 레지스터 (리턴값)을 확인하면 리턴값이 3이라는 것을 알 수 있다.
EAX 레지스터가 3이라는 것은 드라이브에 고정 미디어가 있다는 의미이다. HDD를 CD-Rom으로 인식시키기 위해서는 리턴 값이 5여야 한다.
Eax는 dec(-1 해준다)를 두 번 거치면서 0000001이 되고 esi는 inc(+1 해준다)를 세 번 거치면서 0000003이 된다. Eax와 esi 리턴값이 같지 않으면 “error”가 발생한다. 같을 경우 “YEAH!” 문구가 뜨면서 성공하게 된다. cmp문을 통해 eax와 esi 값이 같으면 0 즉 제로 플래그가 1이 되도록 만들어준다. JE 명령어는 제로 플래그 값이 0이면 다음 명령을 실행하고 1이면 지정한 주소로 점프한다. 제로 플래그가 1이 아닌 경우 JE를 실행시켜주지 못해 오류발생 문구인 “error”발생하면서 실패하게 된다.
따라서 Eax와 esi 값이 같게 하려면 GetDriveTypeA를 실행했을 때 eax 값에 2를 더해준다.
그리고 그 상태에서 ESI 부분이 401000이기 때문에 ESI도 0으로 수정하여 CMP EAX, ESI 부분이 제대로 실행되도록 한다.
그렇게 하면 CMP EAX, ESI에서 EAX와 ESI의 값이 3으로 같아진다.
결과적으로 점프에 성공하여 CD-Rom가 맞다는 메시지가 출력된다.
L02. 패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겼다. 패스워드가 무엇인지 분석하시오
우선 첨부된 파일을 실행해보았다.
이와 같은 화면이 출력되면서 파일을 실행할 수 없었다. 이에, Ollydbg에서 실행하고자 하였으나, 이곳에서도 파일을 열 수 없다는 팝업창이 뜨면서 실행할 수 없었다. 그래서 HxD에서 열어보았다.
이와 같은 화면이 출력되면서 파일을 열 수 있었다. 파일을 아래로 내리면서 훑어보니 아래와 같은 내용이 있었다.
Crack me 뒤에 패스워드가 쓰인 것을 알 수 있다. 패스워드 JK3FJZh를 정답 창에 입력해보니 아래와 같은 결과가 나오면서 성공하였다.
L03. 비주얼베이직에서 스트링 비교함수 이름은?
03.exe를 실행하면 뜨는 실행화면이다. 확인을 누르면 CrackMe 프로그램이 실행된다.
임의의 값을 입력하고 Registreren(등록) 버튼을 클릭하면 패스워드가 잘못되었다고 뜬다.
API 호출방법인 올리디버거에서 실행시켜 4개의 창 중 좌측 상단 화면에 오른쪽 버튼 – Search for – All intermodular calls을 클릭해서 스트링 비교 함수 찾는다(strcmp)
더블 클릭해서 입력 받은 세줄의 코드 해석하기
00402A27 – [EBP-58]에서 4byte를 읽어들여 stack에 push
00402A2A – 2G83G35Hs2 를 stack에 push
00402A2F – push한 두개 스트링 비교
2G83G35Hs2를 Regcode에 입력했더니 성공
문제는 ‘비주일베이직에서 스트링 비교함수 이름이 무엇인가?’였다. 유니코드 값을 찾았을 때 2개가 존재했었는데, 아래에 위치했던 유니코드 값이 있는 코드로 가보니 아래와 같은 코드가 작성되어 있었다.
해당 PUSH문 아래에 CALL이 있음을 확인할 수 있었다. 여기서 vba가 비주얼베이직이므로 비주얼베이직에서 스트링을 비교하는 함수가 vbaStrCmp임을 확인할 수 있다. 해당 함수이름을 정답 창에 입력해보니 아래와 같은 화면이 나오면서 성공하였다.
L04. 이 프로그램은 디버거 프로그램을 탐지하는 기능을 갖고 있다. 디버거를 탐지하는 함수의 이름은 무엇인가
04.exe를 실행하면 정상이라는 문자열이 출력된다.
04.exe를 올리디버거에 실행하면 ‘디버깅 당함’이라는 출력 값으로 바뀐다.
프로그램을 F8을 이용해 실행하다 보면 00408454 위치에서 탐지하는 것을 확인. 그래서 F7을 눌러 코드 내부에 들어가서 살펴보았더니‘IsDebuggerPresent’ 라는 수상한 함수 발견. IsDebuggerPresent – 호출 프로세스가 사용자 모드 디버거에 의해 디버깅 되는지 여부를 확인한다. 현재 프로세스가 디버거 컨텍스트에서 실행중인 경우 반환 값은 0이 아니다. 현재프로세스가 디버거 컨텍스트에서 실행되고 있지 않으면반환 값은 0이다.
이 함수를 사용하면 응용 프로그램이 디버깅 중인지 여부를 결정하여 동작을 수정 가능.
IsDebuggerPresent() 함수는 디버깅을 당하면 1을 리턴. 문제에서 IsDebuggerPresent 부분이 실행되었을 때 eax 리턴 값이 1로 변환되는 것을 보고 디버깅 당한 것을 알 수 있었다.
우회하는 방법(안티 디버깅)으로 eax 값을 0으로 바꿔준다.
Eax 값을 0으로 바꿔주면 ‘정상’으로 바뀐다.
'2. Reversing (리버싱) > 1) Write UP' 카테고리의 다른 글
[2020.10.10]CodeEngn Challenges Basic RCE L09 ~ L12 라이트업 (0) | 2020.10.10 |
---|---|
[2020.09.26] CodeEngn Challenges Basic RCE 라이트업 L05 ~ L08 (0) | 2020.09.26 |
[2020.06.16] 리버싱 핵심원리 | Hello World 문제 (0) | 2020.07.02 |
[2020.06.16] Reversing.kr | Position 문제 (0) | 2020.07.01 |
[2020.06.02] Reversing.kr | Replace 문제 (0) | 2020.06.02 |