2013. 8. 27. 22:31

어셈블리어 - PUSH,POP 함수

PUSH POP

 

스택 : 스택이란 쌓아 올린 더미를 의미하는데 자료구조에서 기억 장치에 데이터를 일시적으로 겹쳐 쌓아 두었다가 필요할 때에 꺼내서 사용할 수 있게 주기억장치(main memory)나 레지스터(register)의 일부를 할당하여 사용하는 임시 기억장치를 말한다.

라고 네이버백과사전에 나와있었습니다. 스택을.. 어떻게 설명할까 고민중에 그냥 지식백과를 봤습니다.ㅋ

제가 좀 간추려보면 데이터를 임시적으로 저장했다가 필요할 때 꺼내쓰는 임시기억장치입니다.

알아야할점은 먼저 저장되는 데이터는 마지막에 나온다는 것입니다.

조잡하게 만들긴 했지만 ... 저런 구조를 띄고 있습니다.

 

무튼 PUSH POP은 스택에 관련된 명령어입니다.

 

PUSH

예제 : PUSH 인자1

스택에 인자1를 넣습니다(저장)

인자는 하나만 가지며 그자리에 레지스터,정수가 들어갈 수 있습니다 

 

POP

예제 : POP 인자1

스택에서 인자1을 빼냅니다.

스택에 인자1이 저장되 있어야 빼낼 수 있습니다.

 

'어셈블리어' 카테고리의 다른 글

어셈블리어 - CALL,CMP,JMP 함수  (1) 2013.08.27
어셈블리어 - INC,DEC,NOP  (3) 2013.08.27
어셈블리어 - ADD,SUB 함수  (1) 2013.08.27
어셈블리어 - MOV,LEA 명령어  (1) 2013.08.27
어셈블리어 - 레지스터*  (0) 2013.08.27
2013. 8. 27. 01:30

어셈블리어 - CALL,CMP,JMP 함수

CALL! CMP!

함수들은 잘 쓰면 정말 재밌는 함수입니다 ㅋㅋㅋ

그리고 어셈블리어를 쓰면서 자주 등장하는 요주의 인물들(?)입니다.

 

CALL

예제 : CALL 인자1(주소)

CALL 명령어는 인자를 하나만 받습니다.

CALL의 뜻인 '부르다'처럼 인자1를 불러 오는 명령어입니다.

예제

( 00402000 - ADD EAX,100 )

00401000 - CALL 00401000

00402000 주소엔 add 함수가 있고 00401000 주소엔 call 함수가 있습니다.

00401000 주소의 call 문을 실행할 경우 00402000 주소까지 갈 필요없이

00401000 주소를 call문으로 불러 냈으니 그위치의 함수를 실행하게 됩니다.

대충 C언어의 goto문과 비슷한 원리입니다.

 

CMP

예제 : CMP 인자1,인자2

인자 2개를 비교하는 역활을 합니다.

예제

CMP EAX,200

EAX 안에 들어있는 값이랑 200 이랑 비교를 합니다.

근데 여기서 비교만 하면 아무 의미가 없습니다.

비교 한 후 조건이 따라야하는데 그 조건으로 JMP 명령어가 항상 따라옵니다.

CMP 함수가 나올땐 JMP 함수는 항상 붙어있다 생각하시면 됩니다.

JMP 함수는 특정 지역으로 이동(점프)을 하는것입니다.

예제

CMP EAX,EDX

JE 00401000

(JE = 결과가 같을경우 점프 아닐경우 점프를 수행하지않음)

EAX의 값과 EDX의 값을 비교합니다. 그다음 JMP 함수 중 하나인

JE가 비교한 결과를 보고 점프 수행을 할지 안할지 판단 후 시행하게 되는겁니다.

 

JMP 함수의 종류

명령어

 의미

 부등호

 플래그 조건

 JA

 jump if (unsigned) above

 >

 CF = 0 and ZF = 0

 JAE

 jump if (unsigned) above or eual

 >=

 CF = 0 or ZF = 1

 JB

 jump if (unsigned) below

 <

 CF = 1

 JBE

 jump if (unsigned) below or equal

 <=

 CF = 1 or ZF = 1

 JC

 jump if carry flag set

 

 CF = 1

 JCXZ

 jump if CX is 0

 

 CX = 0

 JE

 jump if equal

 ==

 ZF = 1

 JECXZ

 jump if ECX is 0

 

 ECX = 0

 JG

 jump if (signed) greater

 >

 ZF = 0 and SF == OF

 JZ

 jump if zero

 ==

 ZF = 1

 

감사합니당

 

'어셈블리어' 카테고리의 다른 글

어셈블리어 - PUSH,POP 함수  (1) 2013.08.27
어셈블리어 - INC,DEC,NOP  (3) 2013.08.27
어셈블리어 - ADD,SUB 함수  (1) 2013.08.27
어셈블리어 - MOV,LEA 명령어  (1) 2013.08.27
어셈블리어 - 레지스터*  (0) 2013.08.27
2013. 8. 27. 01:25

어셈블리어 - INC,DEC,NOP

INC DEC NOP

함수 들은 뭔가 귀엽고(?) 재밌는 부분이 있습니다.

특히 NOP 함수는 리버스 엔지니어링 쉽게말하자면 크랙을 제작할때 가장 많이 쓰이는

함수명령어입니다.

 

INC

예제 : INC 인자1

인자1에다가 1을 더합니다.

C언어에서의 i++ 와 같습니다.

예제

EAX = 10

INC EAX

위 명령어를 실행하고 나서의 EAX 값은 INC 명령어로 인해 +1 이 되었으므로

EAX = 11 이 될 것입니다.

 

DEC 

예제 : DEC 인자1

인자1에다가 1을 뺍니다.

C언어에서의 i-- 와 같습니다.

예제 

EAX = 10

DEC EAX

위 명령어 실행 후 결과 값은 EAX = 9 가 되있을 것입니다.

 

NOP 

예제 : NOP

이 함수는 유일하게 인자를 받지않습니다.

특정 자리에 NOP로 수정을 해버리면 그자리는 아무 이벤트를 발생시키지 않습니다.

명령어를 무효화 시킨다는 말도 되고 없에 버린단 말도 됩니다.

이 함수로 크랙,핵쉴드 바이패스 등등 아주 유용 나쁘게 쓰입니다.

'어셈블리어' 카테고리의 다른 글

어셈블리어 - PUSH,POP 함수  (1) 2013.08.27
어셈블리어 - CALL,CMP,JMP 함수  (1) 2013.08.27
어셈블리어 - ADD,SUB 함수  (1) 2013.08.27
어셈블리어 - MOV,LEA 명령어  (1) 2013.08.27
어셈블리어 - 레지스터*  (0) 2013.08.27
2013. 8. 27. 01:10

어셈블리어 - ADD,SUB 함수

ADD ... SUB ??

함수는 정말 쉽습니다.

함수의 이름대로 더하고 빼는 역활을 합니다.

 

ADD

예제 : ADD 인자1,인자2

인자2를 인자1와 더해 나온 값을 인자1에 넣는 명령어 입니다.

인자1 + 인자2  =(삽입)=> 인자1 

말이 필요없이 다른 예제를 보여드리겠습니다.

EAX엔 10이 들어있습니다.

ADD EAX,50

명령어를 실행 시키면 EAX엔 무슨 값이 들어가 있을까요?

네! 맞습니다 EAX(10) + 50 =(삽입)=> EAX

답은 60입니다~

 

SUB

예제 : SUB 인자1,인자2

인자2를 인자1에 빼서 나온 값을 인자1에 넣는 명령어입니다.

ADD명령어와 비슷하지만 더하기,빼기의 유일 차이점이 있습니다.

인자1 - 인자2 =(삽입)=> 인자1

예제

EAX엔 15000이 들어있습니다.

SUB EAX,5000

이 명령어를 실행 시키면 EAX엔 무슨 값이 들어가 있을까요?

비밀 댓글로 달아주세요~ ㅋㅋㅋ

맞추시는분들껜 사은품은... 없지만 작은 축하의 말을 해드릴게요 ㅋㅋ

 

이해하기 쉽죠??..그렇겠죠? 그럴거에요 여러분들은 똑똑하시니..

 

2013. 8. 27. 01:00

어셈블리어 - MOV,LEA 명령어

MOV , LEA 명령어란?

자 이제 본격적인 함수 명령어 공부에 들어갈텐데요.

공부하기 전에 이 명령어들은 컴퓨터가 우리 명령을 알아 들을 수 있도록 해주는 것이라는건

명심해야합니다. 간혹 내가왜 이런걸 공부하고 있지? 라시는분들도 계시기때문에..

 

MOV

└MOVE 의 줌말

예제 : mov 인자1,인자2

인자2를 인자1으로 을 넣는 일을 하는 명령어입니다.

레지스터 EAX로 예를 들어본다면

mov eax,100

은 100을 eax 저장공간에 값을 넣는다는 뜻이 됩니다.

그럼 eax엔 100의 값이 저장되있습니다.

주의할 점은 인자하나만으론 이 함수 사용이 안된다는것이고

인자1,2 가 모두 숫자로 이루어 져있으면 안됩니다.

대신 인자1,2에 모두 레지스터로 이루어 져있다면 괜찮습니다. 

LEA

예제 : lea 인자1,인자2

인자2를 인자1으로 주소를 넣는 일을 하는 명령어입니다.

레지스터 EAX,ESI로 예를 들어본다면

lea eax, dword ptr ds:[esi]

은 esi를 eax 저장공간에 주소를 넣는것입니다.

그럼 eax엔 esi의 주소가 저장되있습니다.

 

 

둘의 차이점을 확실히 아셔야합니다.

많이들 해깔려하시더라구요.

 

 

2013. 8. 27. 00:28

어셈블리어 - 레지스터*

레지스터가 뭐죠?

 

 레 지스터 뒤에 * 표시를 한 건 그만큼 중요하단 뜻입니다!

레지스터는 저장공간입니다.

C/C++ 에서는 변수와 같은역활을 하며 메모리에서 연산을 할 때 사용합니다.

기억장치들 중 속도가 가장 빠르며 사용이 편리하지만 이름은 정해져있습니다.

레지스터도 각각의 용도에따라 나뉘어져있는데요.

그 종류를 알아볼거에요

EA(Accumulator)X

흔히 계산용도(사칙연산)로 쓰입니다.

계산할 땐 이 변수를 가장 많이 자주 쓰죠 

ED(Data)X

이것도 EAX와 같은 연산으로 쓰입니다.

EAX를 쓰고있어서 부족할 때 땜빵,덤(?) 으로 쓰인다고 합니닼

EC(Count)X

루프문 반복문 을 사용할 때 카운팅의 역활을 한다고 합니다.

C언어로 예를 들어보면 for문에서 변수 i(Index) 의 역활을 하죠.

하지만 카운팅을 하지않을 땐 EAX EDX 처럼 보통 저장공간으로 연산으로

사용해도 무방하다고 합니다.

EBX

이 레지스터도 별거 없어요 ㅋㅋ

카운트 레지스터(ECX)처럼 특정 목적을 가진게 아니라서

연산으로 사용해도 되고 공간이 좀더 필요할때 사용해도 된답니다~

ESI,EDI

이건 약간 이해가 안가시겠지만 그래도 변수라고 생각하시면 쉽습니다.

다만 EAX~EDX는 주로 연산에 사용되지만

ESI는 문자열이나 반복 데이터 처리, 메모리옮기는데 사용됩니다.

"ESI는 시작지 인덱스"

"EDI는 목적지 인덱스 "

이 말이 재대로 축약된 말인거같습니다.

 

 

 

이처럼 어려운게 전혀 없게 설명을 해놨지만 놓친 부분이 있을 수도 있습니다.

그래도 이 정도로 이해만 했다면 충분히 알고 있는거라고 말할 수 있습니다 ^^

2013. 8. 26. 19:43

어셈블리어 - 어셈블리의 명령어 방식은?

어셈블리의 명령어 방식은?

"명령어 + 인자"

셈블리구조 입니다.....

너무 간단해서 당황하셨을듯;; ㅋㅋㅋ

 

명령어 부분에는 함수, 풀어쓰면 컴퓨터에게 명령을 내릴 단어, 뭔가 있어보이게 예기하자면

옵코드(Opcode)가 들어갈 것 입니다. 뭐 결국은 "명령어 = 옵코드 = 함수(?)" 란 예기입니다.

인자 부분에는 명령에 해당하는 값을 말합니다. 것도 뭔가 있어보이게 예기하자면

오퍼랜드(Operand)가 들어갈 것 입니다. 인자 부분은 최대 2개까지 들어갈수가 있습니다.

눈치가 빠르신분들은 "인자 = 오퍼랜드" 아시겠죠??ㅋㅋ

 

함수는 모든언어에 함수가 있듯이 어셈블리에서도 컴퓨터에게 명령을 내릴 특정 단어들이 있습니다.

명령어라고 하죠?

근데 어셈블리는 다른 언어들보다 비교적 적고 외우기도 쉬우며 재밌기까지(?) 합니다.

이런 비유를 들긴 좀 그렇다만 북극에 빙하가 있다하면 우린 해수면에 떠오른 부분만 외우면 됩니다.

바다 안에 잠겨있는 것들은 많기때문에 그때그때 필요할 때 구글검색엔진을 쓰면 되요.

전부다 외울 필욘없단 소리죠.

 

C/C++언어와 어셈블리의 명령어 방식 을 살펴보면 

우리가 윗옷을 입을 때로 예를 들어봅시다. 

C/C++에선

{

윗옷 입기 시작

옷을 집는다

옷을 입는다

}

로 끝나지만 어셈블리어는 세세한 하나하나 까지 설정을 해야하기 때문에

{

윗옷 입기 시작

옷을 집는다.

왼팔을 옷왼소매에 넣는다

오른팔을 오른소매에 넣는다

머리를 넣는다

올라간 옷을 내린다

}

 

이처럼 좀 복잡하긴하지만 집중해서 하다보면 성실함? 집중력?을 얻으실수 있을겁니다 ㅋㅋㅋㅋ

 

 

'어셈블리어' 카테고리의 다른 글

어셈블리어 - INC,DEC,NOP  (3) 2013.08.27
어셈블리어 - ADD,SUB 함수  (1) 2013.08.27
어셈블리어 - MOV,LEA 명령어  (1) 2013.08.27
어셈블리어 - 레지스터*  (0) 2013.08.27
어셈블리어 - 어셈블리언어가 뭐죠?  (0) 2013.08.25
2013. 8. 25. 18:24

어셈블리어 - 어셈블리언어가 뭐죠?

어셈블리언어가 뭐죠?

 

셈블리언어는 C언어와 C++ 언어랑 같은 프로그래밍 언어 입니다.

하지만 특정 목적의 프로그램을 만들려고 소스를 적어넣을때엔 C/C++ 언어로 10줄의 소스만 적어넣으면 완성이

되는 프로그램이 어셈블리어에선 30줄 가까이 될 수 도 있기때문에 굉장히 복잡하고

 C/C++ 보단 조금 저급한 언어 여서 더 어려울 수 도 있습니다.

그래도 복잡하긴 하지만 기본적인 옵코드알고리즘 , 이동순서 등만 간단히 알면

"아아~ 이렇게 되는구나 *_*!!"

하고 눈이 번쩍 은근 재미를 느낄 수 있으니 포기하지말고 열심히 해봅시다..! ㅋㅋ

 

어셈블리어에선 제일 기초가 되는 옵코드부터 알아보도록 하겠습니다.