티스토리 뷰

Reversing

C언어 Pointer 연산 정리

Tribal 2016. 3. 18. 21:07



int* pptr2 부분이 올바른 표현 방법이다. 포인터를 사용해서 넣을 경우 위와 같은 형식으로 어셈블리어가 구성된다.


*ptr : ptr 변수 내부의 값이 가리키고 있는 값(즉, 변수 c의 값)

ptr : ptr 변수 내부의 값(즉, 변수 c의 주소)

&ptr : ptr 변수의 주소 값


int* pptr1 = *ptr

  1. mov    eax, dword ptr [ptr]
    => 먼저 ptr 이 가리키는 값을 구하려면 일단 ptr 변수 내부의 값부터 알아야 한다. ebp를 기준으로 ptr 변수의 주소를 확인한 후 값을 구한다.
  2. mov    ecx, dword ptr [eax]
    => ptr은 포인터이기 때문에 주소 값을 가지고 있다. 그리고 우리가 원하는 값은 주소 내부에 있기 때문에 eax에 저장된 주소를 기준으로 가져온다.
  3. mov    dword ptr [pptr1] , ecx
    => 원하는 값을 가져왔기 때문에 이것을 pptr1 변수에 그대로 넣어준다.

int* pptr2 = ptr
  1. mov    eax, dword ptr [ptr]
    => ptr 내부에 있는 값인 변수 c의 주소를 eax에 저장
  2. mov    dword ptr [pptr2], eax
    => eax를 pptr2 변수에 그대로 넣어줌

int* pptr3 = &ptr

  1. lea    eax, [ptr]
    => ptr의 주소 자체를 구하려면 ebp의 주소를 기준으로 ptr의 위치만큼 감소시켜야 하는 번거로움이 있다. 그래서 lea를 통해 ptr의 주소를 구한다,
  2. mov    dword ptr [pptr3], eax
    => 지금까지와 같이 pptr3 변수에 그대로 값을 넣어준다.

급하게 정리한 것이라서 그림을 넣으려다가 못 넣어서 조만간 메모리 값이랑 그림까지 함께 넣어야겠다.


'Reversing' 카테고리의 다른 글

[Android] smali 코드 분석 연습  (4) 2017.08.22
Windbg 사용법 정리  (0) 2017.07.16
C++ 클래스 멤버 함수  (0) 2016.07.01
구조체 핸드레이  (0) 2016.04.26
LOBYTE, BYTE1, HIBYTE 매크로  (0) 2016.03.03
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31