728x90
반응형
개요
* 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

Find the Name when the Serial is 5B134977135E7D13

Name을 사용해서 시리얼 값 생성, 역으로 시리얼 값을 통해 해당 Name을 찾아내는 문제

초기 디스어셈블리 창
debug Running page
Input Name, Input Serial

시리얼 생성 알고리즘과 관련된 문제 풀이

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)

loc_40107E: pseudocode


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(⊕) 연산의 결합법칙

^: 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

Name: K3yg3nm3 / Serial: 5B134977135E7D13

결과값 출력도 전에 창이 닫혀서, cmd로 다시..

Correct!


[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

 

728x90
728x90

+ Recent posts