Lena's Reversing for Newbie 07 Write-Up
파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17
Downloads / Lenas Reversing for Newbies - Tuts 4 You
tuts4you.com
Tutorials 07. Intermediate level patching, Kanal in PEiD
사용도구: 올리디버거 2.01
Lena's Reversing for Newbie 07(이하 원본파일) 분석해보자.
원본파일을 실행하면 위와 같은 창이 뜬다. About 버튼을 클릭해보자.
프로그램에 대한 설명이 나오는데, 우측 하단의 Register 버튼을 클릭해보자.
이메일과 라이센스 넘버를 입력하여 등록할 수 있는데 실패하면 위와 같은 "You have entered ~~" 문자열과 함께 메시지 박스가 뜬다.
code 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 사용되는 문자열을 확인할 수 있다. "You have entered" 문자열을 검색해보자.
위와 같이 문자열이 사용되는 곳이 확인된다.
문자열을 스택에 넣기 전에 JNZ 명령어로 점프하는 부분이 있는데, 이 곳을 JMP 명령어로 무조건 점프하게 패치를 해보자.
그러면 위와 같이 "Thank you for registering!" 문자열과 함께 메시지 박스가 뜬다. 그런데 창만 뜨고 정품 등록할 수 있는 뭔가가 뜨지 않는다.
다른 방법으로 패치를 해봐야 한다. 문자열이 사용되는 루틴의 윗 부분을 보면 0x004860C8, 0x004040B6, 0x0040714C 3개의 함수를 호출하는데, 맨 위쪽 2개 함수는 별 의미 없는 함수들이고 0x0040714C 함수는 호출 전에 스택에 입력한 이메일과 라이센스 넘버를 저장한다. 따라서 0x0040714C 함수 이 부분을 상세 분석해보자.
0x0040714C 함수 내부로 들어가면 바로 0x00406FD1 함수를 호출하는데, 호출하기 전에 스택에 이메일과 라이센스 넘버를 저장한다.
함수를 호출하면 EAX 레지스터에는 0x0 값이 저장된다. 그리고 AL 레지스터를 TEST 연산한다.
그리고 AL 레지스터의 값이 0x0이기 때문에 0x00407163 주소의 JNZ 명령어로 점프하지 않고 0x0040701D 함수가 호출된다. 이 때도 마찬가지로 이메일과 라이센스 넘버를 스택에 저장한다.
함수를 호출하면 EAX 레지스터에는 0x0 값이 저장된다. 그리고 AL 레지스터를 TEST 연산한다.
그리고 AL 레지스터의 값 0x0을 메모리의 0x005076A0, 0x005076A2 주소에 저장하고 0x00407069 주소로 점프한다.
그리고 메모리의 0x005076A1 값과 0x0을 비교한 후 다르면 0x00407122 값으로 점프한다.
0x00407122 주소로 점프하면 위와 같이 라이센스 등록을 실패한다. [사진 15]에서 AL 레지스터의 값을 메모리에 저장하고 메모리의 값을 비교하여 라이센스 등록 성공 여부를 결정하는데, 아직 AL 레지스터의 값이 어디서 결정되는지 모르기 때문에 처음부터 자세하게 다시 분석해야 한다.
[사진 9]에서 확인했던 0x00406FD1 함수부터 분석해보면, 위와 같이 함수 4개를 호출한다. 위의 2개 함수는 신경쓰지 않아도 된다. 0x00406F4B 함수를 호출할 때 스택에 이메일과 라이센스 넘버를 저장한다.
함수를 호출하고 나면 EAX 레지스터의 값은 0x0이 된다.
그리고 0x00407009 주소의 명령어 MOV BL, AL에 의해서 BL 레지스터의 값도 0x0이 된다.
그 다음, 0x00401148 함수를 호출하는데 함수 호출 결과 EAX 레지스터의 값은 0x1이 된다.
하지만, 0x00407011 주소의 명령어 MOV AL, BL에 의해 AL 레지스터의 값은 다시 0x0이 된다.
0x00406FD1 함수가 종료되면 위와 같이 AL 레지스터를 TEST 연산한 후 메모리의 0x005076A0 주소에 값을 저장하고 라이센스 등록은 실패한다. 따라서 0x00406FD1 함수가 종료되기 전에 AL 레지스터의 값이 0x1이 되도록 패치해야 한다.
0x00406FD1 함수가 종료되기 직전에 BL 레지스터의 값을 AL 레지스터에 저장한다.
위와 같이 패치하면 BL 레지스터의 값에 상관없이 AL 레지스터에는 항상 0x1 값이 저장된다.
0x00406FD1 함수가 종료되면 0x00407163 주소의 명령어 JNZ SHORT 00407180에 의해 점프하는데, AL 레지스터의 값이 0x1이기 때문에 무조건 점프한다.
그리고 위 코드로 이동하는데, 메모리의 0x005076A1 주소의 값과 0x0을 비교하는데, 큰 의미는 없고 0x00407122 주소로 점프한다.
결국 위 코드로 이동하는데, AL 레지스터의 값이 0x0이 아니기 때문에 0x004299F1 주소로 점프한다.
그러면 [사진 7]에서 확인했던 라이센스 등록 성공 메시지 박스가 뜨고 추가적으로 위와 같이 다운로드를 제공하는 메시지 박스를 확인할 수 있다.
'Wargame > Lena’s Reversing for Newbies' 카테고리의 다른 글
Lena's Reversing for Newbie 09 Write-Up (0) | 2019.08.06 |
---|---|
Lena's Reversing for Newbie 08 Write-Up (0) | 2019.08.05 |
Lena's Reversing for Newbie 06 Write-Up (0) | 2019.08.05 |
Lena's Reversing for Newbie 05 Write-Up (0) | 2019.08.05 |
Lena's Reversing for Newbie 04 Write-Up (0) | 2019.08.05 |