티스토리 뷰
① 데이터 이동 : mov, lea
② 논리, 연산 : add, sub, inc, dec
③ 흐름제어 : cmp,jmp
④ 프로시져 : call, ret
⑤ 스택조작 : push, pop
⑥ 인터럽트 : int
1) 데이터 이동
1. mov (move data)
- 형식 : mov SOURCE, DESTINATION
- 기능 : SOURCE위치에 들어있는 데이터를 복사하여 DESTINATION위치에 저장.
- 원칙 : 메모리와 레지스터(모든 연산은 레지스터에 저장된뒤 이루어진다.) 사이의 데이터이동, 레지스터와 레지스터 사이의 데이터 이동이나 값을 메모리나 레지스터에 대입할 때 사용한다. (SOURCE와 DESTINATION의 크기가 동일해야 한다.)
# DESTINATION레지스터가 CS가 될수 없다.(프로그램실행위치가 변경되기때문)(CS의 변경은 int, jmp, call, ret등의 명령으로 가능)
# SOURCE와 DESTINATION이 전부 메모리를 가르칠수 없다. (설계상 불가능)
# SOURCE가 직접지정방식일경우에는 DESTINATION은 CS일 수 없다.
2. lea
- 형식 : lea SOURCE, DESTINATION
- 기능 : SOURCE OPERAND에서 지정된 주소를 DESTINATION으로 로드한다. LEA의 주된 용도는 매개변수나 지역변수의 주소를 얻어오는 것이다. 예를 들어C언어에서 지역변수나 매개변수에&연산자를 사용한다면 컴파일러는 lea명령어를 생성한다.
- 원칙 : SOURCE OPERAND는 메모리에 위치해야하며, 변경될 주소는 index register나 DESTINATION에 정의된 주소여야 한다.
2) 논리, 연산 : add, sub, inc, dec
ㄱ. add
- 형식 : add opr1, opr2
- 기능 : opr2의 내용에 op1의 내용이 더해져서 그 결과를 opr2에 저장.
- 원칙 : ! 두 개의 오퍼랜드 모두에 메모리로 조합되는 것은 불가능.
ㄴ. sub (subtract)
- 형식 : sub opr1, opr2
- 기능 : 첫번째 오퍼랜드로 부터 2번째 오퍼랜드 의 내용을 뺀 다음 결과를 첫 번째 오퍼
- 원칙 : ! 메모리끼리는 뺄셈을 할수 없다.
ㄷ. inc (Increment)
- 형식 : inc DESTINATION
- 기능 : DESTINATION을 1 증가시키고 결과값을 다시 저장
ㄹ. dec (decrement)
- 형식 : dec DESTINATION
- 기능 : DESTINATION을 1 감소시키고 결과값을 다시 저장
3) 흐름 제어 : jmp, cmp
1. jmp
- 형식 : jmp proc
- 기능 : 프로그램의 흐름을 바꿀 때 사용. proc의 주소로 가서 그곳의 명령어를 실행.
if/else문, loop문(루프가 아직 끝나지 않았을때, 처음위치로 돌아가기 위해) 등에서 나타난다.
2. cmp
- 형식 : cmp value, value
ex1) cmp %eax, 0 (eax레지스터의 값을 0과 비교한다.)
ex2) je start (비교 결과가 같다면 start로 분기한다. 같지 않다면 je 다음에 오는 명령어를 실행한다.)
- 기능 : 두값을 비교하고 비교결과에 따라 분기한다. 보통 레지스터나 메모리 및 숫자의 크기를 비교한다.
cmp 명령어는Zero, Sign, Overflow 등의 플래그를 set or clear 한다. 이 플래그의 결과에 의해서 Jcc 명령어들은 분기할 것인지를 결정한다. 보통 CMP 명령어 다음에 JE, JNE 등의 jmp관련 명령어가 위치한다.
- 원칙 : cmp 명령은 혼자 사용되지 않고 언제나 조건 점프 명령어나 조건 이동(mov) 명령어와 함께 사용된다.
-조건 점프 명령어:cmp 명령어의 결과에 따라 점프하는 명령어.
************************** 참고 **************************
je : jump equal - 비교 결과가 같을 때 점프
jne : jump not equal - 비교 결과가 다를 때 점프
jz : jump zero - 결과가 0일 때 점프, je와 같음. (cmp 명령에서 결과가 같으면 0을 출력)
jnz : jump not zero - 결과가 0이 아닐 때 점프
ja : jump above - cmp a, b에서 a가 클 때 점프
jae : jump above or equal - 크거나 같을 때 점프
jna : jump not above - 크지 않을 때 점프
jnae : jump not above or equal - 크지 않거나 같지 않을 때 점프
jb : jump below - cmp a, b에서 a가 작을 때 점프
jbe : jump below or equal - 작거나 같을 때 점프
jnb : jump not below - 작지 않을 때 점프
jnbe : jump not below or equal - 작지 않거나 같지 않을 때 점프
jc : jump carry - 캐리 플래그가 1일 때 점프
jnc : jump not carry - 캐리 플래그가 0일 때 점프
jnp/jpo : jump not parity / parity odd - 패리티 플래그가 0일 때 / 홀수일 때 점프
jp/jpe : jump parity / parity even - 패리티 플래그가 1일 때 / 짝수일 때 점프
jecxz : jump ecx zero - ecx 레지스터가 0일때 점프
[+] Signed 계열 (부호가 있는 값)
jg : jump greater - cmp a, b에서 a가 클 때 점프
jge : jump greater or equal - 크거나 같을 때 점프
jng : jump not greater - 크지 않을 때 점프
jnge : jump not greater or equal - 크지 않거나 같지 않을 때 점프
jl : jump less - cmp a, b에서 a가 작을 때 점프
jle : jump less or equal - 작거나 같을 때 점프
jnl : jump not less - 작지 않을 때 점프
jnle : jump not less or equal - 작지 않거나 같지 않을 때 점프
jo/jno : jump overflow / not overflow - 오버플로 플래그가 1일 때 / 0일 때 점프
js/jns : jump sign / not sign - 사인(부호) 플래그가 1일 때(음수) / 0일 때(양수) 점프
조건 점프 명령을 조합하여 if ( a > b ), for, while등의 조건문 구현
********************************************************
4) 프로시져 : call, ret
1. call
- 형식 : call Target
- 기능 : 스택 상에서 CS를 다음에 오는 명령의 오프셋 어드레스를 PUSH하고 target으로 이동한다. 즉, 다른 함수로 제어를 옮긴다는 뜻이다. CALL 명령어 다음에 오는 명령어의 주소를 스택에 PUSH하고 주어진 주소로 제어를 옮긴다는 뜻(EIP를 변경시킴)
# CALL명령은 CALL명령 다음위치에 있는 명령의 주소를 스택에 push한다.
2. ret (return)
- 형식 : ret
- 기능 : 호출된 함수에서 호출한 함수로 복귀. esp에 있는 값을 꺼내서(pop) EIP레지스터에 할당한다. 즉, call명령 당시 push되었던 주소를 pop하여 eip에 넣는 것이다.
5) 스택조작 : push, pop
1. pop
- 형식 : pop DESTINATION
- 기능 : 스택 맨 윗부분(top)에서 하나의 워드를 DESTINATION에 로드(load).
그리고 스택포인터는 그 바로 전의 데이터를 가리킨다(point).
2. push
- 형식 : push DESTINATION
- 기능 : 메모리상에 설정된 스택이라는 공간에 데이터를 저장한다. 스택의 가장 윗부분에 데이터를 저장.
스택 포인터(esp)도 워드크기만큼 증가한다.
6) 인터럽트 : int
- 형식 : int (interrupt-type)
- 기능 : 운영체제에 할당된 인터럽트 영역을 system call.
/** 아래는 출처 입니다. **/
//////////////////////////////////////////////////////////////////////////////////////////
작성자 : bOBaNa
E-mail : zeroone2000@korea.com
작성일 : 2007년 3월 30일
Parse and Parse Assembly
(어셈블리어 입문자를 위한
어셈블리어 자료들의 모음)
에서 가져온 내용입니다. 원작자분께 감사의 뜻을 전합니다.
//////////////////////////////////////////////////////////////////////////////////////////
'OS' 카테고리의 다른 글
[Ubuntu] "error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory" 에러 (1215) | 2014.06.01 |
---|---|
내 컴퓨터에 바로가기, 폴더 추가 (1446) | 2014.01.27 |
리눅스에서 명령어를 못찾을 경우 (1361) | 2013.05.25 |
어셈블리어 모음(Assembly code) (1095) | 2013.03.24 |
Xshell 백스페이스 ^H 해결방법 (1122) | 2013.03.20 |
- Total
- Today
- Yesterday
- 사이버테러
- python
- 분석
- DNSOverHTTPS
- 웹
- CODEGATE 2014
- TISTORY
- 스크립트
- Wargame
- 개발
- FTZ
- 자바스크립트
- 파이썬
- CK Exploit Kit
- 프로그래밍 언어
- writeup
- DoH
- Sublime Text 2
- BOF
- hackerschool
- 웨일브라우저
- 티스토리
- network
- 해커스쿨
- www
- CloudFlare
- 문제풀이
- exploit
- 악성코드
- 프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |