nesquitto.tistory.com/95?category=423447

기본적인 내용은 위의 링크에 정리되어 있으며, 여기도 비슷한 내용이 있습니다.

 

위의 링크에서  operand는 함수와 인자의 관계에서 인자에 속한다고 설명했습니다.

이 인자는 어떻게 사용하는지 간단하게 설명하려고 합니다.

 

add rax 0x1234

rax의 값에 0x1234를 더함

add rax rbx

rax의 값에 rbx의 값을 더함

add rax [0x1234]

rax의 값에 0x1234 주소의 값을 더함

 

기본적으로 위와 같이 사용됩니다.

 

Operand로 올 수 있는 값은 다음과 같습니다.

1. 상수값: 일반적인 상수(0x1337, 0xbeef)의 값이 사용됩니다.

2. 레지스터: 레지스터(rax, rbx...)에 들어있는 값이 사용됩니다.

3. 주소값: 레지스터에 저장된 메모리 주소에 들어있는 값이 사용됩니다. C언어의 포인터 개념과 비슷합니다.

레지스터 -> 메모리 주소 -> 참조값  과 같은 형식입니다.

mov   [rcx],rax                   ; *rcx = rax
-mov의 결과로 rax에 들어있는 값을 rcx 레지스터에 들어있는 주소값의 메모리에 저장합니다.

mov   byte ptr [rcx],al           ; *rcx = al
-mov의 결과로 al에 들어있는 값을 rcx 레지스터에 들어있는 주소값의 메모리에 1바이트만 저장합니다.
-al은 ax레지스터가 16bit일 때 뒷부분 8bit를 가리킵니다. 앞부분 8bit는 ah라고 표현합니다.

mov   dword ptr [rbp-1Ch],eax      
-mov의 결과로 eax에 들어있는 값을 rbp에서 1Ch만큼 떨어진 위치의 메모리 주소에 4바이트만 저장합니다.

mov   byte ptr [rdi+rcx*4+3],0xFF
-mov의 결과로 rdi+rcx*4+3의 위치의 메모리에 1바이트 값인 0xff가 저장됩니다.

 

끝!

'Hacking-기초 > 알쓸신잡_해킹' 카테고리의 다른 글

Intel에서의 스택 구조  (0) 2020.09.07
Assembly 문법? 조금 정리  (0) 2020.09.02
리틀 엔디안, 빅 엔디안  (0) 2020.08.31

+ Recent posts