리버싱 핵심원리(소위 나뭇잎책)에서의 레나 리버스미 문제 풀이를 책을 따라가 보며 풀어보았다. 분석은 책에서 쓰인 올리디버거를 사용하였다.
Tut.ReverseMe1 문제는
처음에 Nag Screen이라는 박스가 뜨고 확인을 누르면 다음 창이 뜬다.
이게 다음 창인데, 여기서 Regcode를 맞춰서 Register me 버튼을 누르는 비밀번호 문제인 것 같다.
Nag Screen 메시지창의 뜻은 모든 Nag?를 삭제(무시)시키고 올바른 registration code를 찾아라는 뜻이다.
메인 창에서도 Nag?버튼을 누르면 다시금 Nag Screen창이 뜨게 된다.
우선 책도 그렇고 문제에서 요구하는 것도 그렇고 Nag창을 없애기 위해 Nag창 부터 찾아봐야겠다.
버튼들이 있는 윈도우 폼인것을 봤을 때 버튼을 눌렀을 때 행동하게 되는 버튼 리스너 등의 처리가 있을 것이다.
Nag?버튼을 눌렀을 때 Nag메시지 창이 떴던 것을 생각하면, 어떤 메시지 박스를 띄우게 하는 함수들이 있을 것이다.
Search for - All intermodular calls 에서 찾아보았다.
모듈 Tut.ReverseMe1의 함수 콜 목록에서 rtcMsgBox함수를 호출하는 곳이 4군데 보인다.
4군데 다 bp를 걸어두고 Nag? 버튼을 눌러보자
bp를 건 곳중에 한군데에서 걸렸다. 이 어셈이 있는 곳에서 Nag 메시지 박스를 띄우게 하는 내용들이 있을 것이다.
좀 위를 봐보자.
Nag 메시지 창에서 보았던 문자열 내용들이 있다. 이곳이 Nag 메시지를 띄우는 곳인것을 확정할 수 있다.
좀 더 올려보면
이곳 자체도 함수로 되어있는 것을 볼 수 있다.
단순히 Nag메시지 박스를 띄우지 않게 하려면 rtcMsgBox함수를 호출하지 않게 하면 된다.
함수 호출 부분을 다시 보면, 함수 호출 이후 스택을 따로 정리하지 않는 모습을 볼 수 있다. 이를 보면 함수의 호출 규약은 stdcall방식인 것을 볼 수 있다.
그럼 단순히 함수 호출 부분을 nop로 바꾼 것으로는 스택이 정리되지 않아 실행 도중 오류가 날 것이다.
stdcall방식에서 스택을 정리하는 방법은 호출된 함수가 함수 내에서 스택을 정리하고 리턴하는 것인데, 그 때의 정리가 esp에 매개 변수들의 총 크기를 더하며 스택을 복구하게 된다.
ret 크기 명령어를 통해
add esp, 크기
ret
를 함축된 명령어로 사용이 가능하고, 크기만큼 스택이 정리되고 함수를 나오게 된다.
그럼 rtcMsgBox의 인자 크기가 몇이 되는지 ctrl + f9(Execute Until Return)을 통해 확인해 보자.
MsgBox함수를 호출하는 곳에서 f7을 통해 함수로 들어간 뒤,
ctrl + f9를 누르게 되면 프로그램에서 메시지 박스가 뜨게 된다.
메시지박스에서 확인을 누르게 되면 리턴하는 곳까지 실행되며 멈추게 되고, 우리가 원하는 리턴 크기를 알 수 있게 된다.
retn 14에서 멈췄는데, rtcMsgBox 함수의 인자 크기는 14인 것으로 확인이 되었다.
그럼 이걸 통해 스택을 정리하는 것으로 패치시켜보자.

이 부분을,
이렇게 바꾸고 실행시켜 보았다.
Nag메시지 창은 뜨지 않지만 실행에 오류가 있는 것을 볼 수 있다.
그 이유는, 함수를 사용하고 난 뒤에 호출식 이후의 식에서
Eax의 값을 ebp - 9c의 위치에 값을 복사하게 되는데, Eax 레지스터는 보통 함수의 리턴값이 저장되게 된다.
함수를 실행하지 않게만 바꾼다면 함수의 리턴값이 저장된 Eax레지스터의 값을 정확히 처리하지 못하게 되어 실행오류가 나게 된다.
그렇다면, 책에서 따라가는대로 rtcMsgBox함수를 호출하는 이 상위 함수 자체를 부르지 않게 하거나, 이 함수를 무시하게 해 보자.
쭉 올려서, 함수의 프롤로그가 있는 곳을 책과 거의 유사하게 바꿨다.
실행되자 마자 리턴을 하게 될 것이다. leave를 통해 리턴 값의 인자 크기를 알아서 정리해주고 retn하게 된다.
이제 패치시킨 내용을 바탕으로 다시 Nag?버튼을 눌러보았다.
몇 번을 눌러도 Nag Screen 메시지 창이 뜨지 않는 것을 볼 수 있다.
Tut.ReverseMe1 문제는
처음에 Nag Screen이라는 박스가 뜨고 확인을 누르면 다음 창이 뜬다.
이게 다음 창인데, 여기서 Regcode를 맞춰서 Register me 버튼을 누르는 비밀번호 문제인 것 같다.
Nag Screen 메시지창의 뜻은 모든 Nag?를 삭제(무시)시키고 올바른 registration code를 찾아라는 뜻이다.
메인 창에서도 Nag?버튼을 누르면 다시금 Nag Screen창이 뜨게 된다.
우선 책도 그렇고 문제에서 요구하는 것도 그렇고 Nag창을 없애기 위해 Nag창 부터 찾아봐야겠다.
버튼들이 있는 윈도우 폼인것을 봤을 때 버튼을 눌렀을 때 행동하게 되는 버튼 리스너 등의 처리가 있을 것이다.
Nag?버튼을 눌렀을 때 Nag메시지 창이 떴던 것을 생각하면, 어떤 메시지 박스를 띄우게 하는 함수들이 있을 것이다.
Search for - All intermodular calls 에서 찾아보았다.
모듈 Tut.ReverseMe1의 함수 콜 목록에서 rtcMsgBox함수를 호출하는 곳이 4군데 보인다.
4군데 다 bp를 걸어두고 Nag? 버튼을 눌러보자
bp를 건 곳중에 한군데에서 걸렸다. 이 어셈이 있는 곳에서 Nag 메시지 박스를 띄우게 하는 내용들이 있을 것이다.
좀 위를 봐보자.
Nag 메시지 창에서 보았던 문자열 내용들이 있다. 이곳이 Nag 메시지를 띄우는 곳인것을 확정할 수 있다.
좀 더 올려보면
이곳 자체도 함수로 되어있는 것을 볼 수 있다.
단순히 Nag메시지 박스를 띄우지 않게 하려면 rtcMsgBox함수를 호출하지 않게 하면 된다.
함수 호출 부분을 다시 보면, 함수 호출 이후 스택을 따로 정리하지 않는 모습을 볼 수 있다. 이를 보면 함수의 호출 규약은 stdcall방식인 것을 볼 수 있다.
그럼 단순히 함수 호출 부분을 nop로 바꾼 것으로는 스택이 정리되지 않아 실행 도중 오류가 날 것이다.
stdcall방식에서 스택을 정리하는 방법은 호출된 함수가 함수 내에서 스택을 정리하고 리턴하는 것인데, 그 때의 정리가 esp에 매개 변수들의 총 크기를 더하며 스택을 복구하게 된다.
ret 크기 명령어를 통해
add esp, 크기
ret
를 함축된 명령어로 사용이 가능하고, 크기만큼 스택이 정리되고 함수를 나오게 된다.
그럼 rtcMsgBox의 인자 크기가 몇이 되는지 ctrl + f9(Execute Until Return)을 통해 확인해 보자.
MsgBox함수를 호출하는 곳에서 f7을 통해 함수로 들어간 뒤,
ctrl + f9를 누르게 되면 프로그램에서 메시지 박스가 뜨게 된다.
메시지박스에서 확인을 누르게 되면 리턴하는 곳까지 실행되며 멈추게 되고, 우리가 원하는 리턴 크기를 알 수 있게 된다.
retn 14에서 멈췄는데, rtcMsgBox 함수의 인자 크기는 14인 것으로 확인이 되었다.
그럼 이걸 통해 스택을 정리하는 것으로 패치시켜보자.
이 부분을,
이렇게 바꾸고 실행시켜 보았다.
Nag메시지 창은 뜨지 않지만 실행에 오류가 있는 것을 볼 수 있다.
그 이유는, 함수를 사용하고 난 뒤에 호출식 이후의 식에서
Eax의 값을 ebp - 9c의 위치에 값을 복사하게 되는데, Eax 레지스터는 보통 함수의 리턴값이 저장되게 된다.
함수를 실행하지 않게만 바꾼다면 함수의 리턴값이 저장된 Eax레지스터의 값을 정확히 처리하지 못하게 되어 실행오류가 나게 된다.
그렇다면, 책에서 따라가는대로 rtcMsgBox함수를 호출하는 이 상위 함수 자체를 부르지 않게 하거나, 이 함수를 무시하게 해 보자.
쭉 올려서, 함수의 프롤로그가 있는 곳을 책과 거의 유사하게 바꿨다.
실행되자 마자 리턴을 하게 될 것이다. leave를 통해 리턴 값의 인자 크기를 알아서 정리해주고 retn하게 된다.
이제 패치시킨 내용을 바탕으로 다시 Nag?버튼을 눌러보았다.
몇 번을 눌러도 Nag Screen 메시지 창이 뜨지 않는 것을 볼 수 있다.
'리버스 엔지니어링' 카테고리의 다른 글
crackmes.one 크랙미 3개 풀이 (0) | 2020.07.01 |
---|---|
레나 리버싱 Tut.ReverseMe1 풀이 2 (0) | 2020.07.01 |
리버싱kr easy_unpackme 풀이 (0) | 2020.07.01 |
리버싱kr easy_Keygen 풀이 2 (0) | 2020.07.01 |
리버싱kr easy_Keygen 풀이 1 (0) | 2020.07.01 |