Lena's Reversing for Newbie 16 Write-Up
파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17
tuts4you.com
Tutorials Index: 16. Reversing using resources
사용도구: 올리디버거 2.01
Lena's Reversing for Newbie 16(이하 원본파일) 분석해보자.
16단계는 분석할 파일이 2개이다.
1. URLegal
2. movgear
튜토리얼 인덱스(Reversing using resources)에 맞게 리소스 편집기 eXeScope 프로그램으로 분석해보자.
첫 번째 URLegal 파일부터 분석해보자.
원본파일을 설치해주자.
URLegal 프로그램을 실행하면 위와 같은 모습이다. File - Register... 기능을 클릭해보자.
등록에 필요한 값은 Name, Code로 2개이다.
실패했을 때의 메시지 박스는 위와 같다.
프로그램을 종료하면 위와 같은 창이 뜬다. "I Will Register Soon" 버튼을 클릭하면 완전히 종료된다.
eXeScope 프로그램의 실행된 모습은 위와 같다. File - Open... 기능을 클릭하여 URLegal 프로그램을 읽어보자.
그러면 위와 같이 URLegal 프로그램이 사용하는 resource를 확인할 수 있다. 이 중 Dialog 메뉴클 살펴봐야 한다.
왜냐하면 [사진 1-6]에서 프로그램을 종료 시 떴던 창을 확인할 수 있었다. 이 창을 끄려면 "I Will Register Soon" 버튼을 클릭해야 한다.
즉, [사진 1-6]의 창은 사용자가 특정 버튼을 클릭하면 반응하는데 이와 관련된 API가 DialogBoxParam 함수이다. DialogBoxParam 함수에 대해서는 다음 링크르 참고하면 된다.
참고 링크: https://jade9reen.tistory.com/96
DialogBoxParamA Function
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-dialogboxparama DialogBoxParamA function (winuser.h) Creates a modal dialog box from a dialog box template resource. docs.micros..
jade9reen.tistory.com
왼쪽 Dialog 메뉴에서 숫자들이 있는데 이 숫자들은 DialogBoxParam의 lpTemplateName 인자가 나태는 대화상자 템플릿의 식별자 ID 값이다. 103번을 보면 프로그램 종료 시 나타나는 대화상자임을 알 수 있다. 즉, 이 대화상자를 제거해야 하는데 식별자 ID 값은 103번이고 16진수로 0x67 값이다.
올리디버거로 URLegal 프로그램을 실행한 뒤, code 섹션에서 우클릭 - Search for - Allcommands... 기능을 클릭하여 위와 같이 push 67 명령어를 검색해보자. 왜냐하면 [사진 1-9]에서 DialogBoxParam 함수에 사용할 lpTemplateName 인자로 0x67 값을 전달하는 것을 확인했다. 즉, 스택에 push 명령어로 인자 값 0x67을 저장할 것이다.
그러면 위와 같이 명령어 1개가 사용되고 있다.
해당 주소로 가면 바로 위에 함수 프롤로그를 수행하는데 이 루틴이 프로그램 종료 시 [사진 1-6]의 대화상자를 띄우는 루틴인지 확인하기 위해 브레이크 포인트를 설정하고 프로그램을 다시 실행하고 종료해보자.
위와 같이 브레이크 포인트에 의해 멈추는 것으로 보아 이 루틴이 프로그램 종료 시 보여지는 대화상자를 실행하는 루틴임을 알 수 있다. 그리고 위와 같이 0x004023C0 주소가 리턴주소이므로 해당 주소 직전의 명령어로 인해 이 루틴이 호출되었을 것이다.
리턴 주소를 살펴보면 0x004023BB 주소의 CALL 00401220 명령어에 의해 [사진 1-13]의 루틴이 호출되었음을 알 수 있다. 그리고 바로 위에 0x00403E18 함수를 호출하고 EAX 레지스터의 값에 따라 0x004023BB 명령어를 수행하지 않고 0x004023F6 주소로 점프하고 있다. 0x004023AA 주소에 브레이크 포인트를 설정하고 다시 프로그램을 실행하고 종료해보자.
그럼 위와 같이 0x00403E18 함수를 호출하기 전에 EAX 레지스터의 값이 0x1 값임을 알 수 있다. 함수 내부로 이동해보자.
내부 함수를 보면 0x00403E22 주소의 MOV EAX, DWORD PTR SS:[EAX+2C] 명령어에 의해 EAX 레지스터의 값이 0x0 값으로 변경된다. 따라서 이 명령어를 패치하면 된다.
위와 같이 NOP 명령어로 패치해주면 RETN 명령어 수행 시 EAX 레지스터의 값은 0x0 값이 아니게 된다.
그럼 위와 같이 File - Register... 기능이 비활성화되고 종료 시에도 대화상자는 보이지 않는다.
두 번째 movgear 파일을 분석해보자.
원본파일을 설치해주자.
movgear 프로그램을 실행하면 위와 같이 환영한다는 메시지 창이 뜬다.
Start from Scratch 버튼을 클릭하면 메인 프로그램이 시작된다.
메인 프로그램의 모습은 위와 같다. Help - Register Now... 기능을 클릭해보자.
등록을 위한 값으로 Name, Code 2개의 값이 필요하다.
실패했을 때의 메시지 창은 위와 같다.
프로그램 종료 시 위와 같은 창이 뜨고 30일 동안 사용이 가능하다는 내용이다.
마찬가지로 리소스 편집기 eXeScope 프로그램으로 분석해보자.
eXeScope 프로그램으로 movgear 프로그램을 읽어보자. 그리고 Dialog 메뉴의 100번이 [사진 2-7]에서 확인한 대화상자임을 알 수 있다. 즉, 이 대화상자를 제거해야 하는데 식별자 ID 값은 100번이고 16진수로 0x64 값이다.
올리디버거로 movgear 프로그램을 메인 화면이 나올 때까지 실행한 뒤, code 섹션에서 우클릭 - Search for - Allcommands... 기능을 클릭하여 위와 같이 push 64 명령어를 검색해보자.
PUSH 64 명령어가 여러 개 보이기 때문에 전부 브레이크 포인트를 설정해주자. 그리고 프로그램을 종료해보자.
그럼 위와 같이 0x00406725 주소에 멈추게 된다. 이 함수가 [사진 2-7]에서 확인한 대화상자를 띄우는 함수이다.
1번 프로그램과 마찬가지로 종료 시 대화상자를 실행하는 함수가 수행되기 전에 0x0040670B 주소의 CALL 00431650 명령어가 수행되고 EAX 레지스터의 값이 0x1 값이 아닐 때만 대화상자를 띄워준다.
따라서 0x0040670B 주소에 브레이크 포인트를 설정하고 프로그램을 다시 실행한 뒤 종료해보면 0x0040670B 주소에 멈추게 된다. 이 때 EAX 레지스터의 값은 0x0 값이다. 내부 함수로 이동해보자.
내부 함수에서 종료 직전 EBX 레지스터의 값을 EAX 레지스터에 복사하는데 EBX 레지스터의 값은 0xFFFFFFFF 값이다. 따라서 0x1 값이 아니기 때문에 [사진 2-12]에서 확인한 0x00406716 주소의 JE 명령어에 의해 점프하지 않는 것이다.
위와 같이 MOV EAX, EBX 명령어를 MOV AL, 1 명령어로 패치해주자.
그리고 프로그램을 실행해보면 Help - Register Now... 기능이 사라진 것을 알 수 있다.
Help - About GIF Movie Gear... 기능을 클릭해보면 등록되었다는 것도 확인할 수 있다.
'Wargame > Lena’s Reversing for Newbies' 카테고리의 다른 글
Lena's Reversing for Newbie 18 Write-Up (0) | 2019.08.09 |
---|---|
Lena's Reversing for Newbie 17 Write-Up (0) | 2019.08.08 |
Lena's Reversing for Newbie 15 Write-Up (0) | 2019.08.07 |
Lena's Reversing for Newbie 14 Write-Up (0) | 2019.08.07 |
Lena's Reversing for Newbie 13 Write-Up (0) | 2019.08.06 |