首页
社区
课程
招聘
《The Shellcoder's handbook》翻译汇总及勘误
发表于: 2006-12-3 22:27 34726

《The Shellcoder's handbook》翻译汇总及勘误

arhat 活跃值
31
2006-12-3 22:27
34726
收藏
免费 7
支持
分享
最新回复 (53)
雪    币: 2108
活跃值: (208)
能力值: (RANK:1260 )
在线值:
发帖
回帖
粉丝
2
勘误
第一章 page 5

move ax number 这里笔误。
应该是 mov eax number

第二章、栈溢出 page 8

printf("%d\n",array[5]; 这句少了闭括号
应该是 printf("%d\n",array[5]);

感谢 kaien

-------------------
=================
第一章 在开始之前  
=================

第6页 第1行
int triangle (int width, in height){
应该为
int triangle (int width, int height){
吧? 原英文版好像也有错.

第6页 非空行第13行
0x8048438 <triangle+8>:    lea     oxffffffd8(%ebp), %edi

好像是把0x写成ox了, 看来代码都是手工输的, arhat真是辛苦了! 非常感谢.

==============
第二章 栈溢出
==============

2.2 栈 第一行中: "栈是一个LILO数据结构"  应该是 "栈是一个LIFO数据结构"

第10页13行:    "这时,ESP指向栈项" 应该为 "栈顶"  (老大用五笔?:))
第12页图2.3:     "Low Memory Addresses and Bottom of Stack" 应该为 "High Memory Address and Bottom of Stack"
          "High Memory Addresses and Top of Stack" 应该为 "Low Memory Addresses and Top of Stack"

根据"array是5个字节"(第13页倒数第7行), 判断第11页的 int array[5] 是否应该为 char(或u_int8_t)类型?

第16页倒数第8行:   "EBP 和 EIP" 应该为 "EBP 和 RET"
第19页倒数第11行:  char **argv[] 如果没有什么用意(gcc可以编译通过)是否改为 char *argv[](或char **argv)

第20页倒数9-12行之间少了一段代码:
if (!(buff = malloc(bsize))) {
        printf("Can't allocate memory.\n");
        exit(0);
}

第27页同样缺少一段代码:
if (!(buff = malloc(bsize))) {
        printf("Can't allocate memory.\n");
        exit(0);
}

================
第三章 Shellcode
================

第32页13行, 第35页倒数9行:  mov ax,1 实为 mov eax,1

第十章.Solaris 破解入门

第一行末尾的 "interl" 应该是 "intel"

非常感谢 icytear

----------------------------------------------------------------------

第三章 Shellcode

第30页10行:在正常情况下,每个系统调用支持6个参数,分别保存在EBX,ECX,EDX,ESI,EDI和EPB里。
英文原文是:Each syscall can have a maximum of six arguments, which are inserted into EBX, ECX, EDX, ESI, EDI, and EPB, respectively.

我查阅了80x86体系结构手册中关于寄存器的内容,所有80x86系列的寄存器里似乎并没有一个叫EPB的,所以在这里猜测,可能是把EBP误写成EPB了。

感谢kmyc的细心
2007年2月23日12时6分 更新

----------------------------------------------------------------------

第四章 格式化串漏洞

第50页第5段(这个结果虽然出乎我们的意料,……)
第2行:……,我们刚刚输入的字符串中的4个字符被当作“数字”传递给printf函数,……
英文原文是:……,so 4-byte segments from the string are being passed as the "numbers" to be substituted into the string.
按照我的理解,原文的意思应该是:我们刚刚输入的字符串每4个字符被当作1个“数字”传递给printf函数
也就是说,字符串被分成每4个字符一段,分别作为格式化参数传递给了printf函数。而译文给人的感觉是:我们刚刚输入的字符串中“只有”4个字符被当作“数字”传递给printf函数,给人产生了误解和歧义。

arhat:我看了一下,保留原来的翻译。我的理解是:我们输入的字符串中的4个字符恰好被printf当作它的参数了。

第58页16行:
得到

200-index BBA41424242

原文是:
We get:

200-index BBBA41424242
少打了一个B(从41424242可以看出来,而且原文没有少)。

arhat:是我的疏忽,抱歉

第62页第2段(注意标为粗体的那行。)
那里比较有意思,在错误的调用vsnprintf之后,程序的作者争取的调用了printf。
原文是:The interesting point is that there's a call to printf right after the vulnerable call to vsnprintf.

注意:vulnerable的意思是:易受攻击的, 易受...的攻击。在C语法上,程序的作者对vsnprintf调用符合规则,并不构成错误,但是在vsnprintf的具体实现上,使得程序的作者对vsnprintf的那种调用方式“易受攻击”。而与之相对应的,对printf的调用应该是“合适”的(不易受(格式化串漏洞)攻击)。译文中使用“错误”和“正确”似乎有些不恰当。在计算机对指令的执行过程中,正确和错误都是相对的,在计算机硬件看来,它“存储程序,顺序执行”,并没有犯错。所以我们说软件“漏洞”,而一般不说软件“错误”。

arhat:是“正确”,不是“争取”,看来kmyc用的是拼音输入法呀!:)
这里我也没有特别好的建议,请读者自己甄别。

第70页第10行
……;然后利用%n把你写入栈上参数的数据写入地址。

原文是:Then, use %n to write to the address using the parameter you wrote to the stack.

我认为,文章实际的意思说,本打算向某个地址写入数据,可是因为这个地址四个字节中某个字节为0,所以不能以$'(地址(little-endian形式))%(数据-6-4)x%(本字符串第一个字的位置(如果从该位置读取一个字,那么内容将是我们前面以little-endian形式存储的地址))$n'的形式提交字符串,否则会在刚开始四个字节的地址处被截断。所以需要先将地址写到一个参数的位置,即提交"%(地址-6-4)x%(存储该参数地址的位置(也许需要另一个参数,可以用开始的方法把“该参数”的地址存到这个参数里,前提是:“该参数”的地址没有NULL,汗))$n",然后提交"%(数据-6-4)x%(该参数的位置)$n"……汗……

根据这些想法,我以为,这句翻译成:“然后利用%n把你写入栈上参数的数据作为地址进行写入。”也许可以消除歧义和误解。

arhat:如果结合上下文的话,我觉得我的翻译应该不会有歧义吧。因为老外的名式比较复杂,再说我对%n的用法也不是很熟,找了些资料才明白的。
请读者自己甄别。

同样根据上面的想法,在下一句中,将原文的"Alternatively"翻译成“换句话说”似乎有些牵强,因为后面一句话说的情况相比前面分析的情况比较特殊,两者并不对等。前面的情况适用比较普遍,而后面的情况,即NULL出现在地址的最高字节,可以把地址放在提交的字符串的末尾因为地址以little-endian形式存储,所以最高字节的NULL刚好作为字符串的结尾被提交,而一般情况(前面的情况)都是把地址放在字符串的首部。这种做法只是为了方便地址寻找,相比把地址放在别的地方而把放地址的那个地址再存起来,这种情况会简单很多。但是这要求地址只有最高字节为空。所以,"Alternatively"翻译“作为另一种选择(相对比较特殊的情况)”比较好。

arhat:整本书中,不少副词的用法不好确定。同意你的意见。
你看整段话翻译成“当然,如果地址里的NULL字节碰巧是首位字节(在Windows格式化串漏洞里,这是常有的事),那么你还可以利用格式化中本身的结尾NULL字节。”,如何?

第71页倒数第6行
这个方法也可以使用哪些在处理格式化串之后,……
将“那”打成“哪”了,一般用拼音输入法比较容易犯这样的小错误,看来大哥的翻译工作真是废寝忘食,太辛苦了呀。

arhat:我用的是五笔:) ,但经常会将“哪”,“那”混为一团。抱歉。

最后谈点小意见,这章的最后一句是:that they are worth understanding.
愚以为,对基本原理的理解,应该胜过简单的掌握和熟练现成的技巧。理解了原理,加上我们充满灵感的想象力,就可以搞出无数令人称奇的新技巧。软件每时每刻都在更新,不可能有一劳永逸的现成的技巧,所以,“理解(原理,规律)”,活的理解(ing),可能比“学”“习”(现成的技巧)更重要。

arhat:赞成。理解原理可以做到触类旁通,掌握技巧只是停留在表面。深度不一样。

感谢kmyc!
2007年2月24日17时15分

----------------------------------------------------------------------

第5章 堆溢出

第72页第1段第1行
译文:本章主要介绍Linux上的堆溢出,使用的堆实现源自Doug Lee最初的malloc实现,……
原文:This chapter focuses on heap overflows on the Linux platform, which uses a malloc implementation originally written by Doug Lee,……
注:不好意思,第一行就找您的岔。原文中的which应该指代的是“堆溢出”(heap overflows),“使用的堆实现”似乎有些不合适,因为堆的实现在这里暂时还看不出和主题什么关系。也许改为:……,利用了源自Doug Lee最初的malloc实现,…… 较妥。不知arhat大哥意下如何。

第72页第2段第4行
译文:一个典型的Linux程序通常包括.bss段(为初始化的全局变量),用brk()或mmap()分配的、由malloc()使用的.data段(已初始化的全局变量)。
原文:Typically a Linux program has a .bss (global variables that are uninitialized) and a .data segment (global variables that are initialized) along with other segments used by malloc() and allocated with the brk() or mmap() system calls.
注:这个问题就比较严重了,必须要纠正,技术上是不能有这样的概念错误的:.data段当然不是用brk()或mmap()分配的、由malloc()使用的,.data段就只是用来存放已初始化的全局变量的。从原文中也可以看出“along with other segments used by……”。
愚以为,应翻译成:一个典型的Linux程序通常包括.bss段(为初始化的全局变量),.data段(已初始化的全局变量)和其他的用brk()或mmap()等系统调用分配的、由malloc()使用的一些段。总之概念上决不能有混淆,希望arhat大哥在这个基本概念的基础上对这句话做出语言上更准确地翻译。

arhat:汗!这个是我理解上的错误

第77页第1行
译文:……,并把buf2块头部的0xfffffff0改为0xffffffff。
原文:…… and changing the chunk header of buf2 to have a size of 0xfffffff0 and a previous size of 0xffffffff.
注:原文的意思是:修改buf2块的头部,使得buf2块的大小变成0xfffffff0,buf2块的前一块的大小变成0xffffffff。其实就是把buf2块头部的8个字节分别修改成0xffffffff,0xfffffff0。因为buf2块头部的8个字节分别存储的是buf2块的前一块的大小(32位)和buf2块的大小(32位)。从下面的这条命令本身也可以看出:
(gdb) run `python -c 'print
"A"*1024+"\xff\xff\xff\xff"+"\xf0\xff\xff\xff"'`

第77页第5段第3行
译文:那你应该注意,在大多数情况下,free()是infree的封装;……
原文:…… you should note that free() is really a wrapper to intfree in most cases.
注:笔误,将intfree写成了infree,少了一个n。

第78页第1,2段
译文:
  在第一条指令(mov 0x8(%esi), %edx)里,……

  在第二条指令(add %eax, %edi)里,……
原文:
  In the first instruction (mov 0x8(%esi), %edx), ……

  In the second instruction (add %eax, %edi), ……
注:arhat大哥的翻译和原文内容一致,可惜原文内容写错了。稍微阅读下这两段,就会发现,这两条指令本应该是这两段上面的那两条指令,可惜被误写为这两段下面的那五条指令的前两条,完全对不上号。
故,原文应为:
  In the first instruction (mov 0xfffffff8(%edx),%eax), ……

  In the second instruction (sub %eax,%esi), ……

译文也应相应作出修改。

第78页第4段第1行
译文:……,接着用前一个块的大小减去4改写buf2的块头部;……
原文:……, then overwrite the chunk header of buf2 with a previous size of -4. ……
注:arhat大哥理解错作者的意思了,其实作者是说用-4(补码0xfffffffc)填充buf2的块头部的前4个字节,也就是存储前一个块的大小的那32位。从下面的这条命令本身可以看出来:
(gdb) r `python -c 'print
"A"*(1024)+"\xfc\xff\xff\xff"+"\xf0\xff\xff\xff"+"AAAAABCDEFGH" '`

arhat:very good!

thx kmyc!
2007年2月25日9时13分

----------------------------------------------------------------------

第79页最后一行
译文:我们正好可以把word1和栈上的地址作为word2。
原文:We can just use that as word1 and an address on the stack as word2.
注:根据上下文,我推断,作者这里的意思是说把exit函数指针(that所指代的)的地址作为word1(其实实际应该是word1+12),而栈上的某个地址(当然是某个shellcode的首地址啦)作为word2。因为word2会写入word1+12,所以改写了本来指向exit函数的函数指针,使得对exit函数的调用变成了对栈上word2地址处的跳转。不知arhat大哥意下如何。

第六章 Windows的广阔原野

第90页第3段第1行
译文:……,在1991年首次发行了Windows 3.1。……
原文:……, with its first release in 1991 as Windows NT 3.1 .……
注:Windows 3.1和Windows NT 3.1还是不同的,其实在XP以前,Windows系列和Windows NT一直是Microsoft的两条主线,两者有不同的内核,面向不同的对象。比如Windows 3.1不是一个独立的操作系统,必须在DOS下进行加载,很像现在Linux下的XWindow。而Windows NT 3.1从一开始就立足于全新的内核,是一个独立的操作系统。
Windows NT 3.1到Windows NT 4.x到Windows NT 5.0(Windows 2000)
Windows 3.x到Windows 9x到Windows Me
最后两个系列合并成了Windows XP,后来又有了Windows 2003及现在的Windows Vista
很小的时候就在DOS上接触了Windows 3.1(在命令行下输入win加回车,呵呵),作为Windows发展历史的见证人,关于这个问题我还是有发言权的,呵呵。

arhat:是我的笔误 :)

第95页第5段第2行
译文:……和Todd Sabin的DCE-RPC(http://razor.bindview.com/)。
原文:…… and Todd Sabin's DCE-RPC tools (available from http://razor.bindview.com/).
注:DCE-RPC当然不是Todd Sabin的啦,arhat大哥这里少翻译了一个“tools”,其实应该是:“Todd Sabin的DCE-RPC工具包”。或者直接就是“Todd Sabin的DCE-RPC tools”。

第100页第4段第1行
译文:……,大部分是由未公开的,……
原文:……, and many of these are undocumented ……
注:根据上下文,我认为译文中多打了一个“由”字,本来应该是:“大部分是未公开的”。而且如果不去掉这个“由”字,则译文有些文法不通。

arhat:YES

第100页第4段第2行
译文:例如,加载LibraryA()时(把DLL载入内存),……
原文:For example, Load_LibraryA(), which loads a DLL into memory,……
注:这个API我用过,所以我有发言权,这个函数应该是LoadLibraryA(),在MSDN里面查不到这个函数的,顶多查到LoadLibrary(),其实LoadLibrary()是定义在windows.h里面的一个宏,其实大家也应该想到了,还有另一个函数,就是LoadLibraryW()。LoadLibraryA()和LoadLibraryW()的区别就在于接受dll路径及文件名作为参数时,一个把参数处理成ASC单字符,一个处理成宽字符。这些MSDN里面一点都没有提到。我之所以用到LoadLibraryA()这个函数(一般肯定就用LoadLibrary()了),是因为那时搞远程DLL注入,就是利用CreateRemoteThread()在远程进程内创建线程,线程的功能就是载入DLL,当然线程函数就要用LoadLibrary(),可是LoadLibrary()其实根本就是个宏,根本不可能在kernel32.dll中GetProcAddress(),所以必须用LoadLibraryA()或LoadLibraryW()。
不好意思说多了,其实原文也有误导,偏偏在一个完整的函数中间加一个“_”(注:要是在Windows里面真的调用Load_LibraryA(),是绝对调不成功的,而且Win32API是绝不可能在函数名里面有个“_”的),结果也误导了arhat大哥。其实文章后面很快就讲到了DLL注入类似的内容,而且也正确地书写了LoadLibraryA()(这次arhat大哥当然翻译得就没错啦)。

arhat:very good

第101页第6段第1行
译文:WSASicjet(),调用WSASicjet()而不是……
原文:WSASocket() Calling WSASocket() instead of ……
注:明显的笔误,在译文里这个函数怎么看怎么不对劲怎么又似曾相识。WSASocket()这个函数我也用过,当时看来相比socket()的优势就是可以交叠处理提高效率。

感谢kmyc!
2007年2月26日11时34分

/全部完成后,我会集中出一个完整的PDF版本。
2006-12-12 22:17
0
雪    币: 214
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
pdf没chm好
2006-12-13 11:58
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
最初由 arhat 发布
全部完成后,我会集中出一个完整的PDF版本。


以前的可以攒集成册么?
谢谢
2006-12-13 23:35
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
年末最值期待礼物之一
2006-12-14 10:06
0
雪    币: 295
活跃值: (501)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
热切期待完整PDF或CHM版,感谢arhat的无私奉献!
2006-12-19 10:09
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
感觉还是做成chm的好,pdf看这不爽
2006-12-19 21:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
可以下下来看看咯
2006-12-21 19:39
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
期待~~菜鸟一只~正在学习~
2006-12-21 21:59
0
雪    币: 232
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
只要有中文的看我就已经很满足了.
翻译的大大们辛苦了
2006-12-22 10:32
0
雪    币: 400
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
再次感谢楼主,您辛苦了!向你学习!
2006-12-24 12:56
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
期待中
2006-12-31 01:37
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fyd
13
热切期待全书全部章节的共享!
2006-12-31 17:29
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
最好最后出的时候是中英对照的版本!
2007-1-2 02:01
0
雪    币: 280
活跃值: (433)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
15
辛苦了!!!!
2007-1-2 09:53
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
16
这么多章节,实在辛苦
2007-1-2 16:54
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
再一次感谢你
2007-1-4 10:38
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
18
快半年不来了,出了这么多好东西,真谢谢楼主奉献精神.来支持下
2007-1-4 21:32
0
雪    币: 175
活跃值: (2331)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
期待中。。。
2007-1-6 11:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
最初由 arhat 发布
全部完成后,我会集中出一个完整的PDF版本。


谢谢你呀,支持你.
2007-1-9 13:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
年度最佳期待!chm格式的
2007-1-9 20:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
感谢arhat的无私奉献
2007-1-12 18:08
0
雪    币: 8690
活跃值: (3858)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
都打不开了,是不是换地方了?
2007-1-15 10:25
0
雪    币: 2108
活跃值: (208)
能力值: (RANK:1260 )
在线值:
发帖
回帖
粉丝
24
原因是“网通线路(bbs1.pediy.com:8081)由于故障暂时关闭 ”

现在已修正链接!
2007-1-15 10:28
0
雪    币: 8690
活跃值: (3858)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
谢谢!已经下了.以前本想全了再下,现在看来还先下着.哈哈.等候下文!
2007-1-15 10:44
0
游客
登录 | 注册 方可回帖
返回
//