* 작업환경
VMware [Windows XP Professional] ollydbg [shadow] |
* 실습을 진행하기 전에 알아야 할 사항(ollydbg)
1) 디스어셈블러 윈도우(Disassembler window) : 프로그램의 어셈블리 언어를 보여주는 창
2) 레지스터 윈도우 : 레지스터 상태를 보여주는 창 (EAX, EBX 등)
3) 스택 윈도우 : 스택을 보여주는 창
4) 메모리 덤프 윈도우 : 특정 메모리의 헥사 값(16진수)을 보여주는 창
1. masm32 설치
1) 설치링크
http://www.masm32.com/download.htm
Download The MASM32 SDK
NOTE on the version of MASM supplied in the MASM32 SDK. The versions supplied will write code that works correctly on Windows operating systems from Win95 OEM up to the current versions of Windows. As the Microsoft binaries date from the middle Win98 era,
www.masm32.com
2) 설치 과정
https://blog.naver.com/mjnms/220460834066
Assembly 컴파일을 위한 Masm32 설치
어셈블리(Assembly) 언어는 기계어와 제일 가까운 언어로써, 기계어를 인간이 이해할 수 있는 코드로 재해...
blog.naver.com
3) 설치 완료
2. movex.asm 파일 생성
1) masm32를 이용
어셈블리 입력하고 File > Save로 파일 저장
Project > Build All로 컴파일
Build All 클릭 시 다음과 같은 cmd 창이 뜨며 실행 파일이 생성된 것을 확인 가능
3. 리버싱(동적 분석 - ollydbg)
3.1 mov 명령 실습
1) 명령을 수행할 때마다 esp, ebp, esi, edi의 변화
[코드 설명]
- ebp: 예전에 사용하던 함수 스택의 시작 주소
- eip: 현재 실행 중인 위치
- 모든 영역은 4byte 단위로 되어있음
push ebp //예전 함수 스택의 시작 주소 저장, esp가 그 위치를 가리킴 mov ebp, esp //esp와 ebp 동일한 곳을 가리킴 sub esp, 8h //데이터를 저장하기 위해서, esp는 8byte 위에를 가리킴 mov dword ptr [ebp-4], 22334455h //ebp-4에 22334455 값을 넣어줌 mov dword ptr [ebp-8], 00000000h //ebp-8에 00000000 값을 넣어줌 mov esi, dword ptr [ebp-4] //esi: 22334455 값이 들어감 mov edi, dword ptr [ebp-8] //edi: 00000000 값이 들어감 mov esp, ebp //메인 함수를 부르기 전 함수로 돌아가기 위해서, esp를 ebp 값으로 저장 pop ebp //ebp는 예전 함수의 ebp를 가리킴 retn |
2) 명령(한 줄 단위)을 수행할 때마다 스택의 상태
단축키 [F7] 사용
Push ebp
-> 스택에 ebp 값 들어감.
mov ebp, esp
sub esp, 8h
-> esp에서 8byte를 뺀 값: 0012FFB8
mov dword ptr [ebp-4], 22334455h
mov dword ptr [ebp-8], 00000000h
-> 스택 영역에 두 개의 값 추가
mov esi, dword ptr [ebp-4]
mov edi, dword ptr [ebp-8]
mov esp, ebp
pop ebp
계산기를 이용하여 HEX 값 구하기
3.2 lea 명령 실습
사용하는 파일: lea.asm
1) 명령을 수행할 때 eax, ecx, ebx, edx의 변화
[코드 설명]
.586 .model flat, stdcall option casemap:none .code main proc push ebp mov ebp, esp sub esp, 4h // 프롤로그: 현재 함수가 사용하기 위해서 스택을 설정하는 과정 mov dword ptr [ebp-4], 00400000h mov eax, dword ptr [ebp-4] //ebp-4가 가리키는 곳의 값을 eax에 넣음, eax=00400000 lea ecx, dword ptr [ebp-4] //ebp-4의 주소 값을 ecx에 넣음. ecx=0012F000 mov ebx, [eax] //00400000 주소 공간의 값을 ebx에 저장 mov edx, [ecx] //ecx가 가리키는 곳의 값을 edx, edx=00400000 mov esp, ebp pop ebp retn //에필로그: 스택 끝내는 과정 main endp end main |
push ebp
mov ebp, esp
sub esp, 4h
// 직접 계산 결과
mov dword ptr [ebp-4], 00400000h
mov eax, dword ptr [ebp-4]
lea ecx, dword ptr [ebp-4]
-> ebp-4 주소의 값을 ecx에 저장, ecx=12FFBC
mov ebx, [eax]
-> 리틀 엔디안 방식
mov edx, [ecx]
mov esp, ebp
2) lea 명령과 mov 명령의 차이점
mov는 가리키는 공간에 값을 넣어줌
lea는 가리키는 주소 값을 넣어줌
3.3 jmp 명령 실습
1) 명령을 수행할 때 eax, ebx의 변화
[코드 설명]
.586 .model flat, stdcall option casemap:none .code main proc push ebp mov ebp, esp sub esp, 8h //프롤로그 mov dword ptr [ebp-4], 10h //ebp-4 위치에 10h(=hex 값, 10진수: 16) mov dword ptr [ebp-8], 20h //ebp-8 위치에 20h(=hex 값, 32) mov eax, dword ptr [ebp-4] //eax=ebp-4(=16) mov ebx, dword ptr [ebp-8] //ebx=ebp-8(=32) Start: inc eax //eax=11 cmp eax, ebx //ZF=1이 되면 jump je Exit // 같으면 ja Exit //eax가 ebx 보다 크면 Exit 함수 수행 jmp Start //다시 Start로 jump //반복 Exit: pop ebp retn main endp end main |
2) 명령을 수행할 때 ebp와 esp의 변화
push ebp
mov ebp, esp
sub esp, 8h
mov dword ptr [ebp-4], 10h
mov dword ptr [ebp-8], 20h
mov eax, dword ptr [ebp-4]
mov ebx, dword ptr [ebp-8]
Start:
inc eax
cmp eax, ebx
je Exit
ja Exit
jmp Start
반복
출처
리버싱 윈도우 - 로드북
'Security > Reversing' 카테고리의 다른 글
[UDP Flooding] UDP Flooding Malware 정적/동적 분석 (0) | 2020.07.28 |
---|---|
[UDP Flooding] UDP Flooding Malware 제작 (0) | 2020.07.28 |
[악성코드정적분석] PracticalMalwareAnalysis-Lab01-04 분석 (0) | 2020.04.25 |
[악성코드정적분석] PracticalMalwareAnalysis-Lab01-03 분석 (0) | 2020.04.24 |
[악성코드정적분석] PracticalMalwareAnalysis-Lab01-02 분석 (0) | 2020.04.24 |