반응형
반응형

 

Write-up 쓴 날짜 : 2022-09-28 18:53

 

MrBills.exe
1.14MB
patched_MrBills.exe
1.14MB

 

목적

- 레지스터 값을 변경하여 라이센스를 우회한다.

 

주제 - Intermediate level patching, Kanal in PEiD 

 


분석 1

 

 

이번 프로그램은 C++로 만들어졌다.

 

 

 

맨 처음 실행하면 위와 같이 Tip이 나온다.

 

그리고 프로그램 타이틀에 [Unregistered]이 있다.

 

이 프로그램은 뭔가 Scan 하는 프로그램인가 보다

 

 

About 메뉴를 누르니 위와 같이 나오고

 

 

Register 버튼을 누르니 위와 같이 이메일과 라이센스 번호를 입력하라고 한다.

 

 

임시로 값들을 입력하면 위와 같이 Register Now 버튼을 누를 수 있게 되는데

 

Register Now 등록 버튼을 누르면 위와 같이 문자열이 뜬다.

 


분석 2

 

 

위와 같이 디버거에서 문자열 검색을 하면 4299BD 주소에서 참조한다고 한다.

 

 

4299BD 주소로 가보면 위와 같이 4299B9 주소에서 조건 분기를 하는데

 

같지 않으면 4299F1 주소로 점프하여 "Thank you for registering!" 문자열을 띄우고

 

같으면 이전에 봤던 "You have entered an invalid email address or license ~~" 문자열을 띄운다.

 

4299B9 주소에서 조건 분기 하기 때문에 BP를 건다.

 

 

4299B9 주소에서 어떤 것에 의해 점프를 하게 되는지 4299B9 주소 윗 부분을 보면

 

스택에서 ecx의 값을 빼고, ebx를 0으로 만든 뒤

eax 레지스터의 8bit를 and 연산하여 플래그 레지스터에 영향을 주고

또 ecx의 값을 빼고 ebx를 0으로 만든다.

 

위에서 사실상 의미 있는 건 test al, al 명령어이다.

 

나머지는 의미없이 하는 명령어로 없어도 프로그램 동작에 딱히 영향이 가지 않는다.

 

그렇다면 eax 레지스터를 and 연산하는데 이때 eax에 들어있는 값은 4299AD 주소에서 호출하는 함수의 반환값일 것이다.

 

4299AD 주소에 BP를 걸고 Ctrl + F2 키로 재실행하여 F9로 실행한다.

 

 

email과 license를 위와 같이 임시로 적고 Register Now를 누른다.

(email 부분에 email 형식대로 적어준 이유는 email 형식이 아니면 다른 부분으로 가서 프로그램이 다르게 동작할 수 있기 때문이다.)

 

 

Register Now 버튼을 누르면 위와 같이 4299AD 주소에서 멈춘다.

 

 

4299AD 주소의 call 명령을 더블 클릭해서 내부를 미리본다.

(F7을 눌러 함수 내부로 들어오면 EIP를 움직여서 들어온 것이지만, 더블 클릭은 미리보기 처럼 EIP를 움직이지 않고 볼 수 있다.)

(이전 어셈블리어 화면으로 돌아가려면 ' - '  대쉬를 누르면 갈 수 있다.)

 

함수의 마지막 return 부분을 보면 4071A5 주소에서 어떤 함수를 호출하고 그 함수의 반환값을 eax에 담은 뒤 esi 레지스터 안에 담긴 값이 가리키는 주소에 데이터를 넣고 esi 레지스터의 값을 eax에 옮긴 후 스택을 정리하고 return 한다.

 

이 함수의 동작을 분석해보면

 

1. 40718E 주소에서 407069 주소로 점프한다.

2. 40707D 주소에서 5076A1 주소에 있는 1byte 값이 0이 아니므로 407122 주소로 점프한다.

3. 407125 주소에서 5076A0 주소에 있는 데이터 1byte를 al에 담으면서 eax의 값은 407000이 되고 그 상태로 4299B2 주소로 간다.

4. 그리고 4299B5 주소에서 al의 값을 and 연산하여 0인지 확인하고 0이면 ZF 플래그의 값은 1이 되고, 4299B9 주소에서 ZF 플래그의 값이 1이므로 점프를 하지 않는데, 4299B5 주소의 결과가 0이 아니면 ZF 플래그는 0이 되고 그렇게 되면 4299F1 주소로 점프하여 등록 성공 문자열을 띄운다.

(jne 혹은 jnz 명령어는 같은 의미로 ZF 플래그가 0일 때 즉, 값이 같지 않아야 점프를 한다.)

 


풀이

 

 

위의 분석 2 부분에서 함수의 동작을 분석했을 때 3번째 명령어에서 eax 레지스터의 값을 최종적으로 변경했다.

 

그러므로 407125 주소에서 5076A0 주소의 값이 아니라 고정적으로 1을 al에 담게 하면 후에 test 명령어에서 0인지 검사했을 때 1 AND 1 연산 결과는 1이므로 ZF 플래그가 0으로 설정되고, ZF 플래그가 0이기 때문에 JNE 명령이 실행되어 등록 성공 문자열을 띄운다.

 

 

패치 후 패치된 파일을 저장하고, 패치된 파일을 실행하면 위와 같이 프로그램 타이틀에 있던 "Unregistered" 문구도 사라지고 

 

Register... 버튼도 비활성화 된다.

반응형

'전쟁 > lena tuts4you' 카테고리의 다른 글

[Lenatuts4you] 9. pc2am2p  (0) 2022.11.02
[Lenatuts4you] 8. artgem11  (0) 2022.11.02
[Lenatuts4you] 6. pcsurgeon  (0) 2022.11.02
[Lenatuts4you] 5. Visualsite Designer  (0) 2022.11.02
[Lenatuts4you] 4. pixtopianbook107  (0) 2022.11.02

+ Recent posts