악성코드 분석/실습

[윈도우즈보안과 악성코드분석기초] crackme 리버싱

レ(゚∀゚;)ヘ=З=З=З 2021. 3. 27. 23:20
728x90

어셈블리로 작성된 코드

열자마자 시작 주소 ( EP가 시작주소이며 코드가 간단하고 명확(stub code가 없이)하게 작성되어 있음)


<abexcm10voiees.exe 파일로 실행>

총 3개의 API 함수 사용

-> MessageBoxA, GetDriveTypeA, ExitProcess

00401002             PUSH 402000             ;Title="abex'1st crackme"

-> dump 402000 위치로 이동하면 Title 내용 담겨져 있는 것을 확인할 수 있음

0040100E             CALL 00401061             ;MessageBoxA, 함수내부에서 ESI=FFFFFFFF로 셋팅됩니다.

-> 해당 번지인 00401061을 호출 ( 점프 )

 

더보기

 

※ [ 00401061             JMP DWORD PTR DS:[<&USER32.MessageBoxA>}       ;USER32.MessageBox ]

USER32 : user32.dll 이라는 window에서 많이 사용하는 API 함수들의 dll 목록 ( 파일 ) 
             user32.dll 이라는 window API 함수를 제공하는 라이브러리에서 제공하는 USER32

 

00401018             CALL 00401055             ;GetDriveTypeA, 리턴 값(EAX)은 3(DRIVE_FIXED)입니다.

-> EAX 레지스터 : API 레지스터 값을 리턴해주는 역할
    EAX = 3

0040101D             INC ESI             ;ESI=0

-> ESI 값을 1만큼 증가시킴

0040101E             DEC EAX             ;EAX=2

-> EAX 값을 1만큼 감소시킴

00401024             CMP EAX, ESI             ;EAX(1)와 ESI(2)를 비교

00401026             JE SHORT 0040103D             ;JE(Jump if Euqal) 조건 분기 명령

 

더보기

 

JE ( Jump if Euqal ) 조건 분기 명령

: 두 값이 같으면 40103D로 점프하고, 다르면 그냥 밑 ( 401028 ) 으로 진행

  40103D 주소는 제작자가 원하는 메시지 박스 출력 코드

 

 

00401050             CALL 0040105B             ;ExitProcess

-> 프로세스 종료

0040105B             JMP DWORD PTR DS:[<&KERNEL32.ExiProcess>}       ;KERNEL32.ExitProcess

-> KERNEL32.dll 에 있는 API 함수

 


 

주요 어셈블리 명령어

 

명령어 설명
PUSH 스택의 값을 입력
CALL 지정된 주소의 함수를 호출
INC 값을 1 증가
DEC 값을 1 감소
JMP 지정된 주소로 점프
CMP 주어진 두 개의 operand 비교
-> SUB 명령어와 동일하나 operand 값이 변경되지 않고 EFLAGS 레지스터만 변경됨
    ( 두 operand 의 값이 동일하다면 SUB 결과는 0 이고 ZF = 1 로 세팅됨 ) 
JE 조건 분기 ( Jump if equal )
-> ZF = 1 이면 점프 ( 값이 다르면 ZF = 0 )

 

 


 

cracking

 

1. 패치를 통해 코드의 프로그램 수정

-> JE 부분을 단순한 JMP SHORT [주소] 로 변경

 

 

처음 변경 전 코드



JE 였던 코드를 JMP로 바꿔 값을 비교하지 않고 바로 원하는 MessageBoxA로 JMP할 수 있도록 함

 

코드가 변경된 것을 확인

 

실행 시 처음 나오는 MessageBoxA

 

JMP 가 되어 원하는 MessageBox 를 출력




 

2. EAX와 ESI 값을 수정해서 프로그램 수정


GetDriveTypeA 부분을 지나고 나서 EAX 와 ESI 의 값

 

[ CMP EAX, ESI ] 코드까지 진행했을 때의 EAX와 ESI 값 ( EAX = 00000001, ESI = 00401003 )

 

CMP 후 JE를 하기 때문에 같은 값이어야지 원하는 MessageBoxA로 이동 가능, ESI 값을 EAX와 동일한 값인 ' 00000001 ' 로 변경

 

변경된 ESI 값 확인

 

F8 로 실행을 하면 원하는 MessageBox 를 출력할 수 있는 부분으로 점프하는 것을 알 수 있음

 

원하는 MessageBox 출력




 

3. NOP 사용

 

 

CMP 부분부터 원하지 않는 MessageBoxA 가 있는 부분을 모두 드래그해서 ' NOP ' 로 변경

 

Assemble 에 들어감

 

모두 ' NOP ' 로 수정

 

' NOP ' 로 수정된 것을 확인

 

실행하면 원하는 MessageBox 출력