32 bit 운영체제는 메모리를 0부터 4,294,967,296 만큼 저장할수있고,
64 bit 운영체제는 메모리를 0부터 18,446,744,073,709,551,616 만큼 저장할수있다.
사용하는 메모리 RAM의 용량에도 제한이 있는데, 32bit 컴퓨터에서는 RAM이 최대 4gb까지 들어간다.
32bit 컴퓨터에서 아무리 많은 용량의 ram을 달아봤자, 결국에는 4byte ram의 효과만 보는것이다.
64bit 컴퓨터에서는 최대 1tb ( 2^10 gb) 만큼의 RAM이 들어간다.
레지스터의 용량이 클수록 메모리에서 더 많은 데이터를 가져와 저장할 수 있어서 처리속도도 빨라진다.
32bit Register : EAX E(Extended)
64bit Register : RAX
64bit 레지스터
범용 레지스터
특정한 용도를 정해두지 않고 다양하게 쓸 수 있는 레지스터이다.
x64 범용 레지스터는 16개
rax rcx r8 r9 r10 r11 rbx rsi rdi rbp r12 r13 r14 r15 rsp rip가 있다.
원칙적으로 용도가 정해져 있지 않지만 관행적으로 쓰임새가 정해져 있는경우도 있다.
rax
함수가 실행된 후 리턴값을 저장 하기 위해 쓰인다. 어떤 함수의 실행이 종료되고 나면 해당 함수의 결과값이 반환될 때 이 rax 레지스터에 담겨 반환된다. 그러나 rax가 리턴값을 위해서만 쓰이는 것은 아니다. 함수가 반환되기 전까지 범용 레지스터로 자유롭게 사용되다가, 종료 후 리턴값을 반환하기 위한 레지스터로는 rax만이 사용된다.
rcx, rdx, r8, r9
x64의 범용 레지스터들 중에서는 함수가 실행될 때 필요한 인자들을 저장하는 용도로 사용하는 레지스터
Windows 64bit에서 함수를 호출할 때 필요한 인자들을 순서대로 저장한다.
첫번째 인자는 rcx에, 두번째 인자는 rdx에, 세번째 인자는 r8에, 네번째 인자는 r9에 하는 방식으로 인자를 레지스터에 담아 함수를 호출한다.
rsp
16개의 범용 레지스터들 중 하나로 분류되지만, 다른 범용 레지스터들과 달리 용도가 정해져 있다.
rsp는 스택 포인터(Stack Pointer)로, 스택의 가장 위쪽 주소를 가리킨다. 스택은 함수가 사용할 지역 변수들(local variables)을 저장하기 위해 준비해놓는 공간이다
rip
명령어포인터이다. 다음에 실행될 명령어가 위치한 주소를 가리키고 있다. 즉 프로그램의 실행 흐름과 관련된 중요한 레지스터이므로, 범용으로 사용되지 않는 레지스터이다.
시스템 호출시 범용 레지스터 표 표현
시스템 호출 번호 | rax | 함수의 systemcall번호 갖는다. |
반환주소 | rcx | systemcall 호출했던 응용프로그램의 return주소 갖는다. systemcall 끝난후에 return 주소를 rcx값으로 채운다. |
레지스터 플래그 | r11 | 이전 플래그 레지스터 systemcall이 끝난후, 플래그를 r11값으로 채운다. |
매개변수 | rdi rsi rdx r10 r8 r9 |
첫번째 인자 두번째 인자 세번째 인자 네번째 인자 다섯번째 인자 여섯번째 인자 |
32bit 64bit 호출 규약
64bit 환경에서는 rax, rbx, rcx, rdx, rbp, rsp, rsi, rdi + r8~r15 16개가 있다.
함수 호출할때는 최소 6개의 정수/ 포인터 인자는 rdi, rsi, rdx, rcx, r8, r9로 넘겨지고 그 이상은 매개변수가 전달되야 할때 스택을 통해 전달한다.
실수인자는 xmm0 ~ xmm7까지 8개의 레지스터를 순서대로 사용하여 전달하고 그 이상이면 스택을 통해서 한다.
32bit 호출규약
1. cdecl
c 언어에서 사용되는 방식이고 함수호출한 곳 스택을 정리한다.
2. stdcall
Win32 API에서 사용되고 cdecl과 반대로 Callee에서 스택을 정리한다.
3. fastcall
stdcall방식과 같지만 함수에 전달하는 매개변수 일부(2개까지)를 스택이 아닌 레지스터를 이용한다.
ECX, EDX레지스터를 사용해서 함수에 매개변수를 전달한다.
64bit 호출규약
32bit cpu일떄는 여러개지만 64bit CPU는 fastcall호출규약1개를 사용한다.
[참고]
https://sunrinjuntae.tistory.com/34
[Reversing] 32bit와 64bit의 차이 ( 함수호출규약, 레지스터 )
[ 1. 기본적인 차이 ] 일단, 비트가 무슨 의미인지 알아보자. 비트 ( bit )란, 2진수 0과 1을 포함할수있는 크기를 말한다. 이러한 비트가 2^3 ( 8 )개가있으면 바이트 ( byte ) 이다. 이러한 바이트가 2^10
sunrinjuntae.tistory.com
https://sewcode.tistory.com/13
[ASM] 64bit 환경에서의 레지스터와 리눅스 함수 호출 규약
libasm은 맥 OS 64bit 환경에서 인텔 어셈블리를 이용하여 진행되기 때문에, 이를 기준으로 정리하였습니다. 범용 레지스터 우선, 16bit의 레지스터는 각 레지스터 이름의 약자로 이루어져 있습니다(e
sewcode.tistory.com
https://dreamhack.io/learn/3/20#11
로그인 | Dreamhack
dreamhack.io
https://koharinn.tistory.com/224
Stack Frame & 함수 호출 규약 (32bit, 64bit)
스택은 임시 데이터를 저장하는 공간이다. 메모리에서 계속 데이터를 가져오기보다, 스택에 저장해서 접근하는 방식이다. 빈번하게 사용하는 데이터를 레지스터에 넣는다. 함수 프롤로그와 에
koharinn.tistory.com
'보안 > 리버싱' 카테고리의 다른 글
[리버싱]드림핵 rev-basic-2 풀이 (0) | 2021.09.25 |
---|---|
[리버싱]어셈블리명령어 정리 (0) | 2021.09.25 |
[리버싱]crackme 1번문제 풀이 (0) | 2021.09.11 |
[리버싱] 드림핵 rev-basic-1 풀이 (0) | 2021.09.11 |
[리버싱] 드림핵 rev-basic-0 풀이 (0) | 2021.09.11 |