ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ARM에서 PC 레지스터가 낳은 의문점
    ETC/Pwn 메모장 2019. 6. 11. 22:55

     

    PC 레지스터는 다음 실행할 명령의 주소를 담고 있다. 그렇다면 대체로 그 다음 주소값이 PC 레지스터에 들어가는 것이 맞을것이라고 생각한다. (intel arch에서 eip와 비슷하다면)

     

    하지만 eip와는 다르게 PC 레지스터에는 다음 다음 실행할 명령의 주소를 담고 있다. 왜일까?


    ARM Information Center에서는 다음과 같이 나와있다.

    실행하는 동안 pc는 현재 실행되는 명령어의 주소를 포함하지 않습니다. 현재 실행되는 명령어의 주소는 일반적으로 ARM의 경우 pc-8이거나 Thumb의 경우 pc-4입니다.

    그 이유는 정확히 설명은 되어 있지 않지만, 구글링 결과 ARM은

    fetch(명령어 가져와서) -> decode(해석하고) -> execute(실행)

    이 3가지 과정을 거치게 되는데, 이러한 방법은 다음과 같이 실행이 된다.


    실행할 명령어가 총 A, B, C 3개가 있다고 하자. 이때, ARM arch은 명령어의 주소가 word단위로 나뉘므로

    fetch -> decode -> execute

      A

      B           A

      C           B            A

    A 명령어가 fetch 되고, decode 되는 동안 B 명령어가 fetch 되며, A 명령어가 execute 되는 동안 B 명령어는 decode 되며 C명령어는 fetch 된다.

    말이 길어졌지만, 이 말의 의미는 A 명령어가 실행되기 위해서는 cycle이 2번(2 words, 8 bytes)돌아야 한다. 따라서 PC 레지스터에 A 명령어가 들어가는 시점은 cycle이 두번 돌기 전 즉, fetch 단계에 들어가므로 현재 실행 명령어의 주소에 +8 bytes를 해주어야 한다.


    정리해보면, ARM architechture 에서 PC 레지스터는 다음 실행 명령어를 가르킨다. 이때, 다음 명령어의 실행은 현재 명령어의 2 cycle뒤에 실행되므로, 다음 명령어 주소(PC) == 현재 명령어 주소 + 8 이며, 반대로 현재 명령어 주소 == 다음 명령어 주소(PC) - 8 이다.


    참고 문헌

    https://stackoverflow.com/questions/24091566/why-does-the-arm-pc-register-point-to-the-instruction-after-the-next-one-to-be-e

    'ETC > Pwn 메모장' 카테고리의 다른 글

    shellcode 작성 시 null byte 제거하기  (0) 2019.06.20
    Double Free buggggggg  (0) 2019.06.14
    python code debugging  (0) 2019.06.14
    push, pop  (0) 2018.04.11
    64비트 인자  (0) 2018.04.11

    댓글

Designed by Tistory.