"리버싱 핵심 원리" 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 (정오표)  (79) 2012.10.01
    이전 댓글 더보기
  1. Angwoo 2013.01.03 00:56 신고 댓글주소 | 수정 | 삭제 | 댓글

    좋은 책 잘 보고 있습니다.

    현재 초판 1쇄입니다.
    360p에 (IID 구조체 하나의 크기는 14바이트)라고 되어있는데
    14h 또는 20바이트로 수정되어야 맞다고 생각합니다.


  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로 나와있네요. 개인적인 의견입니다.

  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 이렇게 하는겟 맞지않나요?

  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는 전혀 맞지 않는 그림입니다.
    이 사이트에라도 맞는 그림을 올려주시면 좋겠습니다.

  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로 되여있어서 말입니다.

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

  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월 이후로 확인을 안해주시네요.
    배우는 사람 입장에선 오타하나 때문에 몇시간씩 머리 싸메고 있답니다.

  20. 하얀백숙 2015.02.03 22:01 신고 댓글주소 | 수정 | 삭제 | 댓글

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

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





티스토리 툴바