ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬 해킹프로그래밍]범용 레지스터
    Python 2015. 1. 9. 15:12

    x86에서의 cpu는 8개의 범용레지스터를 지원합니다!!


    (EAX,EDX,ECX,ESI,EDI,EBP,ESP,EBX) 리버싱하면서 많이 봐왔던건데요~~


    레지스터는 더 있지만 해당 글에서는 '범용 레지스터'를 다룬다는점!!!


    EAX 레지스터는 산술연산수행, 함수 리턴값을 전달하기위해 사용됩니다.


    EAX의 E는 확장이란뜻인 Extend 를 나타내는 걸로알고있구요~ 


    그다음은 accumulator register라고 하네요

    연산을 수행한다는것을 딱 알수있습니다~~


    연산이라 하면 당연히 덧셈,뺄셈,비교같은것을 다루겠죠??


    그리고 리버싱을 할떄에도 함수가 리턴될때 그 값은 EAX레지스터에 저장되기때문에 

    함수가 리턴할때 EAX값을 확인해서 함수호출이 제대로됬는지를 확인할수있습니다!


    EDX레지스터에 대해서 알아봅시다


    우선 Extend data register라고 하구요~ 

    이 레지스터는 전에 배웠던 EAX, 즉 연산레지스터의 확장개념입니다.

    곱셈 나눗셈같은 복잡한(?) 연산을 다룬다고하네요


    일단 EDX는 EAX 레지스터와 같이 다닌다는점!


    이제 ECX레지스터입니다!


    ECX는 Count Register라고 불리웁니당


    반복적으로 수행되는데 반복적이라면 루프를 떠올릴수가있죠!


    예를 하나 들어보자면 


    for문에서 하나씩 반복 하면서 루프가 돕니다.

    그때 ecx값을 사용한단점.. 


    하지만 실제로 리버싱을 해본결과 특정한경우에는 ecx레지스터가 사용할 필요가없을때는

    다른 레지스터를 사용한다는것을 발견했습니다.


    이점은 그냥.. 알아두시면좋구요


    ecx는 값을 감소시키며 하나한 세는 거니 일단 예제소스를 !




    책에서는 while로 나와있으나 저는 틀을 깨며 사는게 제 인생의 쾌락입니다 (죄송합니다)


    이렇게보면 아까 ecx는 감소한다고 했는데 이건 증가로 보입니다 


    말이모순이죠?


    하지만 어셈블리에서는 해당 값이 반대로 감소하는식으로 동작됩니다.


    이점 명심해두세요~~


    자 이제 반복문에서는 효과적으로 데이터를 처리하기위해서 ESI레지스터와 EDI레지스터가 사용됩니다!! 


    ESI레지스터는 Source Index! 해당 레지스터는 입력데이터스트림위치를 나타내기위해 사용됩니다.


    EDI레지스터는 Destination Index , 데이터 연산결과가 저장되는 위치를 나타내는데 사용됩니다.


    출발,도착 ESI와 EDI는 서로 반대되는 성향을 가지고있으니 외우기 쉽겠죠?!


    ESI:읽는다

    EDI:쓴다


    자 이제 엄청나게 중요한 ESP와 EBP!!


    ESP는 Stack Pointer입니다!!

    EBP는 Base Pointer!!


    이 레지스터들은 함수호출, 스택연산에 사용되는데요


    리버싱을 해본분이시라면 메인함수건, 사용자정의함수건


    PUSH EBP

    MOV EBP,ESP이런것을 본적 있으실거에요~


    이걸 스택프레임이라고하는데 

    함수안에서 스택을 마구 사용하니까 값이 변경됩니다.


    그래서 미리 EBP값을 저장해두었다가 나중에 리턴할때 해당값을 저장해놓았다가 불러옵니다

    그럼 아주 정확히 리턴이되겠죠?!!


    이건 간단하게 어덯게 사용되는지 알려드린거구요


    EBP레지스터는 호출 스택의 가장낮은위치를 가리킵니다


    Base니까 밑에 깔아두고 가는거죠

    어떤경우는 컴파일러 코드최적화 옵션때문에 스택프레임 포인터로 사용되는 해당 레지스터를 사용안한다는 점도 기억해두세요!


    반대로 ESP는 스택의 가장 윗끝자락을 가리킵니다


    그래서 함수가 호출될때 ESP레지스터는 해당 리턴주소를 가리키게되는거죠


    자 그리고 마지막으로 EIP입니다!


    EIP는 가리키는 포인터였는데 (영어하자..) 암튼....;;


    이 레지스터는 현재 실행중인 명령의 주소를 가리킵니다.


    만약에 CPU가 PUSH EBP 해당 명령을 실행하면 그다음명령의 주소를 미리 기록해두었다가 실행할때 그 주소를 실행시켜 명령이 실행됩니다


    실행될떄마다 EIP가 사용되니까 엄청 바쁜 친구죠.. ㅠㅠ







    'Python' 카테고리의 다른 글

    [파이썬해킹프로그래밍]my_debugger_defines  (0) 2015.01.12
    [Python]PEFILE MODULE  (0) 2015.01.09
    [파이썬 해킹프로그래밍]C type , Python type  (0) 2015.01.09
    PE Viewer 개발 2일차  (0) 2015.01.07
    PE Viewer 개발 1일차  (0) 2015.01.05

    댓글

Designed by Tistory.