"리버싱 핵심 원리" 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 |
---|
- 이전 댓글 더보기
-
Scavenger 2013.01.05 15:12
초판 1쇄입니다.
322p에 "...szDllName 크기만큼 메모리를 할당한다" 의 주석 부분에서, szDllName이란 변수는 코드상에 없습니다. 아마 szDllPath 의 크기를 dwBufSize에 넣는 과정에서 소스 코드 수정이 있었고 해당 수정 부분이 주석엔 반영이 안된 것 같습니다..........
확인부탁드립니다^^-
reversecore 2013.01.12 01:08 신고
안녕하세요.
네, 말씀하신 부분이 맞습니다. szDllPath 라고 해야 정확합니다.
errata 에 등록하도록 하겠습니다. ^^
감사합니다.
-
-
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 입니다. ^^
참고로 다른 환경에서는 다른 값이 나올 수 있습니다.
감사합니다.
-
-
조영용 2013.01.23 09:34
ImageBase의 정확한 개념설명은 p155에서 처음 나오는 것 같은데 찾아보기에서는 p215로 나와있네요. 개인적인 의견입니다.
-
Scavenger 2013.02.10 10:32
초판 독자입니다.
422p 에서 "ESI 레지스터는 그림 28.28에서 보다시피..." 에서, 다음과 같이 수정되어야 할 것 같습니다.
그림 28.28 -> 그림 28.31
감사합니다.
-
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 영역의 코드를 선택해서 보여주면 더 좋을 뻔했네요~
좋은 의견 감사합니다. ^^~
-
-
ifelse 2013.04.26 11:27
안녕하세요.
546 페이지 언훅 소스에서
VirtualProtect((LPVOIDpFunc,5,PAGE_EXCUTE_READWRITE,&dwOldProtect)
첫번째 인자와 두번째인자를 (LPVOID)((DWORD)((pFunc)-5),7 이렇게 하는겟 맞지않나요? -
icandoit 2013.04.29 19:24
안녕하세요.
혹시 164페이지 상단에 퀴즈라고 있는 부분에, RAW를 구하는 것이 아닌가요??
근데 RVA를 계산해보라고 쓰여있어서...
확인 부탁드릴게요~ -
불협 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 코드를 전부 입력완료한 화면입니다. (한줄씩 따라서 입력하시면 됩니다.)
좋은 지적 감사합니다~~
-
-
초판 1쇄 기준입니다. 왠지 정오표에 없어서요.
573p 하단: NewInternetConnetcW() 함수의 코드 역시 -> NewInternetConnectW() 함수의 코드 역시
615p 그림 38.1: 이 테이블은 PE로더를 덮어씁니다. -> PE로더가 이 테이블을 덮어씁니다.
미뤄두면 올리는 걸 잊어버릴까봐 미리 올려요... -
라라라 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쇄) -
Fx 2014.06.05 10:39
3쇄 독자입니다.
253페이지, 그림 18.24는 전혀 맞지 않는 그림입니다.
이 사이트에라도 맞는 그림을 올려주시면 좋겠습니다. -
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 로 통일(혹은 대세가) 되었나요?
그랬다면 표준 용어를 따라 변경하는게 맞다고 봅니다.
자문을 좀 구해보고 수정여부를 결정하겠습니다.
아, 그리고 오류를 발견해주시면 너무 기쁘고 감사하게 생각한답니다. ^^ 바쁜 시간을 내주셔서 저와 출판사에 도움을 주신거잖아요~
적극 반영하도록 하겠습니다.
감사합니다.
-
-
어무이 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 문자열이 보입니다.
감사합니다.
-
-
dd 2014.07.26 11:12
p.223 VirtualSize(1000) + Offset(420) = 1420(RVA)
에서
VirtualSize가 아니라 VirtualAddress 입니다. -
행인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 신고
아, 그건요 코드 내용이 맞습니다.
만약 숨기려는 프로세스가 연결리스트의 마지막 노드라면,
이전의 노드를 마지막 노드로 설정하라는 뜻입니다.
(그래야 마지막 노드가 숨겨지겠죠?)
감사합니다.
-
-
Backer 2014.08.09 03:47
안녕하세요
읽다가 오타 발견해서 알려드립니다.
215페지에서
그림 16.1을 보면 TEST.EXE프로쎄스에 A.DLL이 ...
이렇게 되여있는데 TEST.EXE 를 TEXT.EXE라고 수정해야 하는것 아닌지...
그림 16.1에는 TEXT.EXE로 되여있어서 말입니다.
혹은 그림이 잘못되였을수도 있겠죠...
확인 부탁드립니다. -
행인1 2014.08.20 16:44
p,998 에 401041 주소에서 14바이트 크기만큼 읽어들이는 명령입니다.
와 같이 되어있는데요.
디버거에서 표현된 14는 16진수 값이기 때문에 변환해서 20바이트 라고 표기되야 맞는것 같습니다
확인부탁드려요
이거외에 엄청많이 찾았는데 글쓰기 권한이 없다고 못올린다고해서 다패스했네요 ㅠㅠ-
reversecore 2014.11.30 09:15 신고
안녕하세요.
16진수 표현을 그대로 적어서 많이 불편하셨군요.
10진수로 변경해서 표현하면 또 그림/코드와 달라져서... 그건 그거대로 혼동이 오기 때문에 그냥 16으로 표기하고 있습니다.
코드/그림/표 등에서 숫자를 표기할 때 별다른 설명이 없다면 16진수로 이해해 주시면 되겠습니다. 실제로 리버서들도 그렇게 의사소통을 한답니다.
양해 부탁드리겠습니다~~
감사합니다.
-
-
어무이 2014.09.02 11:39
이승원님 오타 확인 좀 해주세요. 6월 이후로 확인을 안해주시네요.
배우는 사람 입장에선 오타하나 때문에 몇시간씩 머리 싸메고 있답니다.
-
reversecore 2014.11.30 09:17 신고
안녕하세요.
불편을 드려서 죄송합니다.
저 위에 댓글 올리신 분이시죠?
답글 달았습니다.
불편 드려서 죄송합니다~~~
-