일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 책
- HTML
- 아파치
- 소프트맥스 함수
- Python
- 딥러닝
- 파이썬
- C언어
- flag
- 오차역전파법
- 코딩
- 역전파
- 신경망
- PHP
- PostgreSQL
- FastAPI
- 우분투
- 기울기
- 백준
- 신경망 학습
- CTF
- 설치
- AdaGrad
- picoCTF
- sgd
- Python Challenge
- 리뷰
- PICO CTF
- 순전파
- Apache2
- Today
- Total
Story of CowHacker
어셈블리 chapter 1 본문
어셈블리의 기본지식에 대해 작성 할것이다.
1. Stack & Heap
1) Stack 이란 함수 호출시 생성되는 지역 변수와 매개 변수가 저장되는 영역이다. ( LIFO 구조 )
2) Heap 이란 필요에 의해 동적으로 메모리를 할당할 때 사용하는 영역이다.
( 스택과는 반대 방향으로 데이터가 쌓인다. )
2. 레지스터
1) 레지스터란 컴퓨터의 프로세서가 자료를 보관하는 아주 빠른 기억 장소이다.
-> 프로세서 : 컴퓨터 내에서 프로그램을 수행하는 녀석이다.
2) 레지스터 종류
- 산술 레지스터 : 덧셈의 덧수, 곱셉의 곱수, 비교 또는 자리가 이동될 단어 등을 보유한 레지스터
ex) eax, ebx, ecx, edx ...
- 범용 레지스터 : 특별한 용도 없이 임의로 사용 가능한 레지스터
ex) eax, ebx, ecx, edx
> ( 일반 적으로 eax는 누산기, ebx는 인덱스, ecx는 카운터, edx는 데이터 용도로 쓰인다. )
- 주소 레지스터 ( 포인터 )
> 스택 포인터 : esp
> 베이스 포인터 : ebp
> 명령 포인터 : eip
- 인덱스 레지스터
> esi : 시작지 인덱스
> edi : 목적지 인덱스
- 상태 레지스터 ( 플래그 레지스터 )
> ZF ( 제로 플래그 ) : 연산 결과가 0일 경우에 참이 된다.
> CF ( 캐리 플래그 ) : 캐리 플래그 부호 없는 숫자의 연산 결과가 비트 범위를 넘어섰을 때 참이 된다.
> AF ( 보조 캐리 플래그 ) : 연산 결과 하위 니블 ( 4bit ) 에서 비트 범위를 넘어섰을 때 참이 된다.
> V / O / W ( 오버플로 플래그 ) : 부호 있는 숫자의 연산 결과가 비트 범위를 넘어섰을때 참이 된다.
> N / S ( 네거티브 플래그, 사인 플래그 ) : 연산 결과가 음수일 때 참이 된다.
> I / E ( 인터럽트 플래그 ) : 이 플래그가 참일 경우에만 인터럽트 요구를 받아들인다.
> PF ( 패리티 플래그 ) : 연산 결과에서 1로된 비트의 수가 짝수일 경우 참이 된다.
> DF ( 디렉션 플래그 ) : 문자열 조작에서 참일 경우 주소 레지스터 값이 자동으로 감소하고, 거짓일 경우 자동으로 증가한다.
> D / T ( 디버그 플래그, 트랩 플래그 ) : 참일 경우 한 명령이 실행할 때마다 인터럽트가 발생한다.
3. 어셈블리 명렁어
- MOV : 데이터 이동
ex) mov eax, ebx; -> ebx레지스터를 eax로 옮긴다.
- LEA : 주소 이동
ex) lea eax, ebx; -> ebx의 주소를 eax에 넣는다.
- PUSH : 스택의 데이터를 쌓는다.
ex) push eax; -> eax 레지스터의 값을 스택에 넣고 esp는 4byte 올라간 값을 가르키게된다.
push 20; -> 20을 스택에 집어 넣는다.
push 40203F; -> 40203F 값을 그대로 스택에 넣는다.
- POP : 스택의 데이터를 뺀다.
ex) pop eax; -> esp가 가리키고 있는 값이 eax에 저장되고 esp는 4byte 내려간 값을 가리키게 된다.
- ADD : 값을 더한다.
ex) add eax, 7; -> eax에 7을 더한다.
- SUB : 값을 뺸다.
ex) sub eax, 7 -> eax에 7을 뺀다.
- INC : 1을 더한다.
ex) inc eax; -> eax에서 1을 더한다.
- DEC : 1을 뺀다.
ex) dec eax; -> eax에서 1을 뺀다.
- NOP : 인자를 받지 않는다.
- CALL : 변경전 eip값을 스택에 저장후 함수를 호출한다.
- RET : call을 통해 호출된 함수에서 다시 복귀할때 사용한다.
- JMP : 변경전 eip값을 저장하지 않고 바로 함수를 호출한다.
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 |
- CMP : 비교를 한다.
'공부 > 어셈블리@_@' 카테고리의 다른 글
어셈블리 chapter 2 (0) | 2020.06.05 |
---|