어셈블리 명령 포맷

옵코드, 오퍼랜드

"명령어 + 인자"

push 337

mov eax, 1

명령어는 push, mov 같은거를 말한다 좀더 우아한 표현으로 옵코드(opcode)라고 한다.

인자는 어떤 장소로 값을 넣을것인지 또는 명령어에 해당하는 값 등이 된다 이를 고급스러운 표현으로 오퍼랜드(operand)라고 한다.



EAX

EDX

ECXEBX

ESI,EDI



PUSH, POP

스택에 값을 넣는 것을 PUSH, 그리고 스택에 있는 값을 가저오는 것이 POP이다. 프로그래밍을 해본사람치고 스택을 모르는 분은 없으므로 굳이 설명할 필요는 없는 부분이다(PUSHAD, POPAD는 모든 레지스터를 PUSH하고 POP하라는 명령어이다)

오퍼랜드는 push eax, push 1, push edx... 등과 같이 1개만 있으면 된다.


MOV

MOV는 단지 값을 넣는 역할을 한다.

가령 MOV eax, 1은 eax에 1을 넣는 코드가 되고, MOV ebx, ecx는 ebx에 ecx를 넣는 코드가 된다.


LEA

LEA는 주소를 가져와라는 얘기다. MOV가 값을 가져오는 것이라면 LEA는 주소를 가져온다.

따라서 LEA는 가져올 src 오퍼랜드가 주소라는 의미로 대부분[]로 둘러 싸여 있다.


레지스터와 메모리에 다음과 같이 값이 들어있다. 가정한 예제

eis = 0x4010000

*eis = 5640EC83

esp+8 = 0x13FF40

*(esp+8) = 33


lea eax, dword ptr ds:[esi]

esi가 0x4010000이므로 eax에는 0x4010000이 들어온다


mov eax, dword ptr ds:[esi]

esi가 0x4010000이므로 eax에는 0x4010000 번지가 가르키는 5649EC83이라는 값이 들어온다.,


lea eax, dword ptr ss:[esp+8]

esp+8은 스택이며, eax에는 0x13FF40라는 값이 들어온다.


mov eax, dword ptr ss:[esp+8]

esp+8은 스택이며, eax에는 0x13ff40가 가리키는 값인 33이 들어온다


ADD

src에서 dest로 값을 더하는 명령어다. 


SUB

ADD와 반대되는 뺄셈 명령어로 ADD와 쌍으로 생각하자.


INT

인터렙트를 일이크는 명령어다.

뒤의 오퍼랜드로 어떤 숫자가 나오느냐에 따라 각기 다른 처리가 일어난다.

MS-DOS시절에는 애플리케이션에서 즉시 인터럽트를 일으킬 수 있는 무풍지대의 공간이라 INT로 갖가지 응용이 가능했지만 현재의 32비트 시대에서는 애프리케이션 레벨에서의 인터럽트는 한계가 있고, ring0 레벨로 내려가기 전까진 거의 상용할 일이 없는 명령어가 되었다.

아마 리버스엔지니어링을 하다 보면 가장 많이 만나는 것은 INT 3 명령어로 옵코드가 0xCC인 DebugBreak() 정도 일것이다.



CALL

함수를 호출하는 명령어다. CALL 뒤에 오퍼랜드로 번지가 붙는다.

해당 번지를 호출하고 작업이 끝나면 CALL 다음 번지로 되돌아온다.

왜냐하면 CALL로 호출된 코드 안에서는 반드시 RET를 만나게 되어 다시 호출한 쪽으로 돌아오기 때문이다.


INC, DEC

INC는 i++ 이고 DEC는 i-- 라고 생각하자.


AND, OR, XOR

dest와 src를 연산한다. 다만 XOR은 dest와 src를 동일한 오퍼랜드로 처리 가능한데, 예를 들어 XOR EAX, EAX를 수행하면 EAX가 0이 된다.

같은 값으로 Xor을 하면 0이 되기 때문에 XOR로 같은 오퍼랜드를 전달했을 때 이것은 변수를 0으로 초기화하는 효과를 줄 수 있다.

비트연산과 동일하다.


NOP

아무것도 하지 말라는 명령어다. 해킹이나 리버스 엔지니어링에서 가장 많이 쓰이는 명령어이기도 하다.


CMP, JMP

비교해서 점프(이동)하는 명령어


반응형

'Programming > C/C++/C#' 카테고리의 다른 글

C# Network 예제  (0) 2017.06.06
asm - 어셈블리 메시지 박스 띠우기  (0) 2017.01.01
[C#] string 예제  (0) 2016.09.25
C# enum 타입 foreach 예제  (0) 2016.08.04
C++ - 프로퍼티 get set  (0) 2016.07.13
asm - 어셈블리어 기초2  (4) 2016.04.13
asm - 어셈블리어 기초  (1) 2016.04.09
C++ - 비트 출력 해보기  (1) 2016.03.09