* 작업환경
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
2) 설치 과정
https://blog.naver.com/mjnms/220460834066
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 |