반응형

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

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

일반적인 사람이 사용하는 진법은 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

반응형
반응형

안녕하세요. ReverseCore 입니다. 

책 원고 작성을 완료하였습니다.

모든 컨텐츠 작성을 마치고 자체 퇴고(8회)를 완료하였습니다.

이제 출판사에 넘겨줄 수 있겠네요. ^^~



<퇴고 작업을 도와준 아이패드>


분량


8섹션, 61챕터, A4 기준 1000 페이지 입니다.
885 개의 이미지와 65 개의 소스파일이 담겨있습니다.
책 이름도 결정 하였습니다. (나중에 공개할 께요~ ^^)


내용


기존 블로그의 내용 60% + 새로운 컨텐츠 40% 로 구성하였습니다.

블로그에 있는 내용들은 Windows XP + Visual C++ 6.0/2008 환경에서 작업했었습니다. 이를 최신 Windows 7 32bit + Visual C++ 2010 환경으로 재작업을 하였구요. 컨텐츠들의 순서 조정에 많은 고민을 하였습니다.

새로 추가된 내용들은 아래와 같습니다.


64 bit Computing / Debugging
고급 리버싱 (TLS, TEB, PEB, SEH, IA-32 Instruction 해석)
Anti-Debugging (Static, Dynamic, Advanced)
디버깅 실습 (Service, Self-Creation, PEImageSwitching, DebugBlocker)
 



일정


2010년 5월 1일 책을 쓰기로 마음 먹고 2011년 12월 3일 원고를 마감하였네요. 원고 작업만 19 개월 소요되었군요. (블로그 시작한날인 2009년 2월부터 따져보면 벌써 약 33 개월이 지났네요.)

아직까지는 제 인생 최대의 프로젝트라고 말할 수 있겠습니다. ^^

2011년 6월말쯤 8장 마지막 챕터를 끝내고 책에 뭐 빼먹은게 없나 살펴보니, 문득 제가 애초에 기획했던 모든 컨텐츠 작성을 끝냈다는 사실을 깨달았습니다.

약간 멍~ 했죠. 조금 재충전을 하고 퇴고 작업에 들어갔습니다. 노트북으로 들고 다니며 보는데 한계가 있어서 문서를 출력해서 보다가 분량이 너무 많아서 힘들었습니다. 그래서 아이패드에 문서를 전부 입력하고 PDF Viewer 앱과 터치펜으로 퇴고 작업을 했습니다. (퍼포먼스가 확 향상되더군요.) 약 5 개월간의 기나긴 퇴고 작업 끝에 드디어 원고를 탈고 할 수 있었습니다.

마침 아내가 아기와 외출한 시간(12월 3일 토요일 오후 6시)에 제가 계획한 8 단계 퇴고작업의 마지막 작업을 끝마칠 수 있었네요. 


소감


일단 기분이 몹시 좋습니다. 몸과 마음이 날아갈듯 하네요. ^^ 
마치 오랜 여행을 마치고 집에 돌아온 느낌이 드네요. 기쁜 마음에 이렇게 블로그에 글을 올려 봅니다. 


# 작업 속도

책을 쓸 때는 생각보다 작업 속도가 너무 느려서 도대체 언제쯤 책이 완성될 수 있을까 싶었습니다. 하루에 그림 하나 또는 캡쳐 두개 정도 밖에 못 할 때도 많았거든요. 하지만 그런 날들이 하루 이틀 쌓이니까 어느 순간부터는 "내가 언제 이렇게 많은 일을 했지?" 라는 생각이 들면서 목표 지점이 희미하게나마 보이기 시작했습니다. 


# 재작업

책을 쓰면서 가장 힘들었던 순간은 이미 한번 쓴 글을 두번 세번 다시 쓸 때 였습니다. 독자분들께 최신의 리버싱 경험을 드리기 위해 개발도구를 Visual C++ 2010 으로 바꾸고 작업환경을 Windows 7 으로 바꾸었습니다. 그러다보니 기존 문서를 그에 맞게 다시 캡쳐하고 변경된 주소를 찾아 고치는 작업들이 많았습니다. 지금와서 뒤돌아보니 그런 작업들이 가장 기억에 많이 남습니다. 


# 슬럼프

10 여회의 크고 작은 슬럼프를 경험하였습니다. 수많은 재작업과 검증, 생각대로 나오지 않는 글쓰기, 예상보다 훨씬 오래 걸리는 시간, 개인적인 외부 요인 등으로 인해서 글을 쓰지도 못하고 글쓰기 자체가 싫어지는 상황이 몇 번 닥쳤었죠. 스트레스가 쌓인 겁니다.

제가 새벽에 일어나 글을 쓰는 책상이 있는데요, 어느 순간에는 그쪽을 쳐다보기도 싫어지더군요. 그리고 저녁에는 퇴근 후 글을 쓰러 찾아가는 도서관이 있습니다. 한때는 그쪽으로 발길이 도저히 떨어지지 않는 날도 많았습니다.

다행인것은 그때마다 제 자신이 슬럼프 상황인걸 인식하고 극복하려고 노력했다는 것입니다.


# 응원

가끔 블로그에 방문해서 댓글에 답변도 달아드리고 제 책을 응원하는 글을 보면서 힘을 얻곤 했습니다. 그리고 부모님, 아내, 친구들, 회사 동료들까지 많은 분들께서 관심을 가져주시고 격려를 해주셨습니다.

이 자리를 빌어서 모든 분들께 감사 드립니다.

그리고 제가 좋아하는 독서도 많이 하고 사람들과 많이 어울려 다니면서 다시 용기를 얻어서 작업을 이어나갈 수 있었습니다. 그러다 결국 여기까지 올 수 있었구요.

"포기하기 전까지 실패란 없다. 시행착오가 있을 뿐이다. 시행착오를 거듭하다보면 언젠가 결국 성공하게 된다."

위 명언을 계속 새기면서 포기하지 않고 꾸준히 작업했더니 결국 원고가 완성되었습니다.


# 앞으로...

출판사와의 일정이 잡히면 블로그에 다시 공지해 드리겠습니다.

원고 작업을 한번 성공하니 자신감이 충만해 지는게 느껴집니다. 이번에 많은 경험과 시행착오를 겪어보니 두 번째 책도 금방 쓸 수 있을 것 같은 기분입니다. (2 탄을 기획 중인데요. 구체적으로 정리되면 알려드릴께요~)


다시 한번 모든 분들께 감사 드립니다. ^^~


ReverseCore
반응형
반응형

기존 InjDll.exe 유틸리티를 업그레이드(Ver. 1.1.1) 하였습니다.

  1. 64bit 지원

  2. <dll path> 의 상대 경로 지원




Windows 7 64bit OS 가 보급됨에 따라 리버싱 분야에도 점차 64bit 지원 여부가 중요한 이슈가 되고 있습니다. 저 또한 최근에 64bit 관련 내용을 공부하면서 흥미로운 내용을 많이 접하였습니다. (이번에 작업 중인 리버싱 책에 64bit 리버싱 챕터를 추가시켰습니다.)

각 플랫폼(32/64bit) 별로 Dll Injection 을 하실 때 다음의 내용을 주의해 주시기 바랍니다.

- Target 프로세스가 32bit 인 경우 : Injector & Dll => 모두 32bit (PE32 포멧)
- Target 프로세스가 64bit 인 경우 : Injector & Dll => 모두 64bit (PE32+ 포멧)

* 64bit OS 에서는 32/64bit 프로세스가 모두 실행 가능하므로, Target 프로세스의 PE 포멧을 확인 하신 후 적절한 Injector(InjDll32/InjDll64) 와 DLL 을 사용하시면 됩니다.

* PE32+ 포멧의 파일을 생성하시려면 Visual C++ 2010 Express & Windows SDK 를 설치하시면 됩니다.


ReverseCore

반응형
반응형

질문/답변 코너를 만든 이후로 많은 분들께서 질문을 해주시고, 답변도 도와 주셨습니다.

모든 분들께 정말로 감사를 드립니다.

댓글로 질문/답변을 진행하고 있는데요, 너무 댓글이 길어져서 사용하기 불편해졌습니다.
그래서 새로 추가하였습니다.

이후부터는 이쪽에 질문/답변을 올려주세요~
감사합니다.

* 예전 질문/답변 코너 링크입니다. (원하시는 내용이 있는지 검색해 보세요~)


=======================================================

리버스 엔지니어링 분야에 대해 질문이 있으시면 아래의 댓글로 올려주세요. 역시 댓글로 답변을 올려드리겠습니다. 공개하기 어려운 내용은 '비밀글' 에 체크해주세요.

"비도덕적, 불법적" 인 내용은 답변 드릴 수 없음을 이해해 주시기 바랍니다.


댓글, 방명록, 이메일 등으로 많은 분들께서 여러 가지 질문들을 해주십니다. 
그중에 정말 좋은 질문들이 많아서 여러분들과 공유하면 좋겠다고 생각하였습니다.

이제부터 저에게 들어오는 모든 질문과 답변들을 이곳으로 모을 것입니다.
앞으로 질문과 답변은 이곳에서 해주세요~

질문에 대한 답변은 저 뿐만 아니라 제 블로그에 오시는 모든 분들께서 하실 수 있습니다.
문제 해결을 위한 방법은 다양합니다. 저 말고도 다른 분들의 답변은 언제나 환영입니다.

"질문은 좋은 것 입니다. 많이 해주세요. ^^ "

* 댓글로 질문하기 어려운 내용들(긴내용, 첨부파일 등)은 제 이메일(reversecore@gmail.com)로 문의해 주세요.

* 제가 사용하는 GMail 은 PE 파일을 첨부하면 전송 거부를 합니다. (압축을 시켜도 그걸 열어서 확인하지요.)
   => 실행 파일을 첨부해서 보내실때는 확장자를 exex, dllx, zipx 등으로 변경해서 보내주세요.

* 댓글이 너무 많이 달리면 제가 질문/답변 빈 포스트를 또 올릴 겁니다. 그쪽으로 계속 질문 댓글 달아주시면 됩니다.

감사합니다.


ReverseCore

반응형

'q&a' 카테고리의 다른 글

질문/답변 코너입니다. (3)  (381) 2011.04.13
질문/답변 코너입니다.  (295) 2009.09.21
반응형


리버스 엔지니어링 분야에 대해 질문이 있으시면 아래의 댓글로 올려주세요. 역시 댓글로 답변을 올려드리겠습니다. 공개하기 어려운 내용은 '비밀글' 에 체크해주세요.

"비도덕적, 불법적" 인 내용은 답변 드릴 수 없음을 이해해 주시기 바랍니다.


댓글, 방명록, 이메일 등으로 많은 분들께서 여러 가지 질문들을 해주십니다.
그중에 정말 좋은 질문들이 많아서 여러분들과 공유하면 좋겠다고 생각하였습니다.

이제부터 저에게 들어오는 모든 질문과 답변들을 이곳으로 모을 것입니다.
앞으로 질문과 답변은 이곳에서 해주세요~

질문에 대한 답변은 저 뿐만 아니라 제 블로그에 오시는 모든 분들께서 하실 수 있습니다.
문제 해결을 위한 방법은 다양합니다. 저 말고도 다른 분들의 답변은 언제나 환영입니다.

"질문은 좋은 것 입니다. 많이 해주세요. ^^ "

* 댓글로 질문하기 어려운 내용들(긴내용, 첨부파일 등)은 제 이메일(reversecore@gmail.com)로 문의해 주세요.

* 댓글이 너무 많이 달리면 제가 질문/답변 빈 포스트를 또 올릴 겁니다. 그쪽으로 계속 질문 댓글 달아주시면 됩니다.

감사합니다.


ReverseCore



반응형

'q&a' 카테고리의 다른 글

질문/답변 코너입니다. (3)  (381) 2011.04.13
질문/답변 코너입니다. (2)  (223) 2010.01.28

+ Recent posts