반응형


"리버싱 핵심 원리" 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 이 업데이트 되었습니다.)





반응형

+ Recent posts