[레나 튜토리얼] - 1

oogu ㅣ 2022. 7. 30. 18:55

reverseMe.exe 파일을 실행해 본다.

라이센스를 구매하라는 문자가 출력된다.

올리디버거에서 문자열 검색을 위해 따로 기록해 놓자

EXEinfoPE로 패킹 여부를 확인해 본다.

Not packed, 패킹이 안되어있다.

올리디버거에 올리고 F8 눌러 어디서 메시지 박스가 뜨는지 확인해 본다.

MessageBoxA 실행되고 ExitProcess 함수가 실행되어 프로그램이 종료되는 거 같 다.

MessageBoxA 인자값을 보면 exe 파일을 실행했을때 출력되는 메시지가 보인다.

프로그램에서 사용하는 문자열를 확인해 본다. 다행히 문자열 개수가 적다 ㅎㅎ

아래 성공했을 때 출력하는 문자열(You really did it ...)이 보인다.

해당 문자열이 있는 곳으로 이동해 본다.

라이센스를 구매하라는 MessageBoxA 함수 호출을 피하고 위 MessageBoxA(401205) 호출하면 될 거 같다!

라이센스 구매 강요 MessageBoxA 함수 호출 전 JNZ가 보인다. 이 부분을 JMP 401205 패치 해보자

패치를 하고 실행하면

성공 메시지를 가진 MessageBoxA 함수가 보인다! 

계속 실행하면 축하한다는 메시지를 볼 수 있다.

 

하지만 위에서 한 패치는 안좋은 패치 방법이다.

 

그 이유는 JMP 401205 패치를 하면 밑에 있는 MessageBoxA 함수 인자값들이 NOP로 일부분 덮여씌우기 된다. 

패치하기전 JNZ SHORT 는 2byte, JMP 401205 6byte 이기때문에 4byte가 덮여씌워져 인자값들이 사라진것이다.

이러면 기존 코드가 사라지게되어 파일이 실행이 안될 수 있다. 

 

실행이 안되도 되는 곳이라고 확신(1000%)되는 곳이 아니라면 기존 코드는 건드리지 않고 패치를 해야한다.

 

결론 다시 하자...

성공 함수를 보면 분기하는 곳이 존재한다.(빨간색 선) 즉, 주소를 덮여씌우지 않아도 성공 함수로 올 수 있다는 거다!

프로그램을 다시 실행하면서 성공 함수로 도달해 보자!

 

다시 분석을 하다보면 CreateFileA 함수가 보인다. 

CreateFileA 함수는 중요해서 구글에 CreateFileA msdn 검색 ㄱㄱ

파일을 만들거나 연다고 한다. 

함수를 검색하면 반환 값은 꼭 확인해야한다.

함수가 실패하면 INVALID_HANDLE_VALUE 값이라고 한다.

 

CreateFileA 함수에 대해 간단히 알아봤으니 CreateFileA 인자값을 확인해 보자.

코드에서 MODE가 OPEN_EXISTING이고 FileName이 keyfile.dat이다.

OPEN_EXISTING 인자는 파일이 존재해야 연다고한다. 따라서 keyfile.dat 파일이 있어야하는데

exe 파일만 있고  keyfile.dat 파일은 없어 CreateFileA 함수는 실패를 할 것이다.

함수를 실행하고 EAX 값을 확인해보면 FFFFFFFF 값이 들어가 있다. FFFFFFFF 은 -1을 의미한다. 따라서 함수가 실패했다.

바로 아래 CMP EAX, -1 실행되면 Z flag가 설정되어 JNZ에서 점프가 안돼서 라이센스 구매 강요 메시지가 뜬다.

CMP EAX, -1 값이 0 이므로 JNZ 를 JE 로 패치를 하고 실행하면 위 처럼 구매 강요 메시지 함수를 건너뛴다. ㅋ

구매 강요 메시지 함수를 건너가면 ReadFile 함수가 보인다. 이것도 검색 ㄱㄱ

파일을 읽는다.

아마 CreatefileA 함수에서 열린 파일에 내용을 ReadFile 함수가 가져오는거 같다.

함수가 실패하면 0이다.

CreatefileA 함수에서 파일를 가져오지 못 해서 ReadFile 함수 또한 실패를 할 것이다.

함수를 실행하고 EAX 값을 확인해 보면 0이다. 즉, 함수를 실패했다. 

TEST EAX,EAX 하면 0이기 때문에 다음에 나오는 JNZ에서 점프를 안한다. 그럼 JMP에서 강제 점프가 되는데 

JMP에 나오는 주소(004010F7)를 확인해 보겠다.

MessageBoxA 함수 인자값 텍스트를 확인해 보면 성공한 함수는 아닌거 같다. 따라서 여기로 점프를 하면 안된다.

JNZ 를 JE로 패치하여 JMP 문을 건너뛴다.

[402173] 값이랑 0x10 비교한다. 

[402173]에는 0x00 이 들어가 있다.

JL를 하면 점프가 되는데 점프되는 곳 주소를 확인해보면 Sorry 어쩌구가 있는 곳이라 점프하면 안된다.

JL -> JG 로 패치하여 점프를 건너뛴다.

아래 분기문이 많이 보이는데 주소에 가서 어떤 코드가 있는지 확인해 본다.

401205에 성공함수가 존재한다. JMP 00401205가 실행돼야 한다. 

ESI 값과 8를 비교하는데 ESI가 0 이므로 JL(실패 함수 위치)에서 점프가 된다.

JL 바로아래 성공 함수 위치로 JMP가 있어 JL -> JG  패치하고 실행해본다.

성공 함수로 점프가 되었다. 

패치한 내용은 재실행하면 초기화 되므로 패치 내용을 실행파일로 저장한다.

라이센스 구매 강요 메시지 대신 넌 했어! 어쩌구 메시지가 등장한다. ㅋ(성공)

'레나 튜토리얼' 카테고리의 다른 글

[레나 튜토리얼] - 3  (0) 2022.07.31
[레나 튜토리얼] - 2  (0) 2022.07.31
Ollydbg 패치  (0) 2022.07.30
Ollydbg 설명  (0) 2022.07.30
32_패킹&언패킹  (0) 2022.07.28