2015년 11월 18일 수요일

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

아래 표는 첫번째 사이클


성공

댓글 없음:

댓글 쓰기