Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

White Security

Lena's Reversing 10강 분석 본문

Reversing

Lena's Reversing 10강 분석

POSIX 2019. 2. 14. 15:32


레나의 리버싱 10강 분석 포스팅입니다.


Lenas_Reversing_10.zip


바이너리는 이곳에서 받아보실 수 있는데

링크 사용이 되지 않는다면

위 첨부파일을 이용하시면 되겠습니다.


만약 프로그램 실행시에

MSVBVM50.DLL 관련 오류가 발생한다면

동봉된 프로그램을 사용하시기 바랍니다.



프로그램을 실행하면 Nag Screen 이라는 이름으로

알림 메시지가 하나 뜹니다.


모든 Nag(잔소리)를 제거하고

올바른 인증 코드를 찾아내라는 것인데요.



프로그램을 확인하면

Register me!와 Nag 2개의 버튼이 존재합니다.



첫번째 Register me! 버튼을 눌러보면

인증 키가 잘못되었다고 알려주는데요.



두번째 Nag 버튼을 눌러보면

처음에 나온 내용과 완전히 동일한 메시지가 등장합니다.

아무래도 이 알림을 Nag 라고 하는 것 같습니다.


따라서 문제가 요구하는 것은

첫번쨰로 인증키를 찾아 인증에 성공하고

Nag 버튼을 눌러도 알림창이

뜨지 않도록 하는 것이 되겠군요.



인증 함수의 빠른 탐색을 위해서

우클릭 > Search for > All referenced text strings

를 사용해, 참조 문자열들을 확인합니다.


그 중, 인증 실패시에 보였던

"Sorry! Wrong registration code!" 메시지가 보이니

더블클릭하여 주소를 따라가면 되겠습니다.



찾아낸 주소에서 위로 쭉 올려보면

베이스 포인터를 교환하는 전형적인

함수 시작 구문이 등장하는데요.


따라서 이 곳이 Register me!

클릭 이벤트 함수가 되겠습니다.



조금 내려가보면 호출되는 함수 중

vbaStrCmp 라는 함수가 눈에 띕니다.


실제 코드와, 사용자가 입력한 코드를 비교하는 데에

문자열 비교 함수가 들어가겠지요?


여기가 만약 코드 비교 함수라면

사용자 입력 코드와 실제 코드가

인자로 들어갈 것이라 생각해 볼 수 있습니다.



따라서 코드를 입력하고

버튼을 클릭해 다시금 함수를 호출해주면

확실히 코드를 인증하는 부분임이 확실한 것 같습니다.


그럼 비교대상 문자열인 "I'mlena151" 가

올바른 코드겠군요.



따라서 찾아낸 코드를 입력하고

인증 버튼을 눌러주면, 성공 메시지를 볼 수 있습니다.



Nag 알림 메시지를 제거할 차례입니다.

다시 참조 문자열을 확인합니다.



Nag 메시지의 제목이었던 "Nag Screen"

문자열을 따라가면

Nag 버튼의 클릭 이벤트 함수를 확인할 수 있습니다.



그리고 조금씩 내려가다보면

402CFE 에서 함수를 호출하고

Nag 메시지가 뜨는데요.



브레이크 포인트를 걸고 해당 주소로

들어가보면, rtcMsgBox 함수를 호출하고 있습니다.


따라서 여기가 에러 메시지를

호출하는 부분임을 알 수 있지요.



그럼 에러 메시지를 발생시키지 않으려면

어떻게 해야 할까요?


rtcMsgBox 만 호출되지 않는다면

메시지가 발생하지 않겠죠.



따라서 해당 호출문을 삭제해 주면 되는데

앞뒤 고려하지 않고 없애면

메시지야 당연히 안 나오겠지만, 오류가 발생하며

예기치 못한 동작을 야기할 것입니다.


따라서 직후에 vbaVarMove 함수를 호출하는 데에

EAX 값이 쓰인다는 것을 고려해

본래 rtcMsgBox 함수가 리턴했던 값을

수동으로 EAX에 넣어주면 되겠습니다.


확인결과 1을 리턴하고 있었으니

MOV 명령어를 이용해 EAX에 1을 넣어 주었습니다.



비주얼 베이직은 stdcall 호출규약을 따라

호출당하는 쪽이 스택을 정리하여 리턴합니다.


따라서 PUSH 2개 중, 1개를 POP 으로 변경하여

ESP 값에 변화가 없도록 해 주면

별 문제 없이 Nag 메시지가 발생하는 것을 막을 수 있습니다.



거슬러 올라가 함수의 발생을 원천적으로

막는 방법도 존재합니다.


함수의 첫 부분에서 바로 RETN 해주면

아무것도 실행되지 않은채로 함수가 끝나게 되는데


이 방법을 사용하려면

함수에 주어지는 인자의 크기를 알아야만 합니다.


만약 4바이트가 인자로 주어졌다면

RETN 4 와 같이 수정해 주면 되겠지요.



그런데 함수의 인자 개수를 어떻게 알 수 있을까요?

함수를 호출하면, 리턴시

돌아갈 주소를 스택에 보관하기 때문에


브레이크 포인트를 걸어주고

호출된 당시의 스택을 확인하면 됩니다.


위 사진을 보면

리턴 주소가 740DE5A9 라는 것을 알 수 있습니다.




해당 주소를 따라가보면 직전의

740DE5A9 주소에서 이벤트 함수를

호출했다는 것을 알 수 있습니다.


따라서 해당 줄에 브레이크 포인트를 걸어주고

호출되는 EAX 주소를 확인해 봅시다.



402649 주소가 호출되고 있군요.

해당 주소를 확인해 보면



ESP 에 영향을 주지 않은채로

바로 클릭 이벤트 함수로 점프합니다.



따라서 호출하기 직전, 직후에

모두 브레이크 포인트를 걸어주고

ESP 의 주소를 비교하면

인자의 크기를 알 수 있겠습니다.



호출된 후에, ESP 가 4만큼 줄었으므로

인자의 크기가 4바이트 라는 것을 알 수 있습니다.


따라서 함수의 시작 부분을

RETN 4 라고 변경해주면

깔끔하게 Nag 메시지를 제거할 수 있는 것입니다.




'Reversing' 카테고리의 다른 글

abex' crackme 2 분석  (0) 2019.02.13
abex' crackme 1 분석  (0) 2019.02.11
Comments