Information Security ˗ˋˏ ♡ ˎˊ˗

Security/Reversing

[x86 디스어셈블리 속성] 어셈블리 실습

토오쓰 2020. 5. 28. 15:05

* 작업환경

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) 명령(한 줄 단위)을 수행할 때마다 스택의 상태

 

 

Shadow

단축키 [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]

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

반복

 

반복

반복문을 빠져나옴

 

출처

리버싱 윈도우 - 로드북