어셈블리로 작성된 코드
열자마자 시작 주소 ( 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 [주소] 로 변경
2. EAX와 ESI 값을 수정해서 프로그램 수정
3. NOP 사용
'악성코드 분석 > 실습' 카테고리의 다른 글
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 |