본문 바로가기

정상을향해48

Calling Convention 출처 : www.reversecore.com Calling Convention 우리 말로 '함수 호출 규약'이라고 한다. '함수를 호출할 때 파라미터를 어떤 식으로 전달하고, 스택을 어떻게 정리하는가'에 대한 일종의 약속이다. 우린 이미 함수 호출 전에 파라미터가 스택을 통해 전달된다는 것을 알고 있다. 스택은 프로세스에서 정의된 메모리 공간이며 아래 방향(높은 주소에서 낮은 주소로)으로 자란다. 또한 PE header에 그 크기가 명시되어 있다. 즉, 프로세스가 실행될 때 스택 메모리의 크기가 결정된다. (malloc, new와 같은 동적 메모리 할당과는 다르다.) 질문) 그렇다면 함수가 실행 완료 되었을 때 스택에 들어있던 파라미터는 어떻게 해야 할까? 그대로 놔두면 된다. 스택에 저장된 값을 임시로.. 2013. 11. 10.
Stack Frame 출처 : www.reversecore.com Stack 프로세스에서 스택(stack) 메모리의 역할은 아래와 같다. 1. 함수 내의 로컬 변수 임시 저장 2. 함수 호출 시 파라미터 전달 3. 복귀 주소(return address)를 저장 위와 같은 역할을 수행하기에는 스택의 FILO(First In Last Out) 구조가 아주 유용하다. ※ 스택에 대해서 주의할 점! 1. 32/64bit 컴퓨팅 환경에서 스택 크기는 각각 32/64bit (4/8 byte)이다. 2. 스택은 아래로 자란다. (높은 주소에서 낮은 주소로) - 스택에 값을 입력하면 (PUSH 명령) 스택 포인터는 4bytes 만큼 줄어든다. - 스택에서 값을 가져오면 (POP 명령) 스택 포인터는 4bytes 만큼 늘어난다. Stack .. 2013. 11. 10.
IA-32 Register 출처 : www.reversecore.com Register란? Register란 CPU 내부에 존재하는 저장공간이다. CPU가 RAM에 있는 데이터를 액세스 하기 위해서는 먼 길을 돌아가야 한다. 하지만 레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터를 처리할 수 있다. 단, 가격이 비싸고 용량이 작으며, CPU 아키텍쳐와 밀접한 연관이 있어서 그 개수와 크기를 변경할 수 없다. (변경하려면 CPU 아키텍쳐 자체가 변경되어야 한다.) IA-32 Registers IA-32는 최신 CPU인 만큼 지원하는 기능도 많다. 따라서 그만큼 레지스터도 많이 가지고 있다. Basic program execution registers x87 FPU registers MMX registers XMM registe.. 2013. 11. 10.
[ASM] 어셈블러 : 범용 레지스터 EAX(Accumulator) : 오퍼랜드와 결과 데이터용의 누산기(accumulator) EBX(Base Index) : DS 세그먼트내의 데이터에 대한 포인터 레지스터 ECX(Count) : 문자열 처리 및 루프(loop) 제어용 카운터 EDX(Data) : I/O 포인터 ESI(Source Index) : DS 세그먼트내의 데이터에 대한 포인터 레지스터 EDI(Destination Index) : ES 세그먼트내의 데이터(또는 목적지)에 대한 포인터 ESP(Stack Pointer) : SS 세그먼트내의 스택 포인터 EBP(Base Pointer) : SS 세그먼트내의 스택 포인터 2011. 5. 16.
[C] 포인터 : 배열명 배열명은 그 자체가 주소를 의미한다. int temp[3] = {1, 2, 3}; int *temp_p; 위와 같은 정의가 있을 때, for(i = 0; i < 3; i++) printf("%d", *(temp + i)); // 1번식 for(i = 0; i 2011. 4. 16.
[C] 포인터 : *의 의미 int temp = 0; int *temp_p; temp_p = &temp; *temp_p = temp; printf("temp_p = %d, *temp_p = %d", temp_p, *temp_p); 포인터 변수를 정의할 때의 '*'와 수식에서 사용할 때의 '*'는 다른 의미가 있다. 정의할 때 사용하는 '*'는 주소를 저장할 수 있는 변수를 할당 받는 것이고 수식 내에서 사용된 '*'는 변수에 대한 역참조(dereferencing)를 한다는 의미이다. 이는 역참조 연산자(dereferencing operator)라고 따로 부른다. #include int main() { int *temp_p; *temp_p = 1024; // Segmentatiion Fault 발생 printf("%d\n", *tem.. 2011. 4. 16.