개요
* Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습
1. 디스어셈블리 상세 기능
- 스택 프레임 및 함수 호출 규약의 이해
- 동적 디버깅 사용 및 코드 실행
- 데이터 타입과 데이터 구조
- 기본 데이터/코드 변환
2. 스택/힙 할당 배열 및 구조체 접근
목차
0. Easy KeygenMe 실습
1. 어셈블리어: MOV, CMP, XOR, MOVZX, MOVSX
2. 알고리즘 분석
3. XOR(⊕) 연산의 결합법칙
4. 소스코드 작성(pseudo code 기반)
[Review] (3주차) 실습
2022.07.04 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe) (2)
IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe) (2)
개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기
sarahee.tistory.com
0. Easy KeygenMe 실습
Intro
Name을 사용해서 시리얼 값 생성, 역으로 시리얼 값을 통해 해당 Name을 찾아내는 문제
시리얼 생성 알고리즘과 관련된 문제 풀이
1) 어셈블리어로 전체적인 구조 파악
2) Hex-rays로 세부 알고리즘 파악
rep stosd: 저장소 문자열 명령
stosb: AL로부터 byte를 읽어 들임, stosw: AX로부터 word를 읽어 들임 - 정수값을 메모리에 복사
1. 어셈블리어: MOV, CMP, XOR, MOVZX, MOVSX
MOV
데이터 복사 명령어
0x10: [esp+140h+var_130]
0x20: [esp+140h+var_12F]
0x30: [esp+140h+var_12E]
Byte 단위로 각각 스택에 넣어줌, 사용자가 입력한 문자열을 첫번째 글자부터 순서대로 Byte 단위로 레지스터에 넣음
CMP
esi가 3 이상이면 0으로 초기화
XOR
두 입력 신호가 서로 같으면 0, 다르면 1, 동일한 두 값 → 초기화
MOVZX
소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 0 padding
(목적지에 32bit register → 소스에 16bit register)
MOVSX
소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 소스의 맨 처음 bit로 채움
(목적지에 32bit register → 소스에 16bit register)
2. 알고리즘 분석
1) v3이 v8의 strlen이 클 때 까지 반복하고, i가 3 이상이면 0으로 초기화
2) sprintf를 통해 Buffer에 생성된 serial 저장
3) "%s%02X"를 통해 기존 Buffer 내용과 v8 포인터 입력값을 한글자씩 가져옴
4) xor 연산을 한 값을 sprintf 함수를 통해 serial이 저장되는 Buffer에 저장
5) serial을 계산하여 scanf로 입력받은 후, strcmp 함수로 동일한지 비교
- if 0일 때 거짓, 0이 아닐 때 참으로 동작하므로, strcmp 내 0일 경우(문자열이 같을 경우) Correct 출력
v6에는 16 → 16 = 0x10
v7[i - 1]가 될 수 있는 값은, v7[0], v7[1], v7[2]의 반복
qmemcpy: sizeof(v7)만큼 " 0" 영역의 값을 v7로 복사
첫번째 인자(v7): 복사받을 메모리를 가리킴
두번째 인자(" 0"): 복사할 메모리를 가리킴
세번째 인자(sizeof(v7)): 복사할 데이터(값)의 길이(바이트 단위)
16진수이므로 두자리씩 끊어서 총 8자리
3. XOR(⊕) 연산의 결합법칙
p | q | p ⊕ q | (p ⊕ q) ⊕ q |
T | T | F | T |
T | F | T | T |
F | T | T | F |
F | F | F | F |
(p ⊕ q) ⊕ q ≡ p ⊕ (q ⊕ q) ≡ p ⊕ F ≡ p
0x5b^0x10
0x13^0x20
0x49^0x30
0x77^0x10
0x13^0x20
0x5E^0x30
0x7D^0x10
0x13^0x20
4. 소스코드 작성(pseudo code 기반)
# sol1
serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
ans = []
i_xor = 0
for i_ser in range(len(serial)):
if i_xor >= 3:
i_xor = 0
ans.append(serial[i_ser]^xor[i_xor])
i_xor += 1
print(chr(ans[i_ser]), end='')
# sol2
serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
ans = []
for i in range(len(serial)):
ans.append(serial[i]^xor[i%3])
print(chr(ans[i]), end='')
출력: K3yg3nm3
75 51 121 103 51 110 109 51
결과값 출력도 전에 창이 닫혀서, cmd로 다시..
[Next] (4주차) 이론
2022.07.19 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)
IDA Pro 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)
개요 * Easy_KeygenMe.exe 파일 실습 1. 레지스터 활용 분석 - 메모리 주소 및 스택 프레임의 이해 - ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리 2. 어셈블리 명령어 이해 및 알고리즘 분석 - Pse
sarahee.tistory.com
'Security & Analysis > IDA Pro' 카테고리의 다른 글
[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF) (0) | 2022.08.06 |
---|---|
[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review) (0) | 2022.07.19 |
[IDA Pro] 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe) (2) (0) | 2022.07.04 |
[IDA Pro] 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1) (0) | 2022.06.12 |
[IDA Pro] 악성코드 정적 분석 툴 사용법(기본 개념 이론) - week.01 (0) | 2022.05.22 |