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