반응형


즐겁고 신나는 리버스 엔지니어링 세계를 여행하기 위한 가이드!



소프트웨어 리버스 엔지니어링이란 응용 프로그램의 내부 구조와 동작 원리를 탐구하는 기술입니다. 


신기한 모험과 흥미로운 도전 과제들로 가득한 리버스 엔지니어링의 길로 들어선 독자 여러분을 환영합니다.


리버싱을 잘 하면 프로그램의 속을 훤히 들여다 볼 수 있습니다. 자신이 만든 프로그램도 아니고 소스 코드조차 없는 상태에서 말이죠. 리버싱 기술을 잘 활용하면 개발/테스트 단계에서 미처 발견하지 못한 버그나 취약점을 파악할 수 있고, 파일이나 메모리를 직접 수정(패치)하여 문제를 해결할 수 있습니다. 그리고 더 나아가서 전혀 새로운 기능을 추가시켜 프로그램의 기능을 향상 시킬 수 도 있습니다. 마치 마법과도 같은 멋진 일을 할 수 있는 것입니다.



리버싱 공부를 시작할 때 거창한 사전 준비 같은 건 필요 없습니다. 


이야기를 하나 들려 드리겠습니다. 제가 수 년간 리버싱 블로그를 운영해 오면서 가장 많이 받은 질문은 “도대체 리버싱을 어떻게 공부해야 하나요?” 였습니다. 여러 가지 경험담과 실패 사례를 분석해본 결과 리버싱 공부를 실패하는 가장 큰 원인은 공부 자체의 분량이나 어려움이 아니었습니다. 오히려 “전 C언어도 모르는데요?”, “어셈블리를 마스터 해야 하나요?”, “저는 OS 구조를 잘 모릅니다”, “디버거를 사용할 줄 몰라요”, “이 많은 것들을 언제 다 공부하고 본격적인 리버싱 공부를 시작하죠?” 와 같은 막연한 두려움과 걱정 때문에 중도에 포기하는 것이 주요한 실패 원인이었습니다.


본격적인 리버싱 공부는 C언어, 어셈블리, OS구조, 디버거 사용법등을 공부한다는 것과 같습니다. 이런 것들을 이미 알고 있는 사람은 리버싱 입문 과정이 필요 없습니다. 이미 리버싱 전문가라는 뜻이니까요. 아직 리버싱에 대해 알고 있는 게 하나도 없다구요? 실망하지 마세요. 오히려 참 좋은 일입니다. 바꿔 말하자면 앞으로 머릿속에 입력될 지식이 많다는 뜻입니다. 지금보다 더 똑똑해지고, 더 가치 있는 사람이 될 테니 참 좋은 일이라고 할 수 있습니다.



이 책은 리버스 엔지니어를 꿈꾸는 리버싱 입문자들과 리버싱 기술에 흥미를 갖고 있는 개발자 등을 위하여 쓰여졌습니다. 


리버싱 기술들을 단순히 공식처럼 외우기만 해서는 필요한 순간에 제대로 응용 할 수 없습니다. 관련 지식을 얻고 내부 동작 원리를 이해하는 것이야말로 가장 중요합니다.  따라서 동작 원리를 설명하고 이해 시키는 데에 주안점을 두었습니다. 그럼 이 책이 왜 리버스 엔지니어링 입문서로 적합한지 제 소개를 곁들여서 설명해보도록 하겠습니다.


첫 째는 개발과 분석 경험입니다. 보통 리버스 엔지니어는 업무 과정에서 전문적인 리버싱 실력뿐만 아니라 어느 정도의 개발 실력도 갖추게 됩니다. 저는 네트워크 어플리케이션 개발자로 일하다가 악성 코드 분석 업무를 맡으면서 리버싱 기술을 익히게 되었습니다. 즉 전문 개발자에서 전문 리버서로  전향한 흔치 않은 케이스입니다. 이 두 기술은 그야말로 찰떡궁합처럼 상호 발전하고 보완하면서 기가 막힌 콤비 플레이를 보여줍니다. 평소에 이 둘을 양 날개에 비유하며 다양한 업무에 활용해 왔습니다. 따라서 자연스럽게 개발과 리버싱이라는 두 가지의 관점으로 프로그램을 분석하게 되었습니다. 이 책의 거의 모든 실습 예제는 리버싱 과정에서 얻은 지식과 노하우를 가지고 제가 직접 개발한 것으로서 군더더기 없이 각 장의 주제만을 집중해서 보여줍니다.


둘 째는 교육 및 발표 경험입니다. 회사에서 고참 직원이 되면서 점점 사내 교육/세미나, 외부 발표 기회가 많아졌습니다. 리버싱 입문자들에게 직접 리버싱 교육을 시키면서 그들의 어려움과 궁금증을 잘 파악할 수 있는 계기가 되었지요. 나름대로 어떻게 하면 쉽게 설명할 수 있을지 고민하면서 자연스레 리버싱 입문자를 위한 교육 노하우를 쌓을 수 있었습니다. 이 경험이 책의 구성, 내용, 예제 등 전반에 걸쳐 큰 영향을 끼쳐서 어려운 리버싱 기술을 비교적 쉽게 이해할 수 있도록 설명할 수 있었습니다.


셋 째는 다양한 커뮤니케이션 경험입니다. 몇 년 전부터 리버싱 전문 블로그를 운영하고 있습니다. 처음에는 제가 보유한 리버싱 기술의 정리 차원에서 가볍게 시작하였습니다. 그런데 방문객들이 조금씩 늘어 나면서 여러 가지 다양한 질문들이 올라오기 시작했습니다. 전 사실 이때 좀 놀랐습니다. 그 동안 우리나라는 리버싱의 불모지라고 여겼었는데 생각보다 많은 사람들이 관심을 보였고 관심 범위가 매우 다양했습니다. 그러면서 시야가 밖으로 넓어지는 계기가 되었습니다. 다른 리버싱 블로그도 방문하고 다양한 사람들의 글과 질문을 접하면서 그들의 관심사를 알 수 있게 되었는데요. 리버싱 입문자들은 체계적인 학습 방법을 알고 싶어 했습니다. 그리고 입문 과정을 지난 사람들은 좀 더 전문적인 리버싱 기술과 내부 동작 원리에 목 말라 하고 있었습니다. 블로그 활동을 어느 정도 한 이후부터는 체계적인 학습도구로서 기술 서적 집필을 고려하게 되었습니다.


결과적으로 저의 이러한 리버싱과 개발, 교육/발표, 다양한 커뮤니케이션 경험을 기반으로 하여 리버싱 입문 서적을 완성하게 되었습니다.



독자 여러분께 이 책을 이용한 리버싱 학습 방법에 대한 팁을 소개해 드리겠습니다.


첫째, 기술 서적은 책꽂이를 예쁘게 장식하는 용도가 아닙니다. 여러분의 기술력을 향상 시키기 위한 하나의 도구입니다. 따라서 책의 중요 부분에 밑줄을 팍팍 긋고, 여백에다가 여러분 자신의 생각과 느낌 등을 적어보시기 바랍니다. 연관된 기술, 주의 사항, 기술의 장단점, 저자와 다른 여러분 자신만의 아이디어 등을 신나게 기록하면서 여러분만의 책으로 만들어 보세요. 이런 리버싱 기술 서적을 한 권씩 독파하다 보면 어느 순간 여러분만의 독자적인 리버싱 세계를 구축하면서 리버싱 전문가가 될 수 있답니다.


둘째, 긍정적이고 여유 있는 마음 자세를 가지세요. 리버싱은 OS 의 가장 밑바닥까지 내려가는 심오한 기술입니다. 공부할 내용이 많고 그 특성상 대부분의 내용이 직접 실습하고 눈으로 확인해야만 이해 되는 경우가 많습니다. 이러한 과정을 긍적적인 마음으로 즐기시기 바랍니다. 그리고 리버싱 공부는 얼마나 머리가 좋은지가 아니라 얼마나 시간을 투자했는지가 더 중요합니다. 조급해 하지 말고 여유 있는 느긋한 마음 자세로 공부를 해나가시기 바랍니다.


셋째, 계속 도전하세요. 리버싱이 잘 안될 때는 멈추지 말고 다양한 방법으로 계속 시도해 보시기 바랍니다. 분명히 해결 방법은 존재합니다. 이미 몇 년 전에 누군가 성공시킨 일입니다. 관련 자료를 검색하고 다양하게 시도하면 자신의 실력도 향상될 뿐 아니라 문제가 해결되었을 때 엄청난 성취감을 느낄 수 있습니다. 이러한 성공 경험이 하나씩 쌓이면서 자신감이 생기고 리버싱 실력은 눈부시게 향상됩니다. 또한 경험을 통해 얻은 자신감은 무의식적으로 업무에 영향을 끼쳐서 일이 잘 풀리는 방향으로 나아가게 합니다.



이 책을 통하여 독자 분들의 위시 리스트가 하나씩 이루어 지고, 리버싱 기술이 다양한 IT 분야에서 널리 활용되기를 바랍니다. 감사합니다.



이 승 원

www.reversecore.com

reversecore@gmail.com


반응형
  1. reversecore 2012.10.10 00:52 신고

    "리버싱 핵심 원리"의 서문입니다.

  2. 악성코딩 2012.10.10 13:35

    책가격 시간이 지나면 떨어질까요?

  3. 리버싱입문자 2012.10.10 16:58

    안녕하세요.
    제가 공부를하면서 궁금한점이있습니다.
    리버싱엔지니어 기술을 배우려면 개발경험없이 리버싱분야로 취업이 가능한가요? 그리고 리버싱을 다루는 회사가 많이있나요? 안x 하x리 게임업체 정도로 나뉠수있나요? 저는 악성코드를 분석하고싶어서요 과연 진로로 일을할수있는 회사가 많은지 궁금해서요

    • reversecore 2012.10.11 00:39 신고

      안녕하세요.

      회사마다 자체 채용기준이 있기 때문에 취업 가능 여부는 제가 말씀드릴 수 있는 사항은 아닙니다.

      제가 아는 한도에서 악성 코드를 분석할 수 있는 곳은 말씀하신 보안업체, 게임업체, 국가 기관 정도입니다.

      그중에서도 악성코드 분석 전문 업체는 역시 보안업체입니다.

      감사합니다.

  4. 리셋 2012.10.10 19:13

    안녕하세요.
    리버싱에 입문하고자 책을 구매한 학생입니다^^
    http://test_r.blog.me/168393342

    그런데, 저는 책에있는 모든 예제파일을 구할 수 있을거라생각하고
    뒷면에 예제파일을 이 블로그에서 구할 수 있다는 글귀를 보고 들어왔는데
    어디에있는지 찾아볼 수 없네요 ㅠㅠ

    헬로월드부터 해보려고했는데..

    답변 기다리겠습니다!

    • 담벼락 2012.10.10 19:54

      http://www.reversecore.com/category/book/bin%26src
      카테고리 보시면 book +누르셔서 여시면 bin&src라는 곳에 예제가 있습니다.

    • reversecore 2012.10.11 00:32 신고

      리셋님, 안녕하세요~

      블로그의 책소개 감사합니다. ^^~

      말씀하신대로 실습예제 + 소스코드가 눈에 잘 띄지 않는 문제가 있습니다. 블로그 타이틀 부분에 걸 수 있다면 쉽게 찾으실 수 있을것 같습니다. 방법을 찾아보도록 하겠습니다.

      감사합니다.

    • reversecore 2012.10.11 01:01 신고

      담벼락님, 친절한 답변 감사 드립니다~~ ^^

      카테고리 이름을 한글로 고치면서 경로가 아래와 같이 변경되었습니다.

      http://www.reversecore.com/104

      감사합니다.

  5. 리버싱에한걸음 2012.10.11 21:57

    저희 부모님을 설득해서
    오늘 드디어 책구매를 하게됬네요 흐흐
    아빠한테 해커가 나쁜일을 하는게 아니라고 간신히 설득해서 사게됬다는 ㅠㅠ
    아 기분이 날아갈것만 같습니다 ㅋㅋ
    시험도 끝났으니 리버싱을 공부할수 있는
    좋은기회가 될것같네요
    학교가서 보고 집가서 보고 꾸준히 공부해야겠습니다
    제가 미래에 코어님같이 보안실력가 가 되있을거라 생각하니
    기분이 좋아진다는 ㅎㅎ

    • reversecore 2012.10.11 22:48 신고

      안녕하세요. ^^~
      해킹, 리버싱 꿈나무시군요~ 반갑습니다.

      리버싱에 대한 관심과 열정이 대단하신것 같습니다.
      가까운 미래에 틀림없이 저를 뛰어넘는 훌륭한 보안 전문가가 되실 것입니다.

      꿈을 크게 가지고 즐겁게 공부하시기 바랍니다. ^^~

      감사합니다.

  6. 불멸자 2012.10.13 23:03

    안녕하세요. 코어님 책을 공부하고있는 독자입니다.
    제가 책을 읽다가 갑자기 궁금한것이 생겨 댓글 달아봅니다.ㅋㅋ

    p.80의 내용에 4바이트의 크기를가지는
    두 변수를 저장하기위해 sub esp,8 을 한다고 써져
    있는데요 여기서 의문점이 공간을 확보하려면
    add esp,8 을 해야하지않나요? 어째서 sub를
    사용하는지 이해가 가지 않습니다

  7. 늙은초보 2012.10.14 17:19

    ESP 는 stack 포인터로 쓰입니다. 스택은 높은 메모리주소에서 낮은메모리 주소로 증가 합니다. 현재 스택에서(예로 현재 스택포인터는 100번지 스택메모리주소를 가리키고 있씀) 4byte * 2 (8byte) 공간을 확보하려면 100번지 - 8 로 낮은 주소로 내려 갑니다. 스택포인터는 높은 주소에서 낮은 주소로 이동할때 스택 메모리 공간이 커집니다.

    • 불멸자 2012.10.14 18:23

      아하 그렇군요
      이제 이해가갔네요 ㅎㅎ
      감사합니다.

    • reversecore 2012.10.14 23:39 신고

      안녕하세요~

      너무 멋진 설명 감사합니다. ^^~

  8. 불멸자 2012.10.14 22:46

    아 1강까지는 이해가 쉬웠는데
    스택프래임부터 시작해서 시리얼번호 크랙미 풀이는
    이해가 너무 힘드네 ㅠㅠ
    아무래도 직접실습하지않고 풀이만봐서 그런가
    이해갈때까지 계속 복습해야할거같네요

    • reversecore 2012.10.14 23:47 신고

      안녕하세요~

      말씀하신대로 직접 실습을 해보시면 이해의 폭이 달라지실 것입니다.
      엔지니어링이란게 그런것이겠죠? ^^

      조급하지 않게 한발 한발 나아가시면 됩니다.

      감사합니다.

  9. 질문요 2012.11.04 23:00

    오늘 첫 번째 정독 끝났습니다.

    동작원리, 개념에 대해서 꼼꼼하게 잘 설명해주셨더라구요. 그리고 질문하면 댓글도 달아주시고 정말 감사합니다. 덕분에 리버싱이라는 분야에 한발 더 내딛을 수 있게 되었습니다.

    국내에 네트웍프밍 서적은 대부분 TCP/IP 소켓프밍뿐이던데 커널네트웍프밍이나, 로우등 이런 서적은 국내에 없나요?

    • reversecore 2012.11.07 05:49 신고

      와~ 불과 한달여만에 책을 다보셨군요.
      대단하십니다.
      제가 알기로 최초이십니다. ^^

      네트워크 프로그래밍 책은 제가 그 분야를 떠난지 오래되서 잘 모르겠네요~ ^^

      감사합니다.

  10. 1쇄구매자 2013.01.14 16:55

    축하합니다. 아직 초반부 읽고 있지만 마음에 드는 책입니다.
    2판~3판~ 나와주길~

  11. 사이다한잔 2013.02.06 22:10

    책이 오늘 왔습니다. 아직 02를 보고 있지만, 쉽게 이해시키려는 저자의 노력이 돋보입니다. 감사합니다. 열심히 공부하겠습니다.

  12. 강경태 2013.05.09 21:43

    그런데 안티디버깅 실습중인데 PEB.Ldr 이부분이 무한루프에서 FF를 전부 NULL로 수정했는데도.

    무한루프문에서 빠져나오질 못합니다. 미치겠습니다.

    좀 알려주세요.

  13. 박경옥 2013.10.29 23:19

    안녕하십니까!
    아직 책을 읽지 못하였습니다. 헌데 2쇄가 발간이 된듯 하군요.
    리버싱에 대하여 오래전부터 관심을 가지게 되었으나 형편상 자세한 내용을 못찻아 꿈을 접은지 오래 되었는데...가족을 꾸려 나아가는 가장이 되고 보니 무언가 이룩한 일이 아무 것도 없어
    꿈에 다시 도전장을 던저 보려 밤중에 이렇게 글을 남깁니다.
    핵심원리 2쇄 책을 구입하여 정독을 한 후 관리자 님께 궁금증과 개인적인 1人 CEO 가 되보려
    합니다.
    응원해 주십시요. 관리자 님의 글이 한사람의 인생을 바꾸는 또다른 시각의 열매로 열리길
    기대 하는 한사람입니다.
    세상사는 가장 귀한 존재가 되시길.........화이팅!

  14. 2016.11.23 08:31

    비밀댓글입니다

반응형
(2021.07.08) github.com 에도 제 계정을 생성하여 소스코드 및 실습예제를 올렸습니다.
github 에 익숙하신 분들께서는 이곳을 이용하시면 됩니다.

https://github.com/reversecore/book

 

1. 소스 코드 (ver 1.0.2)

 

소스코드.zip
0.25MB

* 암호 : reversecore

< 릴리즈 히스토리 >

ver 1.0.2 - "44장 InjDll.exe - DLL 인젝션 전용 도구" InjDll.cpp 오류 수정 (20121110)

ver 1.0.1 - "33장 스텔스 프로세스" 프로젝트 소스 보기 오류 수정 (20121008)

ver 1.0.0 - 첫 릴리즈 (20120928) 

 

< 참고 >

 

* 모든 소스 코드는 MS Visual C++ Express 2010 으로 개발되었습니다.

* 소스 코드를 이용하여 빌드한 결과 파일은 사용자 환경에 따라 약간씩 달라질 수 있습니다.

* 책의 설명과 동일하게 디버깅 하기 위해서는 첨부한 예제 파일을 사용하시기 바랍니다. 

 

2. 실습 예제 파일 (ver 1.0.1)

 

* 2중 압축 되어 있습니다. (압축 풀면 실습예제.zip 이 생성됩니다. 이를 다시 압축 해제 해주세요.)

* 암호 : reversecore

 

< 릴리즈 히스토리 >

 

ver 1.0.1 - "1장 리버싱 스토리" 예제 변경 (20130401)

ver 1.0.0 - 첫 릴리즈 (20120928)

< 참고 >

* "실습예제.zip" 파일은 Anti-Virus 제품의 실시간 검사를 피하기 위하여 2중 압축 되어 있습니다.

* "5부 - 64비트 & Windows Kernel 6" 의 실습 예제 파일을 실습 하기 위해서는 Windows XP/Vista/7 64bit 환경이 필요합니다.

* 5부를 제외한 나머지 모든 실습 예제 파일은 MS Windows XP SP3 32bit & Windows 7 32bit 에서 테스트 되었습니다.

* 만약 64bit 환경에서 실습을 진행하기 위해서는 다음 포스팅에 나타난 방법을 참고하시기 바랍니다.

 

    64bit 환경에서 OllyDbg 사용할 수 있는 방법

* 중요!!!

일부 Anti-Virus 제품에서 실습 예제 파일의 일부가 악성 파일로 진단될 수 있습니다.

그 이유는 예제에서 사용된 기법들이 기존의 악성 파일에서 사용된 기법과 동일하기 때문에 AV 휴리스틱 엔진에서 그 부분을 탐지하여 악성 파일로 잘 못 진단할 수 있기 때문입니다.

 

전혀 악성 파일이 아니므로 아래 설명을 잘 읽어 보시고 실습해 보시기 바랍니다.

 

1) UPack 패커와 UPack 으로 패킹된 실습 예제가 진단될 수 있습니다.

이는 패커 자체가 PE 헤더를 심하게 훼손시켜서 Black 리스트에 포함되었고, 또한 몇 년전에 많은 악성 코드들이 UPack 으로 실행압축 되었기 때문에 이젠 대부분의 AV 에서 UPack 자체만으로도 악성 파일로 진단해 버립니다.

그렇다고 UPack 자체와 이걸로 패킹된 실습 예제가 악성 파일은 아닙니다. 

다만 리버싱 기술 설명을 위해 AV 업계의 권고사항을 따르지 않은것 뿐입니다.

PE 파일 설명에 UPack 만큼 좋은 예제가 드물기 때문에 이런 불편함에도 예제로 사용하였습니다.

 

2) '고급 리버싱', '안티 디버깅' 예제 일부가 악성 파일로 진단될 수 있습니다.

이 예제 파일 역시 악성 파일에서 사용되는 것과 동일한 기법을 사용했기 때문에 AV 휴리스틱 엔진에서 그 부분을 탐지한 것입니다.

실습 파일 자체는 아무런 악성 행위를 하지 않는 정상 파일입니다.

3) 시간이 지난 후에 멀쩡한 예제 파일들이 악성으로 진단될 수 있습니다.
예제 파일이 퍼져서 AV 업체에 접수되어 자동 분류 시스템에 의해 만에 하나 '악성'으로 분류될 수도 있습니다.악성 파일에서 안티 디버깅에 사용되는 SEH, TLS Callback 기법을 구현하였기 때문입니다.이 기법 자체만으로는 아무런 악성 증상이 없습니다. 다만 AV 엔진의 휴리스틱 진단에서 이 부분을 탐지 할 가능성이 있다는 것이죠.

4) 그렇다면 진짜 악성 파일이란 어떤 것일까요?

사용자 몰래 시스템에 숨어 들어서, 자동으로 실행 되며, 개인 정보를 무단으로 수집하고, 수집한 정보를 외부로 유출하는 등의 악의적인 행위를 하는 파일들입니다. 

즉, 악성 파일이란 사용자에게 크던 작던 피해를 입히는 파일들을 말하는 것이죠.

실습 예제 파일들은 특정 리버싱 기법을 위해 만들어진 단순한 파일들 입니다. 악성 증상은 전혀 없습니다. ^^~

 

5) 실습 환경 PC 에서는 잠시 AV 제품의 "실시간 감시" 기능을 꺼두시기 바랍니다.

물론 실습을 마치셨다면 실시간 감시를 다시 켜주시는 것이 좋습니다.

 

6) Windows 7 에서 실습을 하시는 경우 UAC(User Access Control) 기능을 끄고 하시면 편리합니다.

 

 

혹시 다운로드가 잘 안되거나 AV 진단 관련하여 궁금하신 점은 이곳에 질문해 주세요~

 

감사합니다.

 

반응형
  1. 이전 댓글 더보기
  2. hacker3 2015.03.13 18:24

    리버싱 책 구입했는데 파일 어디서 다운받죠? 모조리 받고 싶어요

  3. maskey 2015.07.08 22:33

    안녕하세요 리버싱 핵심원리 구독자입니다.
    지금 윈도우 64비트 환경에서 올리디버거를 사용하고있습니다.

    문의드리는 내용은 제일 첫장 Hello World 부분에서 디버거에 exe를 올리면 책에서는 004011A0의 주소로 0040270C의 주소로 call 시키는 부분입니다.
    하지만 저가 할 떄는 처음부터 0042F55F JMP wmainCRTStartup 으로 EntryPoint가 잡혀있습니다.

    디버거는 ollydbg 2.01과 Immunnity dbg 1.85v 두 디버거 사용해도 똑같이 시작됩니다.

  4. 김요환 2015.07.24 04:32

    5부 64bit 37.2.1 예제 CreateFileA() 구조가 살짝 다릅니다.
    3번째 행 책 (PUSH ECX)
    dbg(SUB ESP 214) -> 메모리 할당
    그리고 4부 마지막 IE 제어는 아예 프로세스 디버깅하고 해봐도 같은 함수가 찾아 지지 않습니다. 하는 방법이 잘못된 것 갈까요?

  5. 김요환 2015.07.24 04:32

    5부 64bit 37.2.1 예제 CreateFileA() 구조가 살짝 다릅니다.
    3번째 행 책 (PUSH ECX)
    dbg(SUB ESP 214) -> 메모리 할당
    그리고 4부 마지막 IE 제어는 아예 프로세스 디버깅하고 해봐도 같은 함수가 찾아 지지 않습니다. 하는 방법이 잘못된 것 갈까요?

  6. 김요환 2015.07.24 04:32

    5부 64bit 37.2.1 예제 CreateFileA() 구조가 살짝 다릅니다.
    3번째 행 책 (PUSH ECX)
    dbg(SUB ESP 214) -> 메모리 할당
    그리고 4부 마지막 IE 제어는 아예 프로세스 디버깅하고 해봐도 같은 함수가 찾아 지지 않습니다. 하는 방법이 잘못된 것 갈까요?

  7. 김요환 2015.07.24 04:32

    5부 64bit 37.2.1 예제 CreateFileA() 구조가 살짝 다릅니다.
    3번째 행 책 (PUSH ECX)
    dbg(SUB ESP 214) -> 메모리 할당
    그리고 4부 마지막 IE 제어는 아예 프로세스 디버깅하고 해봐도 같은 함수가 찾아 지지 않습니다. 하는 방법이 잘못된 것 갈까요?

  8. 김요환 2015.07.24 04:33

    5부 64bit 37.2.1 예제 CreateFileA() 구조가 살짝 다릅니다.
    3번째 행 책 (PUSH ECX)
    dbg(SUB ESP 214) -> 메모리 할당
    그리고 4부 마지막 IE 제어는 아예 프로세스 디버깅하고 해봐도 같은 함수가 찾아 지지 않습니다. 하는 방법이 잘못된 것 갈까요?

  9. doctroy 2015.07.26 21:18

    안녕하세요 책을 보면서 공부를 하고 있는 독자입니다 다름이 아니라 윈도우 10에서 HOOKMAIN.EXE 파일을 실행하면 모든 프로그램에 키보드 입력이 되지 않네요...

  10. 치운 2016.02.25 18:16 신고

    책을 사서 예제파일 hello.exe를 OllyDbg로 열어봤는데 주소가 완전히 틀리네요.
    저는 노트북에 windows2008을 깔고 있습니다.
    책에 나오는 예제와 똑같은 주소가 보이려면 어떻게 해야합니까?
    저의 이메일은 kchambit@daum.net입니다. 꼭 알려주세요.

  11. 권흥태 2016.06.21 22:34 신고

    맘먹고 책을 사서 공부중인 학생입니다.
    c++파일 올리디버거로 똑같이 열어서 하고 있는데 책이랑 메모리 주소들이 자꾸 틀리네요..
    helloWold.exe파일도 그러 합니다. ㅠㅠ 정말 해결책을 알 고 싶어요 ㅠㅠ
    빠른 답변 부탁드립니다.
    dev-c++사용합니다. 32비트이구요

  12. 2018.01.29 22:42

    비밀댓글입니다

  13. 2018.02.21 18:09

    비밀댓글입니다

  14. 김범준 2018.03.08 14:53

    비밀번호가걸려잇어요 어떻개해야하나요

  15. 천호진 2019.01.19 03:41

    크롬 환경에서 실습 예제파일 티스토리는 보안 오류가 뜨고,
    드랍 박스는 url이 바뀐모양이네요

  16. 2020.12.05 22:41

    비밀댓글입니다

  17. 2020.12.10 18:57

    비밀댓글입니다

  18. 2020.12.15 00:14

    비밀댓글입니다

  19. 2020.12.26 19:45

    비밀댓글입니다

  20. 2020.12.28 16:04

    비밀댓글입니다

  21. tifet1264 2021.04.14 16:49

    감사합니다. 책과 함께 잘 쓰도록 하겠습니다.

반응형


"리버싱 핵심 원리" Errata (정오표)



* 36   [4쇄에서 수정됨]


간단히 MessageBoxW 함수의 RETN 명령까지 실행[Ctrl+F9]한 다음, RETN 명령도 실행[F7]하면, 리턴 주소 401014로 갈 수 있습니다.

=> MessageBoxW() 함수의 RETN 명령어에 BP 를 설치[F2]한 후 실행[F9]합니다. 도중에 메시지박스가 나타나면 [확인]을 선택합니다. 그리고 RETN 명령어에서 디버깅이 멈추면 StepInto[F7]/StepOut[F8] 명령으로 리턴 주소 401014로 갈 수 있습니다.



* 85   [2쇄에서 수정됨]


14장에서 EAX는 => 4장에서 EAX는



* 152   [2쇄에서 수정됨]


Line nunbers => Line numbers

바이트 of machine => Bytes of machine

마지막으로 IMAGE_FILE_HAEDER => 마지막으로 IMAGE_FILE_HEADER



* 157   [2쇄에서 수정됨]


빨간색으로 표시한 EXPORT => EXPORT



* 161   [2쇄에서 수정됨]


<코드 13.10>

Section is writeable => Section is writable



* 164   [4쇄에서 수정됨]


각각의 RVA를 계산해보세요 => 각각의 RAW(File Offset)를 계산해보세요



* 164   [2쇄에서 수정됨]


<그림 13.9>

<File> 에서 Section(".text") 생략됨



* 165   [4쇄에서 수정됨]


Q3. RVA = ABA8일 때 File Offset = ?

A2. 해당 RVA 값이 속해 있는 => A3. 해당 RVA 값이 속해 있는



* 170   [2쇄에서 수정됨]


<그림 13.11 IAT>

이 테이블은 PE 로더를 덮어씁니다. => 이 테이블은 PE 로더에 의해서 덮어써집니다.



* 178   [4쇄에서 수정됨]


표 13.8 notepad.exe 파일의 DataDirectory 배열  =>  표 13.8 kernel32.dll 파일의 DataDirectory 배열



* 178   [2쇄에서 수정됨]


<코드 13.14>

address of functino name string array => address of function name string array



* 179   [4쇄에서 수정됨]


<표 13.9 내부>

Ordinal 주소 배열 => Ordinal 배열



* 181   [2쇄에서 수정됨]


앞서 소개한 코드 13.15의 => 앞서 소개한 GetProcAddress() 동작 원리



* 182   [2쇄에서 수정됨]


RVA:4424 -> RVA:3824 => RVA:4424 -> RAW:3824



* 183   [2쇄에서 수정됨]


RVA:2654 -> RVA:1A54 => RVA:2654 -> RAW:1A54



* 188   [2쇄에서 수정됨]


1000d(400h)바이트라면 => 1000d(3E8h)바이트라면



* 200   [2쇄에서 수정됨]


그림 14.13은 => 그림 14.3은



* 201   [2쇄에서 수정됨]


실행되는 순간에 => 실행되는 순간에



* 207   [2쇄에서 수정됨]


EDI 레지스터가 가리키는 => EDX 레지스터가 가리키는



* 211   [2쇄에서 수정됨]


그림 15.4가 바로 OEP로 => 그림 15.9가 바로 OEP로 



* 215   [4쇄에서 수정됨]


<그림 16.1>  TEXT.EXE  => TEST.EXE





* 223   [4쇄에서 수정됨]


VirtualSize(1000) + Offset(420) = 1420(RVA)  =>  VirtualAddress(1000) + Offset(420) = 1420(RVA)



* 249   [4쇄에서 수정됨]


<그림 18.18>

01014000 => 01015000



* 253  (3쇄오류) [4쇄에서 수정됨]


3쇄에서 <그림 18.24> 이 완전 잘 못 되었습니다. 아래 그림이 정확합니다.




* 273   [4쇄에서 수정됨]


OEP(40120.)로 갑니다. => OEP(40121E)로 갑니다.


OR


OEP(40120E)로 갑니다. => OEP(40121E)로 갑니다.



* 277   [4쇄에서 수정됨]


<그림 20.13> 에서 "momory" => "memory"




* 281   [2쇄에서 수정됨]


JMP OEP(40120E) 명령을 => JMP OEP(40121E) 명령을



* 296   [4쇄에서 수정됨]


<코드 21.2> 내부의 KeyboardProc() 함수 내부 if ( nCode = 0 ) => if ( nCode >= 0 )



* 301   [4쇄에서 수정됨]


401006 주소에서 LoadLibrary(KeyHook.dl) => 401006 주소에서 LoadLibrary("KeyHook.dll")



* 322   [4쇄에서 수정됨]


메모리에 szDllName 크기만큼 => 메모리에 szDllPath 크기만큼 



* 384  [4쇄에서 수정됨]


그림 27.2 오류!


<그림 27.2 ThreadProc()>



* 422   [3쇄에서 수정됨]


ESI 레지스터는 그림 28.28에서 보다시피 => ESI 레지스터는 그림 28.31에서 보다시피



* 423   [3쇄에서 수정됨]


함수의 리턴 값은 EAX에 저장되므로 위 그림을 보면 => 함수의 리턴 값은 EAX에 저장되므로 그림 28.32을 보면 



* 502   [3쇄에서 수정됨]


보기 옵션을 'Integer Address'로 변경하면 => 보기 옵션을 'Long - Address'로 변경하면



* 523   [2쇄에서 수정됨]


XXXXXXXX = (DWORD)pfnNew - (DWORD)pfnOrg - 5 => // XXXXXXXX = (DWORD)pfnNew - (DWORD)pfnOrg - 5

dwAddress = (DWORD)pfnNew-(DWORD)pfnOrg 5 => dwAddress = (DWORD)pfnNew - (DWORD)pfnOrg - 5



* 573   [4쇄에서 수정됨]


NewInternetConnetcW() 함수의 코드 => NewInternetConnectW() 함수의 코드



* 615   [4쇄에서 수정됨]


<그림 38.1> 우측 하단의 "이 테이블은 PE 로더를 덮어씁니다." 설명이 잘못되었습니다.

"이 테이블은 PE 로더에 의해 덮어써집니다." 가 맞습니다.



* 647   [4쇄에서 수정됨]


<코드 45.1 ASLR.cpp>

#include "studio.h" => #include "stdio.h"



* 691   [2쇄에서 수정됨]


<코드 45.5 TlsTest.cpp>

#include windows.h => #include <windows.h>



* 772   [2쇄에서 수정됨]


Vol. 2B -> Vol 2C   (Intel Manual 이 업데이트 되었습니다.)





반응형

'리버싱 핵심 원리 > errata' 카테고리의 다른 글

"리버싱 핵심 원리" Errata (정오표)  (80) 2012.10.01
  1. 이전 댓글 더보기
  2. Scavenger 2013.01.05 15:12

    초판 1쇄입니다.

    322p에 "...szDllName 크기만큼 메모리를 할당한다" 의 주석 부분에서, szDllName이란 변수는 코드상에 없습니다. 아마 szDllPath 의 크기를 dwBufSize에 넣는 과정에서 소스 코드 수정이 있었고 해당 수정 부분이 주석엔 반영이 안된 것 같습니다..........

    확인부탁드립니다^^

    • reversecore 2013.01.12 01:08 신고

      안녕하세요.

      네, 말씀하신 부분이 맞습니다. szDllPath 라고 해야 정확합니다.

      errata 에 등록하도록 하겠습니다. ^^

      감사합니다.

  3. hkskyp 2013.01.07 03:40

    안녕하세요.

    초판 1쇄 p144 그림 13.2 부분에서 Section(".rsrc") Virtual Size가 8314로 되어 있는데 winxp sp3 에서 notepad.exe 는 8304로 나오던데 확인 부탁드립니다.

    • reversecore 2013.01.12 01:07 신고

      안녕하세요.

      네, 제 XP SP3 환경에서도 8304 입니다. ^^

      참고로 다른 환경에서는 다른 값이 나올 수 있습니다.

      감사합니다.

  4. 조영용 2013.01.23 09:34

    ImageBase의 정확한 개념설명은 p155에서 처음 나오는 것 같은데 찾아보기에서는 p215로 나와있네요. 개인적인 의견입니다.

    • reversecore 2013.01.27 21:03 신고

      안녕하세요.

      작업 과정에서의 실수(버그)네요.

      좋은 의견 감사합니다. ^^~

  5. Scavenger 2013.02.10 10:32

    초판 독자입니다.

    422p 에서 "ESI 레지스터는 그림 28.28에서 보다시피..." 에서, 다음과 같이 수정되어야 할 것 같습니다.

    그림 28.28 -> 그림 28.31

    감사합니다.

  6. MJ 2013.03.13 11:19

    안녕하세요
    2쇄판 독자입니다.

    P147 13.4그림 과 p148의 파일 옵셋 40~4D영역을 설명하는 부분이 맞지 않는것 같습니다.
    블로그에서 DOS stub 내용과 유사한대 그림에서 영역표시되는게 맞다고 보입니다.

    • reversecore 2013.04.01 22:11 신고

      안녕하세요.

      그림 13.4는 DOS Stub 전체를 보여주고 있는데요. 말씀하신대로 그 다음 페이지 debug 설명을 위해서 40~4D 영역의 코드를 선택해서 보여주면 더 좋을 뻔했네요~

      좋은 의견 감사합니다. ^^~

  7. ifelse 2013.04.26 11:27

    안녕하세요.

    546 페이지 언훅 소스에서
    VirtualProtect((LPVOIDpFunc,5,PAGE_EXCUTE_READWRITE,&dwOldProtect)
    첫번째 인자와 두번째인자를 (LPVOID)((DWORD)((pFunc)-5),7 이렇게 하는겟 맞지않나요?

    • reversecore 2014.06.05 11:02 신고

      안녕하세요.

      일단 함수 시작부터 5 바이트 패치하기 때문에 책의 코드에는 이상이 없습니다.

      감사합니다.

  8. icandoit 2013.04.29 19:24

    안녕하세요.
    혹시 164페이지 상단에 퀴즈라고 있는 부분에, RAW를 구하는 것이 아닌가요??
    근데 RVA를 계산해보라고 쓰여있어서...
    확인 부탁드릴게요~

  9. 불협 2013.08.01 16:19

    안녕하세요.
    초판 독자입니다.
    165페이지에 사소한 오타입니다. Q3의 답이 A2라고 나와있네요.

    그리고 179페이지의 표 13.9의 한글 의미가 모호한 것 같습니다.
    아무래도 전 페이지의 코드 13.14의 영문 주석을 번역하면서 생긴 오류인 듯 합니다.
    예를 들어 AddressOfNameOrdinals의 영문 주석은 address of ordinal array 인데, 표 13.9에서는 Ordinal 주소 배열이라고 나와있습니다. (address of ordinal) array 라고 해석하신 듯 한데, 오히려 address of (ordinal array), 즉 Ordinal 배열의 주소 라고 해석함이 옳지 않은가요?

    페이지 408의 그림28.12이 본문과 일치하지 않아요. 그 전페이지 본문에서는 401058주소에서 입력한다고 나온 반면 그림에서는 401061로 나와있습니다. 확인부탁드려요.

    • reversecore 2014.06.05 11:20 신고

      안녕하세요.

      네, 말씀하신 대로 A2 가 아니라 A3 가 맞습니다.

      그리고 표 13.9는 저도 고민을 했었는데요.
      다른것들은 'XXX 주소 배열의 주소' 식으로 복잡해 보여서 그냥 'XXX 주소 배열'로 처리하였구요.
      그런데 AddressOfNameOrdinals 의 경우는 말씀대로 'Ordinal 주소 배열' 보다는 그냥 '배열' 로 표현하는 것이 더 의미상으로 자연스럽고 간결해 보입니다.

      28.12 그림은 401058~401061 코드를 전부 입력완료한 화면입니다. (한줄씩 따라서 입력하시면 됩니다.)

      좋은 지적 감사합니다~~

  10. 크빗 2013.09.01 17:01 신고

    초판 1쇄 기준입니다. 왠지 정오표에 없어서요.
    573p 하단: NewInternetConnetcW() 함수의 코드 역시 -> NewInternetConnectW() 함수의 코드 역시
    615p 그림 38.1: 이 테이블은 PE로더를 덮어씁니다. -> PE로더가 이 테이블을 덮어씁니다.
    미뤄두면 올리는 걸 잊어버릴까봐 미리 올려요...

  11. 라라라 2013.11.28 19:42

    많은 분이 찾아주셨는데 검색해보니 없어서 알립니다.
    1. p.277에
    그림 20.13에 memory가 momory라고 되어있네요(2쇄)

    2. p.296에
    KeyBoardProc 콜백 함수에서 if문 안에 if(nCode = 0)으로 되어있는데
    책보고 코딩하다가 안되서 소스코드를 보니 if(nCode >= 0) 이네요(2쇄)

  12. Fx 2014.06.05 10:39

    3쇄 독자입니다.
    253페이지, 그림 18.24는 전혀 맞지 않는 그림입니다.
    이 사이트에라도 맞는 그림을 올려주시면 좋겠습니다.

    • reversecore 2014.06.07 23:15 신고

      안녕하세요.

      3쇄에서만 나타나는 오류네요. ㅜㅜ

      정확한 그림을 이곳에 올렸습니다.

      오류 발견 감사합니다.

  13. Fx 2014.06.05 10:44

    63페이지부터 스택설명이 나오는데,
    줄곧 'FILO(First In, Last Out)'라고 쓰고 있습니다.
    LIFO(Last In, First Out)이 맞지 않을까요?

    책 내용이 훌륭해서 오류를 고쳐나가면
    리버싱계의 입문서로는 추천서로 손꼽을 만한 책이 될 것 같습니다.
    기분나쁘게 받아들이지 마시고, 적극적으로 반영해주세요.

    • reversecore 2014.06.07 23:25 신고

      안녕하세요.

      LIFO 가 맞다고 말씀해주신 분들이 몇 분 계십니다.
      예전에 제가 배울때는 FILO, LIFO 둘 다 맞다고 배웠고, 다들 혼용해서 썼었는데요. ^^

      혹시 최근 교과서나 서적에서는 LIFO 로 통일(혹은 대세가) 되었나요?
      그랬다면 표준 용어를 따라 변경하는게 맞다고 봅니다.
      자문을 좀 구해보고 수정여부를 결정하겠습니다.

      아, 그리고 오류를 발견해주시면 너무 기쁘고 감사하게 생각한답니다. ^^ 바쁜 시간을 내주셔서 저와 출판사에 도움을 주신거잖아요~
      적극 반영하도록 하겠습니다.

      감사합니다.

  14. 어무이 2014.07.17 17:06

    3쇄 107페이지 Name 문자열 읽는 주소가 004002FB0 가 아닌지요? 이부분을 지나니까 Name 스트링 객체에 입력된 문자열이 저장되는 것이 확인됩니다.

    • reversecore 2014.11.30 08:37 신고

      Name 문자열객체는 [EBP-88] 이고요.
      Name 문자열 읽는 API 호출 주소는 402F98 입니다.
      책의 설명대로 [EBP-88] 주소를 메모리 창에 띄우신 후,
      402F98 주소의 CALL 명령을 실행하시면 [EBP-88] 메모리 영역에 값이 들어가는 걸 확인 할 수 있고요. 'Long - Address with ASCII dump' 보기 옵션으로 보면 입력된 Name 문자열이 보입니다.

      감사합니다.

  15. dd 2014.07.26 11:12

    p.223 VirtualSize(1000) + Offset(420) = 1420(RVA)
    에서
    VirtualSize가 아니라 VirtualAddress 입니다.

  16. 행인1 2014.08.07 17:58

    p.529 코드33.6 부분이 의아해서 올립니다.

    if(pCur->NextEntryOffset == 0)
    pPrev->NextEntryOffset = 0;
    else
    pPrev->NextEntryOffset += pCur->NextEntryOffset;

    다음과 같은 코드인데..

    if(pCur->NextEntryOffset != 0) <=(== 이게아니라 != 이거아닌가요?)
    현재의 조건에 맞는 프로세스의 다음프로세스를 가르키는 링크드리스트의 주소가 0이 아닐때(주소가 있을때) 이전 프로세스(prev->NextEntryOffset = 0) 으로 세팅되어야 하지 않나요?
    오탈자같아서요 한번 확인 부탁드리겠습니다으리!!

    • reversecore 2014.11.30 08:45 신고

      아, 그건요 코드 내용이 맞습니다.
      만약 숨기려는 프로세스가 연결리스트의 마지막 노드라면,
      이전의 노드를 마지막 노드로 설정하라는 뜻입니다.
      (그래야 마지막 노드가 숨겨지겠죠?)

      감사합니다.

  17. Backer 2014.08.09 03:47

    안녕하세요
    읽다가 오타 발견해서 알려드립니다.

    215페지에서
    그림 16.1을 보면 TEST.EXE프로쎄스에 A.DLL이 ...
    이렇게 되여있는데 TEST.EXE 를 TEXT.EXE라고 수정해야 하는것 아닌지...
    그림 16.1에는 TEXT.EXE로 되여있어서 말입니다.

    혹은 그림이 잘못되였을수도 있겠죠...
    확인 부탁드립니다.

    • reversecore 2014.11.30 09:07 신고

      편집과정에서 그림이 잘 못 되었네요~

      좋은 지적 감사합니다~~

  18. 행인1 2014.08.20 16:44

    p,998 에 401041 주소에서 14바이트 크기만큼 읽어들이는 명령입니다.
    와 같이 되어있는데요.
    디버거에서 표현된 14는 16진수 값이기 때문에 변환해서 20바이트 라고 표기되야 맞는것 같습니다
    확인부탁드려요
    이거외에 엄청많이 찾았는데 글쓰기 권한이 없다고 못올린다고해서 다패스했네요 ㅠㅠ

    • reversecore 2014.11.30 09:15 신고

      안녕하세요.

      16진수 표현을 그대로 적어서 많이 불편하셨군요.

      10진수로 변경해서 표현하면 또 그림/코드와 달라져서... 그건 그거대로 혼동이 오기 때문에 그냥 16으로 표기하고 있습니다.

      코드/그림/표 등에서 숫자를 표기할 때 별다른 설명이 없다면 16진수로 이해해 주시면 되겠습니다. 실제로 리버서들도 그렇게 의사소통을 한답니다.

      양해 부탁드리겠습니다~~

      감사합니다.

  19. 어무이 2014.09.02 11:39

    이승원님 오타 확인 좀 해주세요. 6월 이후로 확인을 안해주시네요.
    배우는 사람 입장에선 오타하나 때문에 몇시간씩 머리 싸메고 있답니다.

    • reversecore 2014.11.30 09:17 신고

      안녕하세요.

      불편을 드려서 죄송합니다.

      저 위에 댓글 올리신 분이시죠?
      답글 달았습니다.

      불편 드려서 죄송합니다~~~

  20. 하얀백숙 2015.02.03 22:01

    224p 에서
    따라서 RVA 1420은 VA AF1420이고, 그 주소에는 AF10C4라는 IAT주소가 ~~
    이렇게 되어있는데요. 223p 그림 16.8을 보면 AF1420에서 AF10C4주소가 저장되어있는것이 아니라 AF141E아닌가요?

    아니면 제가 잘못이해하는건가요 ㅠ

  21. 응? 2018.12.26 11:59

    4쇄본을 보고있는데요 321p에
    "ThreadProc()의 내용은 urlmon!URLDownloadToFile() API를 호출하여 네이버 사이트의 index.html 파일을 다운받습니다."
    이렇게 되어있는데요.
    여기서 urlmon!URLDownloadToFile() API가 아니라 URLDownloadToFile() API인거 아닌가요?

반응형

저도 오늘 갑자기 편집자님의 메일을 받고 알게 되었네요~ @@~

예약판매 페이지가 떴습니다. ^^


[리버싱 핵심 원리 : 악성 코드 분석가의 리버싱 이야기]

이승원 저

인사이트(Insight)





마음의 준비 없이 갑자기 전해 들은 소식이라... 저도 좀 놀랐습니다...

드디어 나오다니요... 지금 기분을 어떻게 말로 설명할 수 가 없네요~~~ ㅎㅎㅎ


관심 가져 주시고 응원해 주신 모든 분들께 감사드립니다. ^^~


반응형
  1. 이전 댓글 더보기
  2. saeglo 2012.09.20 18:48

    축하드립니다.
    이건 고민할 필요가 없네요.

  3. hookerz 2012.09.20 23:25

    정말 짜증납니다 이 책 때문에!!

    오늘 교보 문고를 다녀왔거든요 ㅠ_ㅠ

    현기증 날라구 한단 말이에요 어여 출간해 주세요!

    기대하고 있습니다 축하드려요

    • reversecore 2012.09.22 00:55 신고

      ㅎㅎㅎ 깜짝 놀랐네요~

      잠시만 기다려 주세요~

      감사합니다. ^^~

  4. Lr라 2012.09.22 14:01

    리버스코어님은 블로그말고 하시는곳 없나여? ..;;
    으앜.. 만약네이트온 하신다면.. 아이디좀 알려주세요~^^;
    저도 물론 리버스엔지니어링을 열심히(?) 하는 사람입니다 ㅎ
    많은 대화를 나눠보고싶네요! ㅎ

    • reversecore 2012.09.27 12:59 신고

      ㅎㅎ 메신저는 사용하지 않습니다.

      블로그에 질문 올려주시면 답변해드릴께요~

      감사합니다~ ^^

  5. AC 2012.09.22 23:41

    리버스코어형님 항상 블로그 하루에 몇번씩 들어오고 그러는데

    책 발매를 하신다니 당장 구매할 생각입니다!! 책내신거 축하드리고요

    책사서 사인받고싶습니다ㅋㅋㅋ

    어떻게 하면 사인 받을수 있을까요?

    • reversecore 2012.09.28 00:19 신고

      안녕하세요.

      사인을 원하시는 분들이 계신데요.
      원하시는 분들께는 전부 해드리고 싶습니다만, 물리적인 제약사항이 있어서 말이죠.

      혹시 원하신다면 아이패드 그림 앱으로 사인을 해서 이메일로 보내드릴 수 있습니다. 성함과 이메일 주소를 알려 주시기 바랍니다.

      감사합니다. ^^~

  6. 질문이요 2012.09.23 00:16

    리버싱핵심원리 라는 책 초보자가 입문하기에 괜찮나요?

    따로 배경지식 깔고 들어가야하는 과목이 있나요?

    • reversecore 2012.09.28 00:25 신고

      안녕하세요.

      음... 배경지식으로 말하자면 너무 많습니다~ ^^
      Assembly, C/C++, Debugger, PE File Format, Windows OS Internals, etc

      하나하나 만만치 않지요. 마스터를 목표로 하신다면 정말 오랜 시간이 걸리는 것들입니다.

      그래서 저는 배경지식과 리버싱을 따로 구분하지 않고, 모두 리버싱 과목에 포함된다고 생각합니다. 즉, 저런 것들을 공부하는 것이 곧 리버싱을 공부하는 것이라고 말이죠.

      리버싱 공부를 시작할 때의 어려움은 바로 '두려움' 입니다. 저런걸 언제 다 공부하나... 하는 두려움이요. 일단 블로그의 HelloWorld 를 따라 해보시고 조금 감을 잡아 보시기 바랍니다. 그렇게 천천히 하나씩 시도하는 것이 중요하다고 봅니다.

      감사합니다.

  7. Reverser Hyeok 2012.09.24 15:52

    드디어 책이 나왔군요... ㅎㅎ

    진짜 오래전부터 기다려왔었는데

    당장 구입하고 열공해야겠습니다 ^^

  8. j 2012.09.24 20:38

    예약구매했는데 오늘 추석지나서 발매예정이라는 문자가왔네요
    좀 느긋이 기다려야겠네요 ^^

  9. Saturn 2012.09.25 19:50

    예약 했습니다.!! ^^ 기대 하고 잘 보겠습니다.
    초보 입문자가~ ㅎㅎ

  10. 지나가다 2012.09.26 09:45

    혹시... 전자책으로 파실생각은 없으신건가요? ㅎㅎ
    drm 입힌걸로 해서 파시면 아이패드에서 편히 볼 것 같은데...;;

    • reversecore 2012.09.28 03:54 신고

      안녕하세요.

      저도 처음에 그 생각을 해봤습니다.
      실제로 아이패드로 원고 교정을 했고 말이죠.
      아마존에서 기술 서적 이북을 몇 권 사서 읽어도 봤죠.

      근데 기술서적은 아직 전자책보다 종이책이 편하더군요. ^^
      전자책은 검색에서 특히 불편합니다.

      기술서적은 한번 다 읽은 후에도 레퍼런스로 곁에 두고 자주 꺼내보게 되는데요...
      뭐 하나를 찾을 때 '그게 여기 어디쯤 본 내용 같은데?' 하고 종이책에서는 손때 묻은 그 페이지를 금방 찾겠는데, 전자책은 아직 검색이 불편해요.
      그 대신 전자책의 휴대성은 엄청난 강점이지요.

      조만간 전자책 소프트웨어가 더 발전하면 기술 서적들이 더 많이 이북으로 출간이 될 것으로 생각합니다.

      감사합니다.

  11. 델피언 2012.09.26 13:30

    항상 블로그에서 좋은 정보 얻어가던게
    너무 감사해서 바로 예약구매 했습니다 ㅎ

  12. 미친감자 2012.09.26 15:00

    축하드립니다.^^
    언제 싸인 받으로 가겠습니다.^^

  13. 익명 2012.09.27 00:06

    헉 블로그 글들이 왜사라지고있죠???ㅠ

    • reversecore 2012.09.28 00:55 신고

      안녕하세요.

      제가 조만간 공지를 올리려 했는데요.
      댓글로 먼저 알려드려야 겠네요~

      제 책 전체 분량의 50~60% 가량은 기존 블로그의 내용으로 채워져 있습니다. 기술 서적을 돈 주고 구매하시는 분들의 입장을 고려해서 일부 글을 내렸습니다.

      주로 비인기 글, 어려운 글, 여러 기술과 연관되는 글 등을 내렸습니다. 많은 분들께서 좋아해 주시고 도움을 받았다고 알려주신 HelloWorld, PE File Format, DLL Injection, API Hooking 등은 그대로 남겨 두었습니다.

      리버스코어 블로그는 더 새롭고 재밌는 컨텐츠로 채워 나갈 것입니다. 계속 재밌게 봐주세요~ ^^

      감사합니다.

  14. 담벼락 2012.09.27 11:22

    이게 바로 멘탈붕괴인가요.. 10월초에 온다는 책이 내일 온다는데기뻐해야되는데.. 추석이라 집에 내 려갈뿐이고, 배송지는 학교기숙사일뿐이고. ᅲ 일찍와도 볼 수 없는 이 불편한 진실

    • reversecore 2012.09.28 00:58 신고

      아, 그러시군요.

      더 잘 되었다고 생각해보시는건 어떨까요? 명절에 가족, 친지들과 더 좋은 시간을 보내실 수 있게 되었다고 말이죠. ^^~

      감사합니다.

  15. SuperSoul 2012.09.27 15:05

    책을 받았습니다. 역시 알찬 내용으로 가득하네요.
    그동안 블로그 내용을 많이 스크랩 해 뒀었는데, 이젠 이 책만 보면 되겠군요.

    책이 생각보다 두꺼워서 놀랬습니다.
    리버싱 책 중에 이렇게 두꺼운 책은 처음인 듯....
    하지만 내용을 어렵지 않게 해 주셔서 책장 넘어가기 어렵진 않네요.

    저는 이번에 새로 나온 강벽탁님 저서랑 동시에 구입했는데요,
    reversecore님 책을 기본서로 하고 강병탁님 저서를 그 다음에 보는게
    좋을 것 같다는 생각이 들었습니다. 겹치는 내용보다 상호 보완적 내용이 많아서 기쁩니다.

    아쉬운 점은, 예전에 여기서 받았던 InjDll64는
    실제론 64비트 환경에서 DLL 인젝션에 실패하는 경우가 많더군요.
    아직 인사이트북 블로그에 파일이나 소스를 못찾아 봤지만, 책 내용은 동일한 듯 하네요.
    EasyHook이나 Diviare같은 라이브러리는 성공하는 걸로 봐서, 뭔가 놓친 게 있다 싶습니다.

    하지만 전체적으로 이만한 리버싱책은 전무후무 했다고 생각합니다.
    다들 자기가 하고싶은 얘기만 하거나, 툴 사용법 혹은 기초 이론, 과거기술 소개 등에서
    끝마치면서 돌아오는 것 없는 메아리 같은 연습만 시키는 책들이 부지기수인데 비해,
    이 책은 실제로 많은 내용이, 말 그대로 '살아있네' 입니다.
    그것도 책 두게가 말해주는 상세한 설명까지 붙어서 살아있으니,
    아주 팔딱팔딱 하는 싱싱한 내용이 아닌가 합니다.
    좋은 책 내주셔서 감사드립니다.

    • reversecore 2012.09.28 00:59 신고

      헉? @@
      책을 벌써 받아보셨다고요?

      저도 아직 못받아 봤는데요.ㅜㅜ
      책에 대한 칭찬 감사드립니다~ ^^

      아, 저도 리버싱 입문서가 거의 동시에 출간되서 매우 기쁘게 생각합니다. 각 저자마다 자신이 잘하고 비중을 두는 부분이 다를것입니다. 그래서 독자들의 다양한 입맛에 맞는 입문서가 많이 출간되어야 한다고 생각합니다. ^^

      InjDll64의 문제로 보이는 부분이 있으시면 저에게도 알려주시면 감사하겠습니다. 그리고 예제 파일과 소스는 바로 오픈하였습니다~

      감사합니다.

  16. zina 2012.09.27 16:28

    이제야 봤네요. 지금 당장 구매했습니다. 수고하셨고 감사합니다.

  17. hare 2012.09.28 10:01

    기다리던!! ㅜㅡㅜ 목차만 봐도 내용들이 상상이 가는군요!ㅎ
    좋은책을 볼수 있게 해주셔서 정말 감사합니다!

  18. h4cktiz3n 2012.09.28 10:42

    책이 도착했네요
    추석전에 와서 다행이라고 생각하고 있습니다. 지루한 추석을
    흥미로운 책과 함께 하겠네요

    • reversecore 2012.10.06 02:20 신고

      안녕하세요~

      추석 잘 보내셨는지요?

      부디 책이 기대에 맞게 흥미로우셨기를 바랍니다.

      감사합니다.

  19. lheer 2012.10.02 18:50

    오늘 영등포 타임스퀘어 內 교보문고에서
    구입을 했어요.
    비닐포장이 되어있더군요.
    집에 도착하자마자
    비닐포장을 띁을까 하다가 참았어요 ^^

    나중에 천천히 볼려구요.ㅎ
    책을 소장한걸로 고수가 된 기분입니다.

    • reversecore 2012.10.06 02:19 신고

      안녕하세요~

      전 아직 오프라인 서점을 못 나가봤습니다.
      비닐 포장은 의외네요~ ^^

      감사합니다.

  20. niney 2012.10.08 17:21

    안녕하세요~! 블로그 글이 잘 되어있어
    책 사는거에 고민없이 사게됬습니다
    감사하고 수고하세요~!
    자주 들리겠습니다~!

  21. db_click 2012.10.13 14:00

    2년 가까이 기다린 것 같네요
    비록 눈팅만 하면서 기다렸지만..

    시간과 돈이 전혀 아깝지 않네요.
    책과 함께 행복한 시간 보낼게요 ~
    감사합니다.

    • reversecore 2012.10.14 23:34 신고

      안녕하세요.

      저만큼 오래 기다려 주셨네요~

      너무 좋은 말씀 감사합니다 .^^

반응형

어플리케이션 후킹(Application Hooking) 설계(디자인)에 대한 설명입니다. 후킹 방법을 결정하고, 검증하는 과정을 보여드립니다. 



후킹 방법 결정 - 무엇을? 어떻게? 후킹 할 것인가?


우리의 목표는 [HxD.exe 프로그램에서 PE 파일을 열었을 때 상태바의 "Offset: XXXX" 문자열에 "RVA: YYYY" 문자열을 추가하기]  입니다.


기존 어플리케이션에 어떤 기능을 추가(혹은 수정) 하려고 마음을 먹었다면 그 다음에는 구체적인 방법에 대해 고민을 해야 합니다. 즉, 후킹 설계 과정으로 들어가야 합니다.


윈도우즈 OS의 대표적인 후킹 기법은 "메시지 후킹(Message Hooking)""API 후킹(API Hooking)" 입니다. 둘 중에서 목표 달성에 더 적합하고 구현이 편리한 방법을 사용하는 것이 좋을 것입니다.


일반적으로는 메시지 후킹 기법이 더 간단하고 더 안전하다고 볼 수 있습니다. 대신 경우에 따라(특히 GUI 관련) 더 많은 고려사항이 필요한 경우가 있습니다. 따라서 실전에서는 후킹 설계 단계에서 메시지 후킹 방법이 더 편리할지 확인해 보는 것이 좋습니다.



메시지 후킹 기법 검증


우리 목표에 메시지 후킹 기법이 잘 어울릴지 검증해 보도록 하겠습니다. 


Windows OS 는 어플리케이션 윈도우의 GUI 처리 작업을 위해 윈도우 메시지를 이용합니다. HxD.exe 의 상태바도 일종의 윈도우입니다. 프로그램 내부에서 상태바에 특정 문자열을 쓰기 위해 관련된 윈도우 메시지를 전달할 것입니다. 


* 참고 


GUI 관련 API 를 호출하면 GUI 작업 처리를 할 수 있기 때문에 마치 윈도우 메시지를 사용하지 않고도 작업이 가능한 것처럼 생각될 수도 있습니다. 그러나 실제로는 API 내부에서 윈도우 메시지를 보내는 것입니다. 일반적인 GUI 작업은 메시지 기반으로 동작한다는 것을 기억하시기 바랍니다.


HxD.exe 의 상태바에 있는 "Offset: XXXX" 문자열이 변경될 때 상태바 윈도우 프로시저(Window Procedure)에서 처리하는 윈도우 메시지들을 확인해 보겠습니다. 먼저 HxD.exe 프로그램을 실행 하신 후 적당한 PE 파일을 열어 주세요.


그리고 윈도우 메시지를 모니터링 하기 위해 Spy++ 유틸리티를 실행합니다.



<그림 3 - Spy++ 실행화면>


* 참고


윈도우 메시지 확인에 있어서 Spy++ 은 최고의 유틸리티입니다. 기본 동작 원리는 윈도우 메시지 후킹입니다. 모니터링 대상 프로세스에 DLL 을 인젝션 시켜서 사용자가 원하는 메시지를 모니터링 합니다. Spy++ 은 Microsoft Visual Studio 패키지에 포함된 유틸리티 입니다. 


Spy++의 툴바에서 "Log Messages... (Ctrl+M)" 버튼을 선택합니다. (또는 "Spy - Log Messages..." 메뉴를 선택하셔도 됩니다.)



<그림 4 - Log Messages... (Ctrl+M) 툴바 버튼>


Message Options 다이알로그가 나타납니다.



<그림 5 - Message Options 다이알로그>


Windows 탭의 Finder Tool 을 이용할 것입니다. Finder Tool 아이콘을 마우스 버튼을 누른 채로 드래그 하면 마우스 포인터가 과녁 모양으로 바뀝니다. 이 과녁 모양의 마우스 포인터를 HxD 의 상태바 윈도우에 위치시킨 후 마우스 버튼에서 손을 떼면 Spy++ 의 타겟(Target) 윈도우로 설정됩니다. (과녁 모양의 마우스 포인터 밑에 있는 윈도우는 두꺼운 검은색 테두리가 생겨서 잘 알아 볼 수 있습니다.)



<그림 6 - Finder Tool 로 상태바 설정>


이제 Spy++ 의 Message Options 다이알로그의 "Selected Object" 섹션에 지금 선택된 HxD 의 상태바 윈도우에 대한 정보들이 표시됩니다.



<그림 7 - HxD 의 상태바 윈도우 정보>


각 정보들이 나타내는 의미는 <표 1>과 같습니다.


 항목

 의미

 

 Window

 윈도우 핸들

 001B0362

 Text

 윈도우 텍스트

 Offset: 0

 Class

 윈도우 클래스 이름

 TXmStatusBar

 Style

 윈도우 스타일

 54000100

 Rect

 윈도우 위치와 크기

 (15, 663)-(589, 684) 574x21

 Thread ID

 윈도우를 생성한 스레드 ID

 00000150

 Process ID

 윈도우가 속한 프로세스 ID

 00000F30


<표 1 - Selected Object 항목들의 의미>


* 참고


Spy++ 에서 보여주는 상태바 윈도우의 정보는 나중에 메시지 후킹을 구현할 때 좋은 참고자료가 됩니다.


윈도우 클래스 이름이 "TXmStatusBar" 인 걸로 봐서 윈도우 기본 상태바(StatusBar)를 서브클래싱(SubClassing) 한 것으로 추정됩니다. 그렇다면 기본 동작은 윈도우 기본 상태바와 비슷할 것이라고 예상해 봅니다.


Message Options 다이알로그의 [확인] 버튼을 선택하면 이제부터 Spy++ 은 HxD 의 상태바 메시지를 모니터링하기 시작 합니다. 시험 삼아서 마우스 포인터를 상태바 위에서 이리저리 이동해 보시기 바랍니다. Spy++ 화면에 마우스 관련 메시지가 많이 나타날 것입니다.



<그림 8 - 마우스 이동 메시지>


Spy++ 의 메시지 캡쳐 옵션을 디폴트인 'ALL' 로 설정하였기 때문에 상태바로 전달되는 모든 메시지가 표시되는 것입니다. 우리가 진짜 궁금한 내용은 상태바에 문자열이 써지는 순간에 어떤 메시지를 받느냐 하는 것입니다. 


Spy++ 툴바의 'Clear Log (Del)' 버튼을 선택하여 지금까지 쌓인 로그를 지워버립니다. 그리고 HxD.exe 의 메인 화면 내의 아무 부분을 마우스로 클릭하시기 바랍니다. 마우스가 선택한 파일의 옵셋을 상태바에 출력하기 위해 메시지가 전달될 것입니다.



<그림 9 - 문자열 출력 메시지>


HxD 메인 윈도우에서 마우스 클릭을 한번 하면 정확히 9개의 메시지 로그가 출력됩니다. (제가 보기 편하게 들여쓰기를 하였습니다.)


<00001> 001B0362 S message:0x040A [User-defined:WM_USER+10] wParam:00000000 lParam:0012FA84

<00002> 001B0362 R message:0x040A [User-defined:WM_USER+10] lResult:00000001


<00003> 001B0362 P WM_PAINT hdc:00000000


<00004> 001B0362 S message:0x0401 [User-defined:WM_USER+1] wParam:00000000 lParam:01A06768

<00005> 001B0362 S   WM_PAINT hdc:00000000

<00006> 001B0362 S     WM_ERASEBKGND hdc:33010BC2

<00007> 001B0362 R     WM_ERASEBKGND fErased:True

<00008> 001B0362 R   WM_PAINT

<00009> 001B0362 R message:0x0401 [User-defined:WM_USER+1] lResult:00000001


1번 로그의 메시지는 WM_USER(0x400)+A 이고 그 때의 lParam 값은 0012FA84 입니다. lParam 값이 마치 스택의 주소를 가리키는 것으로 추정됩니다. 그리고 4번 로그의 메시지는 WM_USER(0x400)+1 이고 lParam 값은 01A06768 입니다. 이 값 또한 메모리 주소를 표시한다고 추정해 볼 수 있겠습니다. 


마우스(또는 키보드)를 이용하여 HxD 메인 윈도우의 커서를 다른 옵셋으로 이동시키면 기본적으로 이와 동일한 9 개의 메시지 로그가 기록됩니다. 그리고 4 번째 로그의 lParam 값은 계속 바뀌는 것을 알 수 있습니다. (아마 동적 할당 메모리로 추정됩니다.)


따라서 상태바 윈도우는 사용자 정의 메시지인 WM_USER+1 또는 WM_USER+A 메시지를 받아서 lParam 이 가리키는 주소의 문자열을 상태바 윈도우에 쓴다고 추정해 볼 수 있겠습니다. 그 중에서도 4번 로그 메시지 WM_USER+1 을 받은 직후 WM_PAINT 와 WM_ERASEBKGND 메시지가 연속해서 나타나는 걸로 봐서는 WM_USER+1 메시지가 상태바 윈도우에 실제 값을 쓰라는 명령으로 보입니다.


디버거를 이용하여 lParam 이 가리키는 주소를 확인해보면 앞에서 추론한 내용이 맞는지 알 수 있겠지요.


* 참고


WM_PAINT 는 윈도우를 다시 그릴 때 발생되고, WM_ERASEBKGND 는 윈도우 배경을 지울 때 발생됩니다. WM_USER (0x400) 이후부터는 사용자 정의 메시지로서 프로그래머가 마음대로 지정해서 사용할 수 있습니다. 물론 메시지를 받는 윈도우 프로시저에서 사용자 정의 메시지를 잘 처리할 수 있도록 구현해야 합니다. 해당 메시지에 대한 더 자세한 설명은 MSDN 을 참고하시기 바랍니다.



디버깅


OllyDbg 를 실행하여 HxD.exe 프로세스에 Attach 시킵니다. 디버거는 ntdll.dll 메모리 영역의 System Break Point 위치에서 멈춥니다. 디버거를 실행[F9] 시켜 줍니다. 


윈도우 메시지를 디버깅 할 때는 주의사항이 있습니다. 그건 바로 디버기 프로세스(HxD.exe)의 윈도우를 가리면 안된다는 것입니다. 즉 OllyDbg 나 Spy++ 윈도우에 의해 HxD 윈도우가 가려졌다가 나타났다가 하게 되면 불필요한 로그가 Spy++ 에 쌓이게 됩니다. (물론 Spy++ 옵션을 고쳐서 모니터링 메시지를 필요한 것 만으로 제한해도 됩니다.) 


작업 편의상 각 윈도우들을 독립적으로 배치 시켜 주시기 바랍니다.



<그림 10 - 윈도우 배치>


다시 Spy++ 의 로그를 깨끗이 지우신 다음 마우스로 HxD 메인 윈도우 아무 곳이나 선택해 주세요. 제 경우에 Spy++ 의 WM_USER+1 로그의 lParam 주소는 01A0BA28 입니다. 



<그림 11 - 새로운 lParam 값>


이 주소를 OllyDbg 의 메모리 윈도우에서 검색해 보겠습니다.



<그림 12 - OllyDbg 에서 확인한 lParam 내용>


HxD 의 상태바에 나타난 것과 동일한 문자열이 ASCII 형태로 표시되어 있습니다. (이 경우에는 운좋게 예상과 잘 맞아서 쉽게 발견할 수 있었습니다.) 이 WM_USER+1 메시지를 후킹해서 lParam 이 가리키는 문자열("Offset: XXXX")을 읽은 후 RAW -> RVA 변환하여 표시해 주면 목표를 완수 할 수 있을 것 같습니다.


결론적으로 메시지 후킹 방법은 우리 목표에 잘 들어맞는 방법입니다. 다음 포스트에서 실제 메시지 후킹을 구현해 보도록 하겠습니다.


* 참고


사실 제가 처음 떠올렸던 아이디어는 단순한 마우스 메시지 후킹이었습니다. HxD.exe 상태바의 문자열이 바뀌려면 먼저 마우스로 커서 위치를 바꿔줘야 했으니 마우스 훅 프로시저에서 상태바의 문자열을 읽고 쓸 수 있지 않을까 하고 말이죠. 그러나 조금 더 생각해보니 좋은 아이디어가 아니라서 접었습니다. 이유는 키보드로도 커서 위치를 바꿀 수 있으니 키보드 메시지도 후킹 해야 할 테고, 상태바 윈도우가 다시 그려져야 하는 모든 상황(윈도우 이동, 윈도우가 가려졌다가 다시 나타나기, HxD 에서 다른 파일 열기, 기타)을 고려했을 때 후킹해야 할 메시지가 많아 질 것 같았기 때문입니다. 

따라서 덮어놓고 후킹을 시도하기보다는 먼저 차분히 생각을 정리해보고, 아이디어를 검증하는 단계가 매우 중요하다고 볼 수 있겠습니다.




ReverseCore

반응형
  1. J 2012.07.14 01:19

    언제나처럼 흥미로운 주제에 대한 포스팅이시네요. ^^
    주말시간에 한번 도전해봐야겠네요. ^^
    여름에 책으로 꼭 볼 수 있으면 좋겠습니다.

  2. 군인 2012.07.17 21:13

    재밌네요^^
    좋은 글 감사해요!!!! 잘읽고갑니다 :)

  3. packeter 2012.07.20 18:47

    HxD.exe 내부에서 사용하는 일반 함수를 Injection된 DLL에서 실행하는 방법은 없을까요?
    후킹은 passive해서.. 해당 API가 동작 해야만 원하는 코드를 실행시킬 수 있는데요,
    active하게 해당 API동작 없이.. 후킹한 API를 실행한다거나 하는 방법은 없을까요?

  4. smartdolphin 2012.07.23 13:12

    초보자들도 알기쉽게 잘 설명해주셨네요! 근데 책은 언제쯤 나오나요? 하루 빨리 책 출판을 기다리고 있숩니다~^^

  5. 멘죠님 2012.07.29 22:44

    즐겨찾기에 추가해 놓고 가끔 리버스코어님 블로그 들어와서 강좌만 읽고 가지만....
    정말 대단하시다는 말밖에 안나오네욤.....
    대한민국에 리버싱에 대해 이렇게 상세하게..그것도 기본부터 아주 세심하게
    강좌를 설명해 놓은 곳이 있을까요??

    물론 대한민국에 실력 좋은 사람들 많겠지만...
    코어님 처럼 이렇게 행동으로 꾸준하게 보여주는 사람은 아마 대한민국에 없을것으로 봅니다..

    정말 대단하세요...코어님...아니 형님!!! (__)

  6. 나그네 2012.08.01 16:18

    좋은 정보 감사합니다!
    열심히 공부할게요 ^_^

  7. 김호준 2012.09.05 13:35

    리버스 코어님!! 강컴사이트에서 http://kangcom.com/sub/view.asp?sku=201209040003

    이책을 보았는데 9월 20일 출판예정으로 되어있네요...

    혹시 이게 집필중이던 책인가요?

    맞으면 지금 바로 예약주문 하려구요 답변부탁드려요~~~

  8. ditongs 2012.09.05 20:33

    김호준님이 알려주신 링크는 넥슨 아메리카 게임보안팀에 계신 "강병탁"님이 집필하신 책입니다~
    저도 지금 주문 기다리고 있습니다. 말그대로 바이블입니다. 강추!

    • 김호준 2012.09.07 13:30

      다른분이셨군요...어쨌든 살책이 점점더 늘어나는데...지갑은 가벼워지고..아이고...ㅠㅠ

  9. 박종석 2012.09.11 17:25

    드디어 출간이 되네요.... 벌써부터 기대가 됩니다.
    "리버싱 핵심 원리"
    http://www.yes24.com/24/Goods/7529742?Acode=101

    • 담벼락 2012.09.11 17:28

      목차 보고 딱 리버스코어님이 만드신 걸 느꼈네요. 어서 예약 구매 질러야겠어요

    • 김호준 2012.09.11 17:39

      우어~~ 분량이 엄청난데요..ㄷㄷㄷ 바이블이 될듯합니다..ㄷㄷㄷ

  10. Lr라 2013.03.04 14:48

    어렵군요..ㅎㅎ;;
    그냥 이정도 자료로도 저에겐 벅찹니다..

    • reversecore 2013.03.04 20:17 신고

      ^^ 네, 처음 접하시면 분명히 어려운게 사실이지요.

      뭐든지 그렇지만 자꾸 보면 할만해져요~

      리버서들이 천재도 아니고 그냥 평범한 사람들이거든요. 그런데요 자꾸 보다보면 괜찮아요~ ^^

      감사합니다.

  11. supras shoes 2013.04.27 02:40

    내가 성공을 했다면 오직 천사와 같은 어머니의 덕이다.Topics related articles:


    http://azza.tistory.com/116 新建文章 11

    http://color114.tistory.com/68 新建文章 6

    http://mycite.tistory.com/78 新建文章 2

    http://bfhopestore.tistory.com/206 新建文章 5

  12. lunettes carrera 2013.04.28 04:22

    희미한 달빛이 샘물 위에 떠있으면, http://noq.botasugger.com/ botas ugg online,나는 너를 생각한다.

  13. nike free run shoes 2013.04.29 06:27

    노동은 생활의 꽃이요, 삶의 보람이요, 마음의 기쁨이다.Topics related articles:


    http://sma14u.tistory.com/70 新建文章 3

    http://ianbuffet.tistory.com/44?nil_openapi=search 新建文章 12

    http://eshita.tistory.com/120 新建文章 2

    http://starspalace.tistory.com/53 新建文章 6

+ Recent posts