Study/Reversing9 [Reversing] x86(32 bit) / x64(64 bit) 호출규약 함수 호출 규약이란? 함수를 호출할 때 파라미터를 어떤 식으로 전달하는가에 대한 약속이다. X86 함수 호출 규약 (32 bit) 1. __cdecl - C declaration이라는 의미로 C 프로그래밍 언어가 기원한 호출 규약이다 - C 언어에서 사용되며 함수 호출이 반환된 뒤 caller(호출자)에서 스택을 정리한다 (함수 호출 전과 후의 ESP 위치가 같아야 됨!) - 매개변수를 스택에 push해 함수를 호출할 때 전달해준다 (오른쪽에서 왼쪽으로 인자를 스택에 넣는다) - 가변 인수 함수를 만들 때는 반드시 cdecl 호출 규약을 사용해야 한다 - 함수 앞에 __을 추가한다 - 함수 호출규약을 입력하지 않으면 기본값으로 __cdecl이 설정된다 예시 코드 #include int __cdecl cd.. 2020. 9. 14. [Reversing] Stack 구조와 Stack Frame 스택(Stack)이란? - 위 사진에서 가장 아래 쪽에 있는 영역이 스택 영역이다. - 한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out, 후입선출) 형식의 자료 구조이다. - 프로그램이 자동으로 사용하는 임시 메모리 영역으로 함수의 호출과 관계되는 지역변수, 매개변수, 리턴 값 등의 임시 데이터를 저장하는데 사용된다. 1) 코드(텍스트) 영역 - 실행할 프로그램의 소스 코드가 저장되어 있는 영역 - 실행 파일을 구성하는 명령어(함수, 제어문, 상수 등)들이 저장된다 - 저장된 명령어를 CPU에서 하나씩 가져가 처리한다 2) 데이터 영역 - 전역변수와 static 변수, 배열, 구조체 등이 할당되는 영역 - 프로그램 시작과 동시에 할당되고 프로그램이 종료되어야 메모리가 소.. 2020. 9. 8. [Reversing] 32bit 레지스터의 종류와 특징 레지스터란? - CPU의 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치이고 처리 결과 역시 이 곳에 저장된다. - 공간은 작지만 CPU와 직접 연결되어 있어 연산 속도가 메모리보다 훨씬 빠르다. - 종류 > 범용 레지스터 > 인덱스 레지스터 > 포인터 레지스터 > 세그먼트 레지스터 > 플래그 레지스터 1) 범용 레지스터 - 범용적으로 막 쓰는 레지스터로 어셈블리 명령어에서 특정 레지스터를 조작하는데 사용하기도 한다. - 32bit 크기의 레지스터 8개로 구성되어 상수/주소를 저장할 때 쓰인다. - 인덱스 레지스터와 포인터 레지스터는 범용 레지스터에 포함된다. (1) EAX 레지스터 (Extended Accumulator Register) - 누산기라고 불리며 데이터 전송(입출력) 및 연.. 2020. 9. 7. 이전 1 2 다음