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
위의 어셈블리어와 동일하게 동작합니다.
여기까지! 입니다!
'Hacking-기초 > 알쓸신잡_해킹' 카테고리의 다른 글
Intel에서의 스택 구조 (0) | 2020.09.07 |
---|---|
어셈블리 operand 사용하는 방식 정리 (0) | 2020.09.02 |
리틀 엔디안, 빅 엔디안 (0) | 2020.08.31 |