




위와 같은 경고창이 떴다.
이 경고창을 띄우는 곳을 찾아가보기 위해 OllyDBG 상에서 text로 검색해봤다.



따라서 JNZ 위쪽의 구문을 살펴보았다.
CALL 0040714C
POP ECX
XOR EBX, EBX
TEST AL, AL
POP ECX
PUSH EBX
JNZ 004299F1
0040714C 함수가 호출되고,
해당 함수의 리턴 값이 저장되는 EAX의 일부인 AL 레지스터를 참조하여,
해당 레지스터가 ‘0’이면 "unregistered", 아닐 경우 “registered" 분기문이 나눠지는 구조이다
<CMP와 TEST 명령어 비교>
1) CMP dest, src
: dest피연산자에서 src연산자를 묵시적으로 빼서 값을 비교
--> 뺀 값이 0일 경우 ZF=1, 다를 경우 ZF=0 으로 세팅됨
: 혼자 사용 X, 언제나 조건 점프 혹은 조건 이동 명령어와 함께 사용됨
2) TEST opr1, opr2
: 두 피연산자끼리 AND연산을 수행하여 ZF에 영향을 주지만 결과값 저장 X
: 계산 값이 0일 경우에 ZF가 1로 세트 된다.
: 혼자 사용 X, 언제나 조건 점프 혹은 조건 이동 명령어와 함께 사용됨
★ CMP 명령어는 dest 값과 src 값이 동일한지 확인하는데 주로 쓰임 ★
★ TEST 명령어는 opr1 값과 opr2 값이 0인지 확인하는데 주로 쓰임 ★
일단 0040714C에 BP를 걸고 실행해본다.

그리고 아무 값이나 입력한 후 Register Now 클릭!

0040714C 내부로 들어간 직후
AL의 값은 "8C"이다

그 후 00406FD1 함수가 호출되고,
이 함수의 리턴값이 저장된 EAX 값의 일부인 AL 값을 참조하여
[5076A0] 주소에 AL 값을 집어넣고,
JNZ 명령어가 실행된다.
조건문 분기되지 않을 경우 “0040701D" 함수가 호출 되고
AL의 값이 ”[5076A0] / [5076A2]“ 주소에 저장된다.
즉, 해당 주소 값들은 프로그램이 등록 상태(이메일, 라이선스 값) 값이 담긴 변수라고 생각할 수 있다.
따라서, 00406FD1 함수 내부로 들어가서 그 리턴값이 나오는 과정을 살펴봐야할 것이다.(AL을 결정하므로)

여러 함수들을 거치지만 뒤쪽(406FF9~)에서 AL 레지스터 값을 다루고 있으므로
[406FF9] 주소 이전에 다뤘던 AL 값은 무시해도 된다.
ⓐ [406FF9] 주소에 있는 00406F4B 함수 호출 명령어 이후
AL 값이 'A'라고 결정된다고 치자.
그러면 [407009] | MOV BL, AL에 의해 BL='A'가 된다.
ⓑ [407009] 주소에 있는 00401148 함수 호출 명령어 이후
AL 값이 'B'라고 결정된다고 치자.
하지만 [407011] | MOV AL, BL 명령어로 인해
결국 AL 값은 [406FF9] | CALL 00406F4B의 결과로 정해진 AL 값인 'A'가 된다.
결국, 우리가 살펴 봐야 하는 AL 레지스터의 값은 406F4B 함수에서 결정된다는 소리이다.
따라서 406F4B 함수 내부를 살펴보겠다.

쭉 실행하다 보면 “RETN" 까지 오게 된다.
만약 이대로 실행되면 AL=0인 상태로 처음 등록 상태 여부를 비교하는 곳으로 가서
"Unregistered" 문자열이 출력되는 부분으로 넘어가기 때문에
여기서 AL 레지스터 값을 조작해야 하며,
RETN 명령어를 하기 전, AL 레지스터를 다뤘던 부분인
[00406FC5] | MOV AL, BL 부분이 바로 패치가 필요한 부분이다.
따라서 이 부분을 MOV AL, 1 로 바꿔주었다.

'Study > Reversing' 카테고리의 다른 글
Lena 9번 풀이/Rena's Reversing Tutorial 09 (0) | 2021.11.22 |
---|---|
Lena 8번 풀이/Rena's Reversing Tutorial 08 (1) | 2021.11.22 |
Lena 6번 풀이/Rena's Reversing Tutorial 06 (0) | 2021.11.22 |
Malware 프로그램 분석 2 (0) | 2021.11.17 |
Malware 프로그램 분석 1 (0) | 2021.11.16 |