2015년 11월 25일 수요일

crackme 16

리버싱
- crackme(abexcm16) -

아래 화면이 프로그램이 실행되었을때 화면.
Name을 입력받고 입력하면 Password를 입력하는 문자열이 뜬다.
Name과 그에 맞는 Password를 찾아내는 크랙문제이다.


 출력되는 문자열을 검색해보면
Good Job! / Wrong password!
라고 출력되는 문자열이 보인다.


해당위치로 가보면
아래 코드중에서 004015A2 부분이 조건분기를 통해
Good job과 Wrong password 문자열을 띄우는 부분으로 점프하게 된다.



 그래서 이부분을 자세히 살펴보았다.

이 부분에서 MOV IMUL LEA ADD MOV연산을 통해 Password를 만들어내고
마지막에 CMP로 비교하여 점프시키는 것으로 추측했다.

EAX 와 SS를 CMP하게 되는데 여기서
0040159C 부분을 지날때 EAX에 입력한 패스워드가 들어간다.
그것으로 보아 SS:LOCAL.16에 입력한 패스워드가 들어있는 것으로 볼 수 있다.

Name에 a와 Password에 1을 입력하였을때

CMP 부분에서 EAX에 있는 1과 스택에 있는 49EA7457과 비교하는 것을 볼 수 있습니다.
 49EA7457를 십진수로 변경해보면. 1240101975가 나옵니다.





2015년 11월 24일 화요일

crackme 14

리버싱
- crackme(abexcm14) -

프로그램 실행화면.
Name에 맞는 Key값을 찾는게 문제.


 스트링 검색을 통해 정확한 값을 입력했을때 출력되는 문자열을 찾음.


이곳으로 가서 위로 가면 0045BB9B를 CALL하는데 여기서 키가 만들어진다.


스텝인 해서 진행해보면
아래 부분에서 반복루프가 실행된다.





그리고 해당 지점을 계속 스텝오버해보면
아래 다섯부분에서 0000-0000-00000000-0000-0000
이렇게 다섯개의 숫자가 조합된 키값을 만들어낸다.





최초에 Name 값을 aasd를 입력하였는데
첫번째 루프에서
18F55C를 불러와 659A2240 를 만들고

두번째 루프에서
18F554를 불러와 107D07A4

세번째 루프에서
18F54C를 불러와 87C253EFDF0F386D2EA5E3D7C06DDC71

네번째 루프에서
18F548을 불러와 2D0CB3F3

다섯번째 루프에서
18F540을 불러와 215EAA49를 만든다.
3번째 루프는  앞에 8바이트를
1,2,4,5 루프는 앞에 4바이트를 사용한다.
그래서 최종적으로
659A-107D-87C253EF-2D0C-215E 라는 키값이 만들어진다.


저 루프값들에 들어가는 숫자가 만들어지는 방법을 알고싶었는데
LOCAL에 대한 주소값으로 만들어낸다는 것 밖에 알지 못했다.

crackme 13

리버싱
- crackme(abexcm13) -



프로그램 실행화면..
정확한 key값을 찾아야 하고
정확한 key를 입력하지 않으면 Check버튼을 눌러도 아무 변화가 없음.



올리디버거로 코드를 열어보면
아래와 같은데..

아래쪽으로 내려와보면 ASCII값으로 Congratulation, you found the right key라는 문구를 출력하는곳이 보인다.



 이쪽 코드를 자세히 보면

성공 문자열을 출력하기전에
0040107D 부분에서 CMP를 하고
00401082 부분에서 JNZ를 한다.

이것으로 보아 CMP에서 비교를 해서 0인경우(Zero flag가 1인경우)
는 성공문을 뛰어넘고
1인경우(Zero flag가 0인경우) 계속 실행되어 성공 문자를 출력하는 것 같다.

그래서 CMP로 비교하는 7A2896BF를 10진수로 변환하면

2049480383





2015년 11월 18일 수요일

abexcm 12

리버싱
- crackme(abexcm12) -



처음 프로그램을 실행시키면 
첫번째

 확인을 누르면 두번째

확인을 누르면 세번째

이렇게 메시지박스 세개가 출력되고 프로그램이 종료된다.

마지막 메세지 박스의 이름이 Remove Me!인것으로 보아 
저 메세지 박스를 없애면 될 것 같다.


올리디버거로 열어보면 아주 간단하다.




아래와 같이 두번째 메세지 박스가 출력되고
강제로 JMP시켜 마지막 메세지가 출력되지 않도록 했다.

abexcm 11

리버싱
crackme(abexcm11)-



이번 프로그램도 문자열을 입력받는 프로그램이고 잘못된 시리얼을 입력하면 다음과 같이 Mal Cracker!!!라고 출력되고 다시는 시리얼을 입력할 수 없다.


프로그램은 비주얼베이직으로 제작되었고.
이번엔 호출되는 함수를 검색해서 찾아보니
 strCmp라고 비교하는 함수를 발견하였다.
이곳에 BP를 걸고 실행시켜보면.
 
 

EAX, ECX에 값을 넣고 CMP함수를 호출하여 비교하는 것 같다.
 이때 EAX에는 입력한 1233 ECX에는 정확한 시리얼은 677345가 들어있다.
입력하면 아래와 같이 출력.


성공

abexcm 10


리버싱
- crackme(abexcm10) -


처음 프로그램을 실행시키면. 아래와 같이 실행된다.


1. Check 버튼은 시리얼을 입력받고 확인하는 버튼


 2. ???버튼은 개발자가 적어놓은 정보


일단 정확한 시리얼을 알아내는게 목적.
 
다른 crackme와 마찬가지로 오류를 띄우는 스트링을 찾고
비교구문을 찾아 해결하려고 했는데.


아래 그림에서처럼 ExitProcess함수를 불러오고 그냥 종료되버림


보니 00401005부분에서 0과 비교해서 JNE시키는 부분에서 ExitProcess함수를 불러옴
그래서 CMP EAX, 0->CMP EAX, 1로 바꾸고 계속 진행


계속 진행시키면 아래 부분에서 0040114A에서 에러문을 출력하는 메시지 박스를 띄우는 곳으로 점프됨.

이제 이 부분에서 비교하고 메시지 박스를 띄우는 것 같다.
그런데 자세히 보면 lstrlenA, lstrcpyA, lstrcatA 이 세가지 함수를 보아
문자열 길이를 확인하고, 복사하고, 붙이는 것 같다.
 
처음 lstrlenA는 길이를 비교하는 것 같은데 CMP 부분에서 0E랑 비교하고 점프하는 것으로 보아 0E -> 는 십진수로 14이기 때문에 시리얼을 14개를 입력받아야 할 것 같다
 14개를 입력하고 실행시키게 되면.
점프문을 지나쳐서 계속 진행하게 된다.
결론적으로 보니 strlen으로 시리얼 길이를 비교하여 맞으면 점프문을 지나고
strcpy, strcat으로 VaZoNeZVaZoNeZ라는 문자열을 완성시켰다.
그리고 GetUserNameA함수로 내 컴퓨터의 사용자 이름을 불러온다.
추측컨대 이 두가지로 시리얼을 만들어내는 것 같다.

그리고 이부분이 시리얼을 만들어내는 코드


순서대로 step over하면서 보면

AL에 내 사용자 이름을 하나씩 넣고 DL에서 만들어낸 문자열 VaZoNeZVaZoNeZ를 하나씩
불러와서 ADD, XOR, ADD, SUB문을 하나씩 걸쳐서 문자를 하나씩 변경한다.
그리고 마지막에 DL에 있는 문자 하나로 스택의 문자열을 하나씩 변경한다.
결론적으로 모두 변경된 문자는
MOKgI_OTVRnPfV

아래 표는 첫번째 사이클


성공

abexcm 8


리버싱
- crackme(abexcm8) -



프로그램 실행화면.
시리얼을 입력받는 창이뜨고 잘못된 시리얼을 입력하면 다음과 같이 출력된다.


올리디버거로 프로그램을 실행시키고 잘못된 시리얼이라고 출력하는 곳에 BP를 건다.
search fortext strings 검색을 통해 BP를 건다.


그리고 BP를 건 코드 위쪽의 입력받은 값과 정확한 시리얼을 비교하는 곳을 찾아보았다.
조금 위로 올라가보니 TEST를 통해 비교하는 곳을 찾았다.


아래그림에서 보이는 코드를 자세히 살펴보았다.
0040118F에서 입력받은 시리얼을 EDI에 넣고
00401197주소부터 입력받은 값을 한자리씩 EDI+1을 해서 불러온 후
AND연산을 하고 JNZ를 하는 것을 볼 수있다.
JNZ는 제로가 아닐 때 점프하는 구문으로 하나씩 비교해서 맞는 시리얼이 아닐 경우 004011DB로 점프하는 코드이다.


그리고 004011DB는 Error 문자열을 출력하는 주소이다.


비교하는 문자는 0AD, 9A, 97, 0BF, 5FC5, 0D6 6문자이다.
이 문자와 AND 연산을 통해 0을 만들어야 함으로 해당 문자의 보수를 찾아야한다.
 
AD=10101101 01010010 : 52=R
9A=10011010 - 01100101 : 65=e
97=10010111 01101000 : 68=h
BF=10111111 01000000 : 40=@
C5=11000101 00111010 : 3A=:
D6=11010110 00101001 : 29=)


성공