1. 프로그램 확인
- abex' crackme1-voiees.exe ( 실습파일에는 voiees.exex 라고 되있을건데 확장자를 exe로 변경후 실습)
- 어셈블리 언어로 작성된코드이다. > stub code 추가되어 있지 않음


1.1 디버깅

abex' crackme1-voiees.exe 파일을 디버거에 올렸을때 나오는 첫 화면이다.
우리의 목표는 Ok, I really think ... 라는 문구를 출력하는 것이다.
코드가 짧고 배우는 초기단계 이므로 하나씩 실행해 보며 코드를 파악해 볼 것이다.

40100E 주소의 call 함수를 실행하자 프로그램을 처음 실행했을때 뜨는 창을 만났다.
확인을 누른후 계속 실행해보자

에러 메시지 출력까지 왔다. 다음 명령어가 <401050>으로 jmp 하는거고,
<401050>주소의 함수는 프로세스를 종료시키는 함수인걸 알 수 있다.
<40103D> 주소로 가야 우리가 원하는 메시지박스를 출력할 수 있는데
어떻게 해야할까?
여기서 우리가 주목해야할 부분은 바로 여기이다.

je 는 조건분기문인데 조건이 성립하면 jmp 명령어를 실행한다.
그래서 대부분 je명령어 바로 앞쪽을 보면 cmp 명령어로 조건을 지정하는 부분이 있다.
자 이제 확인해보면
cmp 문으로 eax 값과 esi 값을 비교하고있는데 레지스트리 창을 확인해보면
값이 다른걸 알 수있다.
조건에 부합하기때문에 jmp명령어가 실행되지않고 다음명령어로 내려가게되어
Error 메시지가 출력되는곳으로 이동하는것이다.

그럼 이제 jmp 명령어를 실행시킬 방법을 알아보자
- cmp 명령어 수정

eax 값과 eax 값을 비교하게 하면 당연히 똑같은 값을 비교하는것이므로
참인 결과가 나와 jmp명령어를 실행하게 된다.
- je명령어 수정

조건분기문인 je 를 그냥 분기문인 jmp 로 수정하면 조건에 상관없이
40103D 주소로 jmp 하게 된다.
- ZF(Zero Flag) 값 수정

je 명령어를 실행전에 ZF(Zero Flag) 연산결과를 1(참) 로 수정하면
조건에 부합하여 40103D 주소로 jmp 하게 된다.
위 방법들을 사용해 실행하면

우리가 목표로 하는 메시지박스를 실행할 수 있다.!
'Reverse Engineernig > study' 카테고리의 다른 글
[리버싱 핵심원리] ch08. abex' crackme2 (0) | 2022.12.30 |
---|---|
[리버싱 핵심원리] ch07. 스택 프레임 (0) | 2022.12.28 |
[리버싱 핵심원리] ch05. 스택 (0) | 2022.12.27 |
[리버싱 핵심원리] ch04. IA-32 Register 기본 설명 (0) | 2022.12.27 |
[리버싱 핵심원리] ch03. 리틀 엔디언 표기법 (0) | 2022.12.26 |
1. 프로그램 확인
- abex' crackme1-voiees.exe ( 실습파일에는 voiees.exex 라고 되있을건데 확장자를 exe로 변경후 실습)
- 어셈블리 언어로 작성된코드이다. > stub code 추가되어 있지 않음


1.1 디버깅

abex' crackme1-voiees.exe 파일을 디버거에 올렸을때 나오는 첫 화면이다.
우리의 목표는 Ok, I really think ... 라는 문구를 출력하는 것이다.
코드가 짧고 배우는 초기단계 이므로 하나씩 실행해 보며 코드를 파악해 볼 것이다.

40100E 주소의 call 함수를 실행하자 프로그램을 처음 실행했을때 뜨는 창을 만났다.
확인을 누른후 계속 실행해보자

에러 메시지 출력까지 왔다. 다음 명령어가 <401050>으로 jmp 하는거고,
<401050>주소의 함수는 프로세스를 종료시키는 함수인걸 알 수 있다.
<40103D> 주소로 가야 우리가 원하는 메시지박스를 출력할 수 있는데
어떻게 해야할까?
여기서 우리가 주목해야할 부분은 바로 여기이다.

je 는 조건분기문인데 조건이 성립하면 jmp 명령어를 실행한다.
그래서 대부분 je명령어 바로 앞쪽을 보면 cmp 명령어로 조건을 지정하는 부분이 있다.
자 이제 확인해보면
cmp 문으로 eax 값과 esi 값을 비교하고있는데 레지스트리 창을 확인해보면
값이 다른걸 알 수있다.
조건에 부합하기때문에 jmp명령어가 실행되지않고 다음명령어로 내려가게되어
Error 메시지가 출력되는곳으로 이동하는것이다.

그럼 이제 jmp 명령어를 실행시킬 방법을 알아보자
- cmp 명령어 수정

eax 값과 eax 값을 비교하게 하면 당연히 똑같은 값을 비교하는것이므로
참인 결과가 나와 jmp명령어를 실행하게 된다.
- je명령어 수정

조건분기문인 je 를 그냥 분기문인 jmp 로 수정하면 조건에 상관없이
40103D 주소로 jmp 하게 된다.
- ZF(Zero Flag) 값 수정

je 명령어를 실행전에 ZF(Zero Flag) 연산결과를 1(참) 로 수정하면
조건에 부합하여 40103D 주소로 jmp 하게 된다.
위 방법들을 사용해 실행하면

우리가 목표로 하는 메시지박스를 실행할 수 있다.!
'Reverse Engineernig > study' 카테고리의 다른 글
[리버싱 핵심원리] ch08. abex' crackme2 (0) | 2022.12.30 |
---|---|
[리버싱 핵심원리] ch07. 스택 프레임 (0) | 2022.12.28 |
[리버싱 핵심원리] ch05. 스택 (0) | 2022.12.27 |
[리버싱 핵심원리] ch04. IA-32 Register 기본 설명 (0) | 2022.12.27 |
[리버싱 핵심원리] ch03. 리틀 엔디언 표기법 (0) | 2022.12.26 |