리버싱

1일차. 어셈블리어

컴공 2013. 4. 8. 23:54
반응형

고급언어 - 변수에 이름을 주고 주소를 담아 메모리에 접근
저급언어 - 포인터 주소로 바로 접근

MOV [MOVe data]
데이터 복사
source operand의 내용을 Destination operand로 복사.
Destination operand의 내용은 변하지만 Source operand의 내용은 변하지 않음.

MOVZX[MOVe with Zero eXtention]
source operand를 Destination operand로 데이터를 복사한 후 나머지 비트를 0(zero)로 채움
부호가 없는 정수에만 사용

ex) char a = '1'
      int b = a      b [ 00 | 00  | 00 | 1  ]
operand = X + Y



MOVSX(MOVe with Sign eXtention)
부호가 있는 정수에만 사용하며, source operand를 destination operand로 복사 후 비트 값을 부호 확장함

MOVS(MOVe String)
ESI(SI)가 가리키는 주소에 있는 데이터를 EDI(DI)가 가리키는 주소로 복사.
방향 플래그(DF)가 1이면 ESI(SI)와 EDI(DI)는 감소하고 0이면 증가함.


movsd - dword만큼 복사한다는 의미

※ 바이트 단위
BYTE - 1byte 공간
WORD - 2 byte
DWORD - 4 byte
QWORD - 8 byte

mul, dev, imul, idev는 각 데이터가 곱하거나 나눔으로써 할당된 용량이 부족하게 되므로
두 개의 레지스터를 하나처럼 사용한다.
앞에 i자가 붙은 것은 부호정수를 구분하고, div는 몫과 나머지를 따로 보관한다.
나머지는 EDX(DX), 몫은 EAX(AX)   [EDX | EAX]
CBW - Byte를 Word롤 바꾼다.
CWD - Word를 Dword로 바꾼다.
CDQ - Dworkd를 Quaterword로 바꾼다.

INC는 증가이며 다음과 동일하다.
int a= 10; a ++;
mov eax; 10  inc eax;

1 && 1 참, 1 && 0 거짓
1 || 0 참

2 || 3 = 3
10 + 11

shift 연산은 한 칸 왼쪽으로 옮길 때 마다 2배, 오른쪽으로 갈 때마다 1/2배씩 늘어난다.
LEA는 대괄호 안의 내용을 왼쪽으로 넘긴다. 주소를 복사해 대입한다. (LEA 외에는 주소에 더할 수 없음)

SCAS
- 스캔 스트링, 문자값을 비교한다. EAX
AL(1byte) | AX(2byte) | EAX(4byte)

stos
AL / AX / EAX로 각각 저장하고 EDI레지스터에 복사해 저장한다.

STOSB

REPCR
ESI가 가리키는 값을 EDI에 넣고 ESI와 EF가 한칸 옮기기를 반복, 마지막은 0으로 끝난다.

POP
ESP에 있는 값을 빼온다.
POP ECX
값을 빼올 시에는 실제로 지우지는 않고 ESP만 아래로 옮긴다.

EIP
이번에 실행될 위치가 저장된 레지스터이다.

---------------------------------------------------------------------

조건 분기
JZ(연산 결과과 0dlf Eo JUMP)
JNZ (연산 결과과 0이 아닐 때 JUMP)

Application - 프로그램이 어떻게 만들어졌는가에 대한 저으이
Byte Order - 어떻게 옮긴 것인지
Data Type별 크기 - Int는 4byte로 알고 있지만 사실 64bit운영체제에서는 int는 8byte이다.


■ Big-Endian

상위 바이트의 값이 메모리상에 먼저 표시되는 방법이다.

그림에서 보는것과 같이 메모리의 가장 낮은주소부터 데이터를 채워 나가는 방식이다.

장점> 가독성이 뛰어나고, 대소비교가 빠르다.

■ Little-Endian

Big-Endian과 반대로 하위 바이트의 값이 메모리상에 먼저 표시되는 방법이다.

시스템이 내부적으로 데이터를 처리하는데 있어서 Big-Endian방식을 사용하느냐, Little-Endian방식을 사용하느냐는

CPU에 따라 달라진다. 이를 호스트 바이트 순서라고 하는데 문제는 호스트 바이트 순서가 일정치 않다는 것이다.

Sun, 모토로라계열은 Big-Endian 방식을 사용하고, Intel x86 계열은 Little-Endian 방식을 사용한다.

그러므로 서로 다른 CPU를 장착하고 있는 호스트들이 데이터를 주고 받을 경우

통일된 방식을 이용해서 데이터를 전송하기로 약속했다.

이 방식이 '네트워크 바이트 순서'이다.(Big-Endian 방식만을 사용하기로 약속되어있다)

그러므로 시스템이 Little-Endian 방식을 사용할 경우,

네트워크를 통해 데이터를 전송하기 위해 Big-Endian 방식으로 데이터를 변경해서

보내야만 하고, 받을 때도 Little-Endian 시스템은 전송되어 오는 데이터를 역순으로 조합해야 한다.

장점> 산술연산이 빠르다.

\\\\\\\\\\\\\\\\\\\\\
32bit이므로 4개씩 memory를 가져온다. BASIC 6.0에서 Alt + 8을 누르면 어셈블리어가 불러와지고
F9 - break point
F5 - built & 실행
F10 - 진행
shift + F5 - 원래대로 돌아오기.

ebp는 시작지점이다.

반응형