1. abex' crackme #2 실행
abex' chacma #2: visual basic으로 작성된 프로그램
시리얼 키(serial key)를 검증하는 프로그램
2. visual basic 파일의 특징
2.1 visual basic (VB) 전용 엔진
msvbvm60.dll (Microsoft visual basic virtual machine 6.0) 이라는 전용엔진 사용
2.2 N code vs. P code
VB 파일은 컴파일 옵션에 따라 N code와 P code로 컴파일됨
N (Native) code
>> 디버거에서 해석이 가능한 IA-32 Instruction을 사용
P (Psuudo) code
>> Interpreter 언어 개념
>> VB 엔진으로 가상 머신을 구현하여 자체적으로 해석 가능한 명령어 코드를 사용
>> P code를 해석하려면 VB 엔진을 분석하여 에뮬레이터를 구현해야 함
2.3 Event Handler
VB는 주로 GUI 프로그래밍을 할 때 사용
Windows 운영 체제의 Event Driven 방식으로 동작
>> 주요 사용자 코드가 main()함수나 WinMain()함수에 존재하는 것이 아님
>> 각 event handler에 사용자 코드가 존재
ex) abex' crackme #2의 경우: [Check] 버튼의 handler에 사용의 주요 코드가 존재
2.4 undocumented 구조체
VB에서 사용되는 각종 정보들(Dialog, Control, Form, Module, Fuction 등)은 내부적으로 구조체 형식으로 파일에 저장됨
구조체 정보는 비공개 >> 디버깅이 어려움
3. 디버깅 시작
3.1 간접 호출
40123D : CALL 00401232
>> ThunRTMain() 함수 호출 목적
>> 그러나 직접 ThunRTMain() 함수를 호출하지 않음. 대신 중간에
401232 : JMP DWORD PTR DS: [4010A0]
을 이용하여 간접 호출 (Indirect Call)
3.2 RT_MainStruct 구조체
RT_MainStruct 구조체 정보는 401E14 주소에 저장되어 있음
RT_MainStruct 구조체는 다른 구조체들의 주소를 저장하고 있음
4. crackme 분석
Error 메시지 박스의 문자열을 단서로 하여 분석할 코드의 저장 위치를 탐색
>> "Wrong serial" 문자열 탐색
>> 추측: 입력된 문자열을 어떤 값과 비교하여 serial 값이 맞는지 확인할 것이다.
4.1 문자열 검색
분기 및 성공 코드
4.2 문자열 주소 찾기
추측: vbaVarTstEq()가 serial 문자열 비교 함수
그런데...
이름이 바뀌면 분명 같은 시리얼 코드를 입력했음에도 틀렸다고 뜬다
>> 이름에 따라 다른 시리얼코드를 발급한다 추측
4.3 Serial 생성 알고리즘
serial 비교 & 조건 분기 코드를 포함한 함수의 시작 부분 찾기
해당 조건 분기 코드의 앞쪽에서 "PUSH EBP" 명령이 있는 부분을 찾는다.
>> 함수가 호출되었다면, 시작 부분에서 스택 프레임을 만들려고 할 것이기 때문.
추측: [Check] 버튼을 누르면 호출되는 event handler
4.4 Serial 생성 알고리즘 예측
일반적인 방법 (추측)
>> 입력된 문자열을 읽는다. > 문자열을 읽기 위해 API 사용
>> 입력된 문자열을 기반으로 Serial을 만드는 알고리즘을 수행한다.
4.5 Name 문자열 읽는 코드
CALL 명령어 위주로 디버깅 > "입력한 문자열" 읽는 부분 찾기
1. 402F98 주소에 BP 설정 후 실행
2. 스택 창에서 위에서 두번째 데이터 확인 (or EDX 값 확인): EBP-88의 값
3. 덤프창에서 go to로 EBP-88 주소값으로 이동
4.6 암호화 루프 > Serial 생성 알고리즘
추측: 암호화 or 반복문 사용하여 인코딩
메시지 박스가 뜰 때까지 실행한 모습
변환된 시리얼코드가 추가되는 걸 볼 수 있다
'공부 > 리버싱 핵심원리' 카테고리의 다른 글
IAT 따라가기 (0) | 2024.05.12 |
---|---|
PE File Format (0) | 2024.05.11 |
Lena's Reversing for Newbies (0) | 2024.04.17 |
abex' crackme #1 분석 (0) | 2024.04.15 |
Hello World! 리버싱 (1) | 2024.04.15 |