최근에 알게 된 사이트로 crackmes.one라는 사이트에 리버싱을 위한 크랙미가 많이 있다.
very easy 난이도를 가진 것부터 시작했다. 여기 있는 모든 문제의 난이도는 very easy였던 걸로 기억한다. 이전에 작성된 풀이보다 좀 짧고 생략된 설명이 있을 수 있다.
1. crackme1.EXE
압축을 푼 폴더의 이름을 바꿔둬서 원 작성자가 기억이 나지 않는다.
비밀번호를 입력해 맞추는 형식이다.
크랙미 모듈로 들어가면
바로 보인다. 입력한 결과와 아래의 루틴을 통해 연산한 값으로
비교를 통해 틀림과 맞음을 구별.
연산은 문자열 각 한개씩을 비교해 가며 문자와 문자를 비교해 같거나 크거나 작음을 보고 edx를 가산/감산한다.
연산을 정리해서 key를 구하는 코딩을 하였다.
-1, 1이 아니더라도 크거나 작기만 하면 된다.
클리어.
2. CrackMe#1-InfoSecInstitute-dotNET-Reversing.exe
파일 이름에서도 알 수 있듯이 닷넷 문제이다.
닷넷 문제는 리플렉터 등의 툴을 이용하면 쉽게 접근할 수 있다.
나의 경우에는 dnspy로 풀었다.
dnspy로 열어서 찾다보면
form1에서 빠르게 찾을 수 있다.
클리어.
3. oldsofts_keygenme_2.exe
키젠미다.
참고로 64비트 프로그램이다.
모듈을 옮긴 뒤 문자열을 찾으면 이름과 시리얼을 넣는 곳이 나온다.
bp를 건 곳에서 이름을 시리얼로 바꾸는 실행을 하는 곳으로 간다.
반복문의 루틴 줄 수는 적은데 64 버전 디버깅을 하는 것은 처음이라 굉장히 어려웠다.
루틴을 실행-트레이싱-반복을 통해 해석해 보면서 풀었다.
이 루틴이 있고, 그 뒤에
루틴으로 만들어진 결과의 값들을 또 연산을 하고, sprintf로 특정 주소에 %d-%d의 형태로 쓰는 것을 볼 수 있다.
해석한 루틴을 바탕으로 key를 구하는 코딩을 하였다.
중요 연산은
1. 문자열의 길이를 구함
2. 길이를 바탕으로 반복문
3. r9 = 문자 하나하나 + 기존의 값 + 3 반복 연산
4. 반복문 연산이 끝난 시점의 rdx shr 1후 rdx * (rdx + 2) + rax의 값을 r8에 대입
5. %d-%d의 포맷으로 r8-r9을 통해 시리얼이 생산됨
이렇게 해서 클리어.
very easy 난이도를 가진 것부터 시작했다. 여기 있는 모든 문제의 난이도는 very easy였던 걸로 기억한다. 이전에 작성된 풀이보다 좀 짧고 생략된 설명이 있을 수 있다.
1. crackme1.EXE
압축을 푼 폴더의 이름을 바꿔둬서 원 작성자가 기억이 나지 않는다.
비밀번호를 입력해 맞추는 형식이다.
크랙미 모듈로 들어가면
바로 보인다. 입력한 결과와 아래의 루틴을 통해 연산한 값으로
비교를 통해 틀림과 맞음을 구별.
연산은 문자열 각 한개씩을 비교해 가며 문자와 문자를 비교해 같거나 크거나 작음을 보고 edx를 가산/감산한다.
연산을 정리해서 key를 구하는 코딩을 하였다.
-1, 1이 아니더라도 크거나 작기만 하면 된다.
클리어.
2. CrackMe#1-InfoSecInstitute-dotNET-Reversing.exe
파일 이름에서도 알 수 있듯이 닷넷 문제이다.
닷넷 문제는 리플렉터 등의 툴을 이용하면 쉽게 접근할 수 있다.
나의 경우에는 dnspy로 풀었다.
dnspy로 열어서 찾다보면
form1에서 빠르게 찾을 수 있다.
클리어.
3. oldsofts_keygenme_2.exe
키젠미다.
참고로 64비트 프로그램이다.
모듈을 옮긴 뒤 문자열을 찾으면 이름과 시리얼을 넣는 곳이 나온다.
bp를 건 곳에서 이름을 시리얼로 바꾸는 실행을 하는 곳으로 간다.
반복문의 루틴 줄 수는 적은데 64 버전 디버깅을 하는 것은 처음이라 굉장히 어려웠다.
루틴을 실행-트레이싱-반복을 통해 해석해 보면서 풀었다.
이 루틴이 있고, 그 뒤에
루틴으로 만들어진 결과의 값들을 또 연산을 하고, sprintf로 특정 주소에 %d-%d의 형태로 쓰는 것을 볼 수 있다.
해석한 루틴을 바탕으로 key를 구하는 코딩을 하였다.
중요 연산은
1. 문자열의 길이를 구함
2. 길이를 바탕으로 반복문
3. r9 = 문자 하나하나 + 기존의 값 + 3 반복 연산
4. 반복문 연산이 끝난 시점의 rdx shr 1후 rdx * (rdx + 2) + rax의 값을 r8에 대입
5. %d-%d의 포맷으로 r8-r9을 통해 시리얼이 생산됨
이렇게 해서 클리어.
'리버스 엔지니어링' 카테고리의 다른 글
인라인 패치 실습 - Code Cave patch (0) | 2020.07.01 |
---|---|
crackmes.one crackme 001 by disip 풀이 + 크래킹 프로그램 제작 (0) | 2020.07.01 |
레나 리버싱 Tut.ReverseMe1 풀이 2 (0) | 2020.07.01 |
레나 리버싱 Tut.ReverseMe1 풀이 1 (0) | 2020.07.01 |
리버싱kr easy_unpackme 풀이 (0) | 2020.07.01 |