진법 변환

study 2012.03.06 08:30

간단한 진법 변환에 대해서 알아보겠습니다. 

아주 기초적면서도 중요한 내용입니다만, 블로그에 제대로 소개한적이 없어서 이번에 제대로 정리해보겠습니다. 


일반적인 사람이 사용하는 진법은 10진법입니다. 컴퓨터는 내부적으로 2진법을 사용합니다. 리버싱에서는 16진법을 사용합니다. 따라서 리버서는 이 세 가지 진법체계(2, 10, 16)를 자유자재로 변환할 줄 알아야 합니다.

보통은 계산기를 사용하면 편합니다만 2진수 <-> 16진수 변환 과정은 리버싱에 자주 등장하기 때문에 암산으로 가능하도록 숙달하는 것이 좋습니다. 




기본 진법


 진 법 숫 자 설 명   
 2 (Binary)  0, 1  ON, OFF 1111(2), 1111b
 10 (Decimal)  0 ~ 9  사람이 익숙한 숫자 체계 15(10), 15d
 16 (Hexadecimal)  0 ~ 9, A ~ F  2진법을 1/4로 줄여서 보여줌  F(16), Fh

* 참고

16진수는 2진수를 1/4로 압축시켜 보여주는 효과가 있습니다. 즉, 4 자리의 2진수가 1 자리의 16진수로 간단히 표현됩니다. 

예) 15(10) = 1111(2) = F(16)




변환 방법


학창시절에 배웠던 진법 변환 방법의 기억을 되살려 보겠습니다.

#1. 2진수 <-> 10진수 

1) 9(10) -> 1001(2)



2) 1001(2) ->  9(10)


3) 30(10) -> 11110(2)



4) 11110(2) ->  30(10) 


변환 방법은 매우 간단합니다. 기억이 새록새록 나시죠?  


#2. 10진수 <-> 16진수

1) 123(10) -> 7B(16)


2) 7B(16) -> 123(10)


3) 500(10) -> 1F4(16)



4) 1F4(16) -> 500(10) 


여기까지는 변환 원리만 기억하시고 실제로는 계산기를 사용하시는것이 편리합니다.

리버서에게 중요한 것은 아래의 2진수 <-> 16진수 변환을 암산(수작업)으로 해내는 능력입니다.

#3. 2진수 <-> 16진수



<2진수 테이블>


위 테이블에서는 1 ~ 15 까지의 숫자를 각각 10, 16, 2 진수로 보여주고 있습니다. 

눈여겨 보실 내용은 4 자리의 2 진수를 1 자리의 16진수로 표현 가능하다는 것입니다.
'4 자리의 2 진수' 라는 말은 4 bit 라고 바꿔 말 할 수 있고, 8 bit(1 byte) 는 '8 자리의 2 진수' 이며 이는 2 자리의 16 진수입니다.

즉, 1 byte 는 2 자리의 16 진수로 간단히 표현(00 ~ FF)이 가능하다는 뜻입니다. 이런 특성 때문에 컴퓨터 공학에서는 16진수로 숫자를 표현하는 것이 편리합니다. (1 byte 로 저장할 수 있는 숫자를 10 진수로 표현하면 0 ~ 255 이며 세 자리수가 필요합니다.)

위의 테이블을 다 외우시면 물론 좋습니다만 처음에는 빨간색으로 표시한 2(0010), 4(0100), 8(1000), A(1010), C(1100)만 외우셔도 됩니다. 파란색으로 표시한 1(0001), F(1111)는 간단하니까 한번 보면 저절로 외워지고요. 나머지 숫자는 빨간색 숫자에서 계산하시면 됩니다. 계산 방법은 아래와 같습니다.


3(0011) = 2(0010) + 1(0001)
5(0101) = 4(0100) + 1(0001) 
6(0110) = 4(0100) + 2(0010)
7(0111) = 8(1000) - 1(0001)
9(1001) = 
8(1000) + 1(0001)
B(1011) = A(1010) + 1(0001)

D(1101) = C(1100) + 1(0001)
E(1110) = F(1111) - 1(0001) 


간단한 예제를 살펴보겠습니다.

변환 요령은 "16진수는 한 자리씩 끊고, 2진수는 네 자리씩 끊는다" 입니다. 그리고 위 테이블을 보면서 변환하시면 됩니다. (조금만 숙달되도 암산으로 가능해 집니다.)  

1) 7F(16) -> 01111111(2)


2) 3D6A921E(16) -> 00111101 01101010 10010010 00011110(2)


3) 10101100(2) -> AC(16)




진법 변환 활용


이러한 16진수 <-> 2진수 진법 변환을 왜 공부해야 할까요?

리버싱 분야에서 다양한 활용 예가 있습니다.

IA32 Instruction Table 을 해석을 위해 ModR/M, SIB, Group ID 등을 계산할 때 필요합니다.


<그림 - IA32 Instruction Format : 출처 Intel Manual>


<그림 - ModR/M Byte : 출처 Intel Manual>

EFLAGS 레지스터는 각 bit 가 flag 를 의미합니다. 이러한 bit flag 연산에 진법 변환이 필요합니다.


 <그림 - EFLAGS : 출처 Intel Manual> 

 Win32 API 의 파라미터 중에 Flag 를 bit 로 표시하는 경우가 많습니다.

HANDLE WINAPI CreateFile(

  __in      LPCTSTR lpFileName,

  __in      DWORD dwDesiredAccess,

  __in      DWORD dwShareMode,

  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,

  __in      DWORD dwCreationDisposition,

  __in      DWORD dwFlagsAndAttributes,

  __in_opt  HANDLE hTemplateFile

);


* 출처 : MSDN


CreateFile() API 의 6 번째 파라미터 dwFlagsAndAttributes 는 아래와 같이 bit flag 로 이루어져 있습니다.


<그림 -  dwFlagsAndAttributes 설명 일부 : 출처 MSDN>  

이외에도 디버깅을 하다보면 각종 bit 연산이 나타나는데 16진수 <-> 2진수 변환 방법을 알고 있으면 코드를 이해하는데 크게 도움이 됩니다.

지금까지 매우 기초적이면서도 중요한 진법 변환에 대하여 알아보았습니다. 잘 활용하시기 바랍니다.


개인적으로 백만년 만의 포스팅이네요. 이 포스팅을 시작으로 블로그 활동을 재개합니다. ^^~

* 얼마전 회사를 떠나서... 사회에 첫 발을 내디딘... 혹은 학교로 복귀한... 15기 인턴들 모두 화이팅~~~




ReverseCore
저작자 표시 비영리 변경 금지
신고
  1. 2012.03.06 08:52 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  2. 2012.03.06 09:30 신고 댓글주소 | 수정 | 삭제 | 댓글

    잘봤습니다 ^^*

  3. 2012.03.06 17:07 신고 댓글주소 | 수정 | 삭제 | 댓글

    해쿨을 통해 오게되엇는데,
    딱 오늘 문제 풀면서 다시 생각해보게된 진법이네요 ..ㅎ
    알바 시작하면서 일이업어 공부를 다시 시작하게되었는데.
    많은 포스팅 부탁드려요 ㅋ
    잘봣습니당.ㅎ

  4. 투게더 2012.03.06 22:07 신고 댓글주소 | 수정 | 삭제 | 댓글

    블로그를 통해 배우고 있는 학생입니다
    책이 출판되기를 목빠지게 기다리고 있습니다ㅎ
    3월달 안에 나오겠지요?

  5. hcscp 2012.03.07 09:45 신고 댓글주소 | 수정 | 삭제 | 댓글

    다시 포스팅 하시는군요 ㅎ
    매번 기억 상기시킬겸 많은 도움됩니다.
    여름쯤 책 출판시 바로 구매하고 싶네요 ㅎ
    감사합니다. 수고하세요:>

  6. 9rand 2012.03.07 13:52 신고 댓글주소 | 수정 | 삭제 | 댓글

    다시 글을 써주신다니 감사합니다.. 15기는 무엇..

  7. 궁금 2012.03.08 00:26 신고 댓글주소 | 수정 | 삭제 | 댓글

    ModR/M, SIB, Group ID 변환하는게 잘 이해가 되지 않습니다.
    이게 전공책을 봐도 잘 이해가 안 되는 부분인데
    어떻게 쓰이는지 자세한 예를 좀 알 수 있을까요?
    감사합니다.

    • reversecore 2012.03.09 00:41 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      저 애들은 모두 IA32 Instruction 을 해석할 때 사용됩니다. ModR/M, SIB 는 각각 1 byte 크기이며 이걸 bit 단위로 3 등분으로 쪼개서 사용됩니다. 인텔 매뉴얼에서 제공되는 테이블 보는 방법이랑 Instruction 해석하는 방법을 배우시면 됩니다. (GroupID 는 ModR/M 을 같이 사용합니다.)

      IA32 Instruction 해석 방법은 제가 쓴 책에는 포함되어 있는데, 블로그에는 그 내용이 없습니다. 다른 사이트에서 정보를 얻으시는 것이 좋을 것 같습니다.

      인텔 매뉴얼을 직접 보시고 공부하셔도 됩니다만 너무 방대하고 혼자 익히려면 시간도 많이 걸립니다. 제가 신규직원들을 가르쳐보니 한시간이면 곧 잘 하더군요. 그런데 정작 제가 혼자 공부할 때는 1주일이 걸렸었습니다.

      감사합니다.

  8. letmeln 2012.03.09 00:58 신고 댓글주소 | 수정 | 삭제 | 댓글

    책은 언제쯤 나오나요.. 기다리고 있습니다만..

  9. 모리 2012.03.13 11:39 신고 댓글주소 | 수정 | 삭제 | 댓글

    자료 감사해요

  10. windofme 2012.03.14 04:50 신고 댓글주소 | 수정 | 삭제 | 댓글

    몇년전에 패커 때문에 들락 거리면서 이것 저것 주워 보고 하면서 블로그를 헤짚고 다녔었는데 오랜만에 다시 방문해서 다시보니 항상 새롭습니다.

    요것 조것 보고 배운덕분에 취직도 하고 밥벌이로 삼을 기술이 되어 버렸네요
    감사하다는 글 한편 남기고 싶어서 한자 적고 가겠습니다.

    언제 한번 궁금한거 한보따리랑 소주나 싸들고 한번 뵙고 싶네요 ㅎㅎ

    계속 좋은글 부탁드립니다.

  11. 감염오리 2012.03.16 23:46 신고 댓글주소 | 수정 | 삭제 | 댓글

    오랜만의 포스팅이네요^^
    최근들어 학교 공부(저는 중학생이라서요 ㅠㅜ)에 매진하고, JAVA언어가 끌려서 공부하는 중인데...
    하아... 리버싱을 최근 2달동안 거의 안해본 것 같습니다... 흥미도 떨어진 것 같고... 어떠한 문제가 주어졌을 때 그 문제를 해결할때 느끼는 성취감으로 약 7개월 정도 했었습니다만, 어느 정도의 시기가 되니, 제가 풀기에는 너무 쉽거나(이미 풀어본 것들 말이죠^^) 너무 어려운 것들만 있어서...
    조언 부탁드려도 될까요??? 리버싱을 어떻게 해 나아가야 할지...ㅠㅜ

  12. 2012.06.19 07:56 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  13. 학생 2012.10.18 02:54 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하십니까 ^.^

    저는 공학생입니다..ㅎㅎ 제가 진법변환에관한 부분을듣고있고 저만의 교재를만드는데 여기서본내용을 인용해도될런지요 ?^^ 상업적으로 사용하는게아니라 제가 교재로만들어 보관하고 읽고 하려고하는데 괜찬을까요 이런말드리는게 부담스러울지 걱정되네요

    • reversecore 2012.10.19 01:31 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      먼저 질문을 해주셔서 감사합니다.

      개인적으로 혼자면 보시고 쓰실 거라면 전부 인용하셔도 좋습니다.

      혹시 다른 사람에게 전달하실 예정이라면 출처만 밝혀주시면 감사하겠습니다. ^^~

  14. 학생 2012.11.07 21:03 신고 댓글주소 | 수정 | 삭제 | 댓글

    참고하고갑니다. 감사합니다.

  15. 여기다써도될지.. 2013.06.22 01:21 신고 댓글주소 | 수정 | 삭제 | 댓글

    크랙미와 키젠미를 풀고 언팩미를 푸는도중
    Themida 로 패킹한 프로그램중 디버거를 감지하여 프로그램자체가 실행이되지않는경우는
    올리디버거 플러그인 옵션을 사용하라는데 64비트에서는 ollydbg200 플러그인이 사용안되는가요?

  16. 2014.12.30 17:55 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  17. 무료 2017.02.07 08:47 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  18. 무료 2017.04.02 09:41 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다





티스토리 툴바