관리 메뉴

HeeJ's

[02] 악성코드 분석_3주차 본문

<Information Security>/<Malware>

[02] 악성코드 분석_3주차

meow00 2021. 9. 29. 15:41

리버싱(reverse engineering) : 역공학

프로그램을 소스코드 단계로 되돌려서 분석하는 것

(악성코드도 완성된 프로그램이기 때문에 분석하려면 리버싱이 필요)

 

C(소스코드) -> 01011(기계어)

: 컴파일

01011(기계어) -> 어셈블리 코드

: 디스 어셈블

 

어셈블리 코드는 주로 IA-32(Manual)를 사용함(Intel 32bit)

기본 형태 : 명령어(opcode) + 인자(operand 1~2)

 

CPU가 사용하는 변수(32bit)

레지스터 역할 레지스터 역할
EAX(Accumulator) 각종 연산에 사용
가장 많이 쓰이는 변수
주로 리턴 값을 저장
ESI, EDI
(source Index, destinationIndex)
문자열이나 각종 반복 데이터를 처리
메모리를 옮기는데 사용
EDX(data) 각종 연산에 사용 ESP 스택 포인터
ECX(Count) for문의 i 역할
미리 값을 정해놓고 0이 될 때까지 진행
변수로 사용 가능
EBP 베이스 포인터
EBX 목적이 없는 레지스터
공간이 필요할 때 덤으로 사용
(ex. temp)
EIP 인스트럭션 포인터

 

ex.

C : return 0;

=

ASM : MOV EAX, 0

RETN

 

 

레지스트리 단위

32bit 16bit 상위 8bit 하위 8bit
EAX AX AH AL
EDX DX DH DL
ECX CX CH CL
EBX BX BH BL

 

main 함수를 실행하다가 다른 함수를 실행할 때 : CALL
call이 끝난 후, main으로 돌아오는데, 돌아올 주소를 return에 저장해 둠

 

함수 호출 규약

1. cdecl

- 항상 call 문의 다음 줄을 살펴 스택을 정리하는 곳을 체크

- call 이후 add esp, 8 과 같이 스택을 보정

- add esp, 8 그리고 push 문에 2개

-> 4byte 파라미터가 두 개임을 추측할 수 있다.

 

2. stdcall
- main 함수 내부에서 스택을 처리하지 않음

- retn 8을 사용하여 스택 처리

- Win32 API는 stdcall 방식을 사용

 

3. fastcall

- 파라미터가 2개 이하일 경우, 인자를 push로 넣지 않고 ecx와 edx 레지스터 이용

- 레지스터(mov)를 이용하기에 메모리를 이용하는 것 보다 훨씬 빠름

- 함수 호출 전, edx와 ecx 레지스터에 값을 넣는 것을 보면 fastcall 규약 함수임을 짐작할 수 있음

- 주로 C++의 클래스에서 this 포인터로 이용

- 현재 객체의 포인터에 ecx에 전달하는 특징을 가짐

- 다음과 같이 ecx 포인터에 오프셋 번지를 더함

 

 

올리디버거 실습

실습 환경 : WinXP 32bit

올리디버거(ollydbg)

- Olly Yuschuk이 개발한 x86 디버거

- 무료, 편리함, 기능 확장을 위한 플러그 인

'<Information Security> > <Malware>' 카테고리의 다른 글

[06]악성코드분석_7주차  (0) 2021.11.16
[05]악성코드분석_6주차  (0) 2021.11.10
[04]악성코드분석_5주차  (0) 2021.11.03
[03]악성코드분석_4주차  (0) 2021.10.06
[01] 악성코드 분석_2주차  (0) 2021.09.21