과제1 Abex Crack me1 풀은 뒤에 풀이 작성
먼저 디버거로 프로그램을 까보면,
전체적인 소스코드이다.
MassageBox로 "Make me think your HD is a CD-rom." 을 띄워주고
GetDriveTypeA 함수를 호출해서 드라이브타입을 확인 후
EAX에 리턴값을 주고 있다.
천천히 Step over로 실행시키다가 GetDriveType 구문에서
EAX가 3으로 변경된다.
그 아래부분은 ESI와 EAX를 증감해주고 있다.
결과적으로 값이 변하고, 그 두 값을 비교했을 때,
같으면 " Ok,I really think that your HD is a CD-ROM! :p "를 출력시켜준다.
여기서 비교하는 cmp를 같은 eax로 하면
값은 무조건 같기 때문에 성공 메시지가 뜬다.
다른 방법 jmp로 무조건 넘겨주는 방법도 있다.
과제2 Abex Crack me3 풀고 풀이 작성
프로그램을 까보면
MessageBox로 "Click OK to check for the keyfile"을 띄우고,
CreateFile로 이미 존재하는 파일을 읽기 용도로 연다고 되어있다.
또한 eax를 -1로 바꾸고 cmp로 비교하고 있다.
그렇게 비교한 값이 맞으면 실패텍스트가 띄워진다.
따라서 cmp를 같지 않게 만들어주거나, je를 반대로 jnz로 같지 않아야 점프하게 만들어 주면 된다.
바꿔줬지만 다른 에러메세지가 뜬다.
아래 구문을 보면, 다시 eax를 12로 비교하고,
같지 않을 시에만 점프를 하게 한다.
따라서 에러메세지를 회피하기 위해서는
이 조건을 거짓으로 만들어 줘야 하므로 cmp를 같게 만들어 주거나,
jnz를 je로 만들어주면 된다.
다른 방법
과제3 Abex Crack me5 풀은 뒤에 풀이 작성
먼저 프로그램를 까보면
이런 식으로 되어 있다.
위의 lstrcat이라는 함수 호출 후 반환된 eax가 0과 같을 시에만
성공메세지를 띄워준다.
무조건 점프하도록 jmp로 바꿔주어 풀 수도 있지만
시리얼 코드를 한번 구해보면,
먼저 lstrcmp 함수는 문자열을 서로 비교하는 함수이다.
비교 후 같다면 0 다르다면 1을 리턴 해준다고 한다.
따라서 우리가 입력한 문자열을 시리얼코드와 비교해야 하기때문에
시리얼코드가 어딘가에 있을 것이다.
먼저 eax와 0을 비교하기 전까지 실행하기 위해서 Breakpoint를
걸어준다.
그후 실행 해보면
L2C-5781Hkng4562-ABEX와 비교하는 것을 볼 수있다.
따라서 이렇게 문제는 해결된다.
과제4 핸드레이(Handray)의 정의를 알아오기
Handray 란?
어셈블리어에서 C언어로 바꾸는 작업을 뜻한다.
과제5 핸드레이(Handray) 문제 2개 풀기
5-1)
MOV DWORD PTR SS:[EBP-4], 0
MOV DWORD PTR SS:[EBP-8], 0
CMP DWORD PTR SS:[EBP-4], 5
JNZ SHORT prob1.0040A7D7
MOV EAX, DWORD PTR SS:[EBP-8]
ADD EAX, 8
MOV DWORD PTR SS:[EBP-8], EAX
JMP SHORT prob1.0040A7E0
0040A7D7 MOV ECX, DWORD PTR SS:[EBP-8]
ADD ECX, 0B
MOV DWORD PTR SS:[EBP-8], ECX
#include <stdio.h>
int main()
{
int a = 0; // DWORD PTR SS:[EBP-4]
int b = 0; // DWORD PTR SS:[EBP-8]
int c; // ECX
int d; // EAX
if (a != 5) // CMP DWORD PTR SS : [EBP - 4], 5.
{ // JNZ SHORT prob1.0040A7D7.
c = b; // MOV ECX, DWORD PTR SS:[EBP-8].
}
else
{
d = b; //MOV EAX, DWORD PTR SS : [EBP - 8].
d += 8; // ADD EAX, 8.
b = d; // MOV DWORD PTR SS:[EBP-8], EAX.
}
c += 11; // ADD ECX, 0B.
b = c; // MOV DWORD PTR SS:[EBP-8], ECX.
}
5-2)
0040A7B8 MOV DWORD PTR SS:[EBP-4], 0
0040A7BF MOV DWORD PTR SS:[EBP-8], 0
0040A7C6 MOV DWORD PTR SS:[EBP-4], 0
0040A7CD JMP SHORT prob2.0040A7D8
0040A7CF MOV EAX, DWORD PTR SS:[EBP-4]
0040A7D2 ADD EAX, 1
0040A7D5 MOV DWORD PTR SS:[EBP-4], EAX
0040A7D8 CMP DWORD PTR SS:[EBP-4], 5
0040A7DC JGE SHORT prob2.0040A7E9
0040A7DE MOV ECX, DWORD PTR SS:[EBP-8]
0040A7E1 ADD ECX, DWORD PTR SS:[EBP-4]
0040A7E4 MOV DWORD PTR SS:[EBP-8], ECX
0040A7E7 JMP SHORT prob2.0040A7CF
0040A7E9 XOR EAX, EAX
#include <stdio.h>
int main()
{
int a = 0; // DWORD PTR SS:[EBP-4].
int b = 0; // DWORD PTR SS:[EBP-8].
int d;
for (a = 0; a < 5; a++)
{
d = b;
d += a;
b = d;
}
a ^= a;
}
'IT > Assembly' 카테고리의 다른 글
Reversing / 1일차 (0) | 2016.04.13 |
---|---|
2. 어셈블리어의 기초 (0) | 2016.04.03 |
1. 어셈블리어의 장단점 (0) | 2016.04.03 |