nesquitto.tistory.com/95?category=423447

 

x64 기초

본 포스팅은 DreamHack 사이트의 x64 기초 강의 내용을 요약한 것입니다. 자세한 내용은 사이트에 들어가셔서 보시기 바랍니다. https://dreamhack.io/ 해커들의 놀이터, DreamHack 해킹과 보안에 대한 공부��

nesquitto.tistory.com

이 포스팅에서 어셈블리 언어 부분만 빼서 가져왔습니다.

 


Movement

mov a, b
b를 a에 옮깁니다.

lea a, b
b의 주소를 a에 저장합니다.

 

Arithmetic

-Unary

inc a
++a와 같은 의미입니다.

dec a
--a와 같은 의미입니다.

neg a
-a와 같이 부호를 바꿉니다.

not a
~a와 같이 비트를 반전합니다.

-Binary

add a, b
a에 b의 값을 더합니다.

sub a, b
a에 b의 값을 뺍니다.

imul a, b
a에 b의 값을 곱합니다.

and a, b
a와 b를 and연산한 결과를 a에 저장합니다.

or a, b
a와 b를 or 연산한 결과를 a에 저장합니다.

xor a, b
a와 b를 xor 연산한 결과를 a에 저장합니다.

-Shift

shl a, b
a<<b의 비트 연산을 수행합니다.
a를 b만큼 왼쪽으로 이동합니다.

shr a, b
a>>b의 비트 연산을 수행합니다.
a를 b만큼 오른쪽으로 이동합니다.

sal a, b
a<<b의 연산을 수행하며, 부호가 보전됩니다.(최상위비트는 바뀌지 않습니다.)

sar a, b
a>>b의 연산을 수행하며, 부호가 보전됩니다.(최상위비트는 바뀌지 않습니다.)

 

Conditional

test a, b
and 논리연산을 하지만 결과값을 저장하지 않습니다.
연산 결과가 음수라면 SF가 1이 되고, 연산 결과가 0이라면 ZF가 1이 됩니다.

cmp a, b
sub 논리연산을 하지만 결과값을 저장하지 않습니다.
a, b가 같을 때에는 ZF가 1이 되고, 같지 않을 때에는 0이 됩니다.
a<b일 때에는 CF가 1이 되고, a>b일 때에는 0이 됩니다.
jmp a
a의 주소로 점프합니다.

jcc(je, jne, jg, jge, jl, jle, ja, jb, js, jns) a
특정 조건이 만족되면 a로 점프합니다.

 

Stack

프로그램이 동작하는 함수 내에서는 지역 변수를 사용할 때가 많습니다.

이 지역 변수는 함수 내에서 사용되고 이후 함수가 종료되면 더 이상 사용되지 않기 때문에 쉽게 쓰고 지울 수 있는 스택에 데이터를 저장합니다. 그리고 이 스택은 메모리에 저장이 되는 것이죠. 

intel 아키텍쳐에서의 스택은 새로운 데이터가 추가될 때마다 더 낮은 메모리 주소에 쌓이게 됩니다. 따라서 데이터가 증가할수록 저장되는 주소는 점점 작아지게 됩니다.

 

push rdi
스택에 새로운 데이터를 집어넣습니다.
sub rsp, 8
mov [rsp], rdi
위의 어셈블리어와 동일하게 동작합니다.
데이터가 들어갈 공간을 만들어주고 그 안에 복사하는 것입니다.

pop rdi
스택의 맨 위에 있는 데이터를 뺍니다.
mov rdi, [rsp]
add rsp, 8
위의 어셈블리어와 동일하게 동작합니다.

 

여기까지! 입니다!

+ Recent posts