어셈블리로 작성된 코드
열자마자 시작 주소 ( 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 출력
'악성코드 분석 > 실습' 카테고리의 다른 글
windowproject.exe - 동적분석 (1) | 2023.12.20 |
---|---|
windowproject.exe - 정적분석 (0) | 2023.12.20 |
IDA - idapractice.exe 정적분석 (0) | 2023.12.20 |
[윈도우즈보안과 악성코드기초] PE 파일 (0) | 2021.03.28 |
[윈도우즈보안과 악성코드분석기초] 문자열 패치 (0) | 2021.03.22 |