[x86] 자주 사용되는 레지스터와 어셈블리 명령어
[1] 어셈블리 ( Assembly ) 가 뭐야?
어셈블리는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어 ( Low Level language)로
0과 1의 이진수를 사람이 알아보는게 한데 이를 보완하기 위해 나온게 어셈블리다.
사람이 일상 생활에서 사용하는 자연어에 가깝게 1~6개의 문자로 기호화해서 나타낸 언어이다.
- 고급언어 : 사람이 이해하기 쉽게 작성된 프로그래밍 언어로 컴퓨터에 대한 전문적인 지식이 없어도 저급언어에 비해 배우거나 다루기 쉽고 가독성이 좋은 사용자 중심의 언어를 말한다 (ex: C, JAVA, C++ ... )
- 저급언어 : 고급언어에 비해 이해하기 어렵고 사용하기 불편하지만 속도가 빠르고 컴퓨터가 처리하기에 좋은 컴퓨터 중심의 언어를 말한다 (ex: 기계어, 어셈블리어 )
[2] 자주 사용되는 레지스터
1. EAX
더하기, 빼기 등 산술/논리 연산을 수행하며함수의 return값이 저장된다.
2. ESP (Stack Point)
스택프레임에서 스택의 가장 윗 부분 주소(현재 스택 주소)가 저장되고
push, pop 명령을 통해 RSP 값이 위아래로 4바이트씩 이동하면서 스택프레임의 크기를 변경하게 된다.
3. EBP (Base Point)
함수가 호출되면 스택프레임이 형성 되는데 이스택스레임의 시작 지점 주소(스택 복귀 주소)가 저장된다.
4. EIP
다음 실행할 명령어의 주소를 가지고 있는 레지스터로
현재 실행중인 명령어가 종료되면 EIP에 있는 명령어를 실행한다
5. SFP ( Stack Frame Pointer )
이전 함수의 EBP 주소를 저장하여 스택프레임을 거치고 난 이후 함수가 돌아가야할 위치를 저장해둔 포인터다.
6. ESI (Extended Source Index)
데이터를 조작하거나, 복사시에 소스 데이터의 주소가 저장됩니다.
[3] 어셈블리 명령어
구조 : [ 명령어 ] [ A ] [ B ]
1. ADD
A에 B를 더하여 A에 저장한다 | |
ex) add eax 20 [ eax = eax + 20 | eax에 20을 더하여 eax에 저장한다 ] |
2. SUB
A에 B를 빼서 A에 저장한다 | |
ex) sub eax 20 [ eax = eax - 20 | eax에 20을 뺴서 eax에 저장한다 ] |
3. MOV
A에 B의 값을 넣는다 | |
ex) mov ebp 20 [ ebp = 20 | ebp에 20을 복사한다 ] |
4. PUSH
스택에 값을 넣는다 => ESP의 값이 4만큼 줄어들고 이 위치에 새로운 값이 채워진다 | |
ex) push reg16 |
5. POP
ESP가 가리키고 위치의 스택 공간에서 4byte만큼을 피연산자에 복사하고 ESP+4를 한다 | |
ex) pop eax |
6. JMP
점프할때 사용하는 명령어로 지정된 레이블 혹은 주소로 점프를 한다 | |
ex) jmp 0x8048452 [ 0x8048452 주소로 점프한다 ] |
7. CALL
함수를 호출해주는 명령어로 호출하기전에 되돌아오기 위해 다음에 실행하는 명령어의 주소를 스택에 저장하고 다음 실행될 명령어의 주소를 스택에 넣고 함수로 진입을 하고 리턴값은 eax에 들어간다. * call과 jmp의 차이는 call은 넘어갔다가 되돌아오지만 jmp는 넘어갔다가 돌아오지 않는다. * |
|
ex) CALL print [ print함수를 호출한다 ] |
8. RET
ESP 레지스터가 가리키는 값을 EIP 레지스터에 저장한다. ESP 레지스터가 가리키는값을 EIP 레지스트리에 저장 한다고 설명했지만 생각해보면 그 전에 CALL 명령어는 함수에 들어가기 이전에 EIP 를 스택에 저장했다. 그리고 함수가 끝나면 스택에 저장된 EIP 주소를 원래 자리에 되돌려놓는거 뿐이다 . |
9. LEA
A에 B의 주소를 넣는 일을 한다 | |
ex) lea eax, dword ptr ds:[esi] [ esi를 eax저장공간에 주소를 넣는 것 따라서 eax엔 esi의 주소가 저장됨 ] |
10. CMP (compare)
인자A, B의 값을 비교. 주로 조건점프 명령어와 세트로 사용한다. |
11. TEST
인자A와 인자B를 AND 연산한다. 이 연산의 결과는 ZF(zero flag)에만 영향을 미치고 Operand 자체에는 영향을 미치지 않는다.
|
12. INC / DEC
INC : 인자의 값을 1 증가 | DEC : 인자의 값을 1 감소 |
13. NOP
아무것도 하지 않음 |
'Reversing' 카테고리의 다른 글
[ PE ( Portable Executable ) 헤더 구조 / 분석 ] (0) | 2021.05.16 |
---|---|
OllyDbg 단축키 (0) | 2021.01.30 |
댓글
이 글 공유하기
다른 글
-
[ PE ( Portable Executable ) 헤더 구조 / 분석 ]
[ PE ( Portable Executable ) 헤더 구조 / 분석 ]
2021.05.16 -
OllyDbg 단축키
OllyDbg 단축키
2021.01.30