ipwn
[Reversing] 어셈블리어 본문
MOV 명령어
어셈블리어에서 mov 명령어가 하는 역할은 간단하다.
mov는 좌변에 우변(혹은 상수)의 값을 입력하는 것이다.
mov eax, 1 (eax에 1을 덮어씌움)
이것은 C언어에서 int eax = 1 과 같은 의미이다.
int eax = 1;
eax = 2;
위의 코드를 수행하다면 변수 eax는 1을 담는 것이 아니라 2를 담고있을 것이다.
마찬가지로
mov eax, 1
mov eax, 2
위의 명령을 수행하면 eax에 들어있는 값은 1이 아닌 2가 된다.
mov 명령은 위의 예시처럼 레지스터에 1이라는 직접적인 값을 집어넣을 수 도 있지만
mov reg1, reg2 처럼 reg2에 있는 값을 reg1에 집어넣을 수도 있습니다.
EX)
mov eax, 1
mov ebx, eax
결과 : eax 와 ebx 에는 1이라는 값이 들어가 있다.
LEA 명령어
lea는 좌변(레지스터만 가능)에 우변의 주소값을 입력하는 것이다.
즉 lea 인자1, 인자2
라고 한다면 인자1에 인자2의 주솟값을 넣어준다고 할 수 있다.
EX)
lea eax,dword ptr ds:[esi]
위의 명령을 수행한다면 eax의 공간에 esi의 주소를 저장하는 것이다.
DWORD PTR DS(SS):[?] 명령어
dword ptr 은 해당 주소에서 double word(32비트(4byte)) 를 읽겠다는 뜻이다.(int 형)
byte ptr도 물론 있다.
ptr 뒤에 오는 SS나 DS는 둘다 세그먼트 레지스트인데, SS는 스택 세그먼트 DS는 데이터 세그먼트이다.
Call 명령어
함수 호출시 사용되는 명령어이다.
사용법은 아래와 같이
"call function"
이런 방식으로 사용되는데, function을 불러오겠다는 의미이다.
Push 명령어
push 명령어는 스택에 집어넣을 때 쓰는 명령어인데, 사용법은 아래와 같다.
"push 인자"
위 명령을 실행하게 된다면
인자를 스택 영역에 저장하게 된다.
인자는 단 한 개만 가지며 그 자리에 레지스터, 정수 등이 들어갈 수 있다.
Pop 명령어
pop 명령어는 push 명렁어와는 반대로 스택영역에서 꺼내올때 사용하는 명령어이다.
사용법은 아래와 같다.
"pop 인자"
이 명령을 수행하게 된다면 인자를 스택 영역에서 꺼내오게 된다.
'Reversing' 카테고리의 다른 글
[Reversing] 함수 프롤로그, 함수 에필로그, 스택 프레임 (0) | 2018.01.08 |
---|