Lena Reversing - tutorial 13
Lena Reversing tutorial 13
이번 단계는 Window API를 활용한 디버깅을 하는 것이 목적이다.
이번 프로그램도 이전과 같이 register 하는 것이 들어가 있는데
이처럼 프로그램 등록과 관련된 API들을 우선 살펴본다.
1. DialogBoxes
-DialogBoxParamA
-GetDlgItem
-GetDlgItemInt
-GetDlgItemTextA
-GetDlgItemTextA
-GetWindowTextA
-GetWindowWord
2. MessageBoxes
-MessageBeep
-MessageBoxA
-MessageBoxExA
-SendMessageA
-SendDlgItemMessageA
3. Registry Access
-RegCreateKeyA
-RegDeleteKeyA
-RegQueryValueA
-RegQueryValueExA
-RegCloseKeyA
-RegOpenKeyA
4. Read/Write File
-ReadFile
-WriteFile
-CreateFileA
5. Reading data from (*.ini)
-GetPrivateProfileStringA
-GetPrivateProfileIntA
-WritePrivateProfileStringA
6. Strings
---------------
-LoadStringA
-lstrcmpA
-MultiByteToWideChar
-WideCharToMultiByte
-wsprintfA
7. Time and Date
-GetFileTime
-GetLocalTime
-GetSystemTime
-GetSystemTimeAsFileTime
-SetTimer
-SystemTimeToFileTime
8. window
-CreateWindowExA
-ShowWindow
-UpdateWindow
9. MessageBoxText
-SendDlgItemMessageA
-SendMessageA
-SetDlgItemTextA
-SetWindowTextA
이제 프로그램을 설치 후 실행해준다.
About 탭을 누르면 다음과 같이 나온다.
등록되지 않았다고 나온다.
우측하단의 Enter Registration Code를 눌러준다.
다음과 같이 입력창이 나온다.
아무 값이나 넣고 OK버튼을 누르면 다음과 같이 창이 뜬다.
유추해보면 사용자의 입력값을 받아 검사하고 있기 때문에 이와 관련된 API를 사용할 것으로 판단된다.
여러가지 API가 있지만 getWindowTextA를 살펴본다.
나오지 않으면 다른 API들도 살펴볼 필요가 있다.
Control + N을 눌러 Name in current module을 켠 뒤 getWindowTextA를 찾아준다.
오른쪽 마우스를 눌러 set breakpoint on every reference를 눌러준다.
3개의 breakpoint가 걸린다.
F9를 눌러 프로그램을 실행시킨다.
프로그램이 실행되기도 전에 break가 걸린다.
프로그램이 실행되기도 전에 걸린 부분이라 중요하지 않기 때문에 breakpoint를 해제한다.
다시 진행해준다.
다음과 같은 부분에 break가 걸린다.
스택창과 함께 자세히 살펴보면 어딘가로부터 문자열을 가져와 Buffer에 저장하고 있다.
Count = 6 이라는 것도 보이는데 이는 입력값의 6글자만 가져오는 것으로 보인다.
이제 F8을 눌러가며 진행한다.
진행하다보면 code로 넣었던 12345와 67890을 가져오는 것이 보인다.
계속 진행하다 보면 다음과 같은 부분이 나온다.
아래쪽에는 똑같은 내용이 또 한 번 나온다.
AL 값이 1이라면 성공했다는 문자열이 있는 곳으로 분기하게 된다.
0041745E 주소의 CALL 내부로 들어간다.
중간에 다음과 같은 비교문이 나온다.
값을 비교하고 있는데 EDX-8의 주소에 있는 값은 0xB가 나온다. 이는 code로 입력한 값의 길이이다.
길이를 비교하는 것으로 보인다. 분기문을 NOP으로 바꾸어준다.
쭉 진행하다보면 JNZ 분기문이 여러개 보인다. 윗쪽에 3개 아래쪽에 1개가 존재한다.
모두 같은 주소로 분기하게 되는데 이 주소로 가 보면 마지막에 AL의 값을 XOR 시켜 0으로 만들고 리턴한다.
따라서 이 분기문을 따라가지 않도록 모두 NOP 처리를 해주도록 한다.
이후 진행시키면 성공적으로 등록이 되었다고 나온다.
그렇지만 프로그램에는 여전히 다음과 같은 문구가 남아있다.
search for -> All referenced text string 으로 가서 해당 문자열을 검색해준다.
AL의 값을 통해 분기문이 결정되고 두가지 경우로 나뉘게 된다.
CALL 내부로 들어가준다.
진행하다보면 RETN 전에 MOV AL, BL 이 보인다.
이를 MOV AL, 1로 변경하여 AL 레지스터의 값을 항상 1로 바꾸어준다.
변경 후 진행시키면 등록 되었다는 문자열로 변한 것을 확인 할 수 있다.
끝.