回复 18# qzwqzw
变量名确实写错了,copy 测试文本时漏改一个。
xp 没有出现问题吗?win7 和 vista 下测试过,变量 !,! 确实能存放 8190 个字符长度的变量,而普通非分隔符 变量名则只能存放 8189 个,debug 部分见附文:
for /r 有问题是 10 楼说的呀...是否 for /f 之误?
附:
昨日的猜测有误,再次尝试 debug,全程如下:- @echo off
- setlocal enabledelayedexpansion
- for /l %%a in (0 1 8192) do (
- set,=a!,!||(echo !,!&echo 长度为 %%a 个字符&debug&exit)
- )
- rem 将原测试代码改为达到上限时执行 debug,以便手动观察内存内容
复制代码 以下为进入 debug 后的键入的命令及输出:复制代码 可知变量表的数据段地址为 0751- -s751:0 lffff ",=aaa"
- 0751:0028
复制代码 得知 !,! 变量在变量表中始于 0028 偏移地址复制代码 得知相对于 0028 偏移 1fff(即十进制 8191)的地址为 2027- -d751:20
- 0751:0020 41 4E 44 2E 43 4F 4D 00-2C 3D 61 61 61 61 61 61 AND.COM.,=aaaaaa
- 0751:0030 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 0751:0040 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 0751:0050 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 0751:0060 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 0751:0070 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 0751:0080 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 0751:0090 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- -d751:2020
- 0751:2020 61 61 61 61 61 61 61 61-42 4C 41 53 54 45 52 3D aaaaaaaaBLASTER=
- 0751:2030 41 32 32 30 20 49 35 20-44 31 20 50 33 33 30 20 A220 I5 D1 P330
- 0751:2040 54 33 00 00 01 00 43 3A-5C 57 49 4E 44 4F 57 53 T3....C:\WINDOWS
- 0751:2050 5C 53 59 53 54 45 4D 33-32 5C 44 45 42 55 47 2E \SYSTEM32\DEBUG.
- 0751:2060 45 58 45 00 51 8C 56 1E-E8 2C 00 72 17 8B F7 E8 EXE.Q.V..,.r....
- 0751:2070 4D 00 00 5F 07 80 3C 00-75 01 4E E8 70 01 2B CE M.._..<.u.N.p.+.
- 0751:2080 06 1F F3 A4 1F 5E C3 BE-4C 8C EB 03 BE 51 8C E8 .....^..L....Q..
- 0751:2090 05 00 72 F2 E9 9C 00 FC-E8 41 00 8E 06 1A 96 26 ..r......A.....&
复制代码 观察变量 !,! 头尾内容,发现末尾处的 00 丢失了,并且其后紧随着一串陌生的变量变量内容,于是在批处理中写入如下代码在内存中搜索,结果存于 s.txt- (
- (
- for %%a in (0 1 2 3 4 5 6 7 8 9 a b c d e f) do @echo s %%a000:0 lffff "BLASTER=A220 I5 D1 P330"
- )
- echo q
- )|debug>s.txt
复制代码 s.txt 的内容:- -s 0000:0 lffff "BLASTER=A220 I5 D1 P330"
- 0000:0C7D
- 0000:4522
- 0000:53F7
- 0000:59B7
- 0000:5A92
- 0000:5BA2
- 0000:A568
- 0000:B1D7
- 0000:B562
- -s 1000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s 2000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s 3000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s 4000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s 5000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s 6000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s 7000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s 8000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s 9000:0 lffff "BLASTER=A220 I5 D1 P330"
- 9000:5F02
- 9000:FFA6
- -s a000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s b000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s c000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s d000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s e000:0 lffff "BLASTER=A220 I5 D1 P330"
- -s f000:0 lffff "BLASTER=A220 I5 D1 P330"
- -q
复制代码 用 d 逐个查看,找到可疑的地址为 9000:5F02- -d9000:5F02
- 9000:5F00 42 4C 41 53 54 45-52 3D 41 32 32 30 20 49 BLASTER=A220 I
- 9000:5F10 35 20 44 31 20 50 33 33-30 20 54 33 0D 74 2E 65 5 D1 P330 T3.t.e
- 9000:5F20 78 65 0D 61 61 61 61 61-61 61 61 61 61 61 61 61 xe.aaaaaaaaaaaaa
- 9000:5F30 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5F40 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5F50 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5F60 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5F70 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5F80 B4 0E
复制代码 果然有关联,但怎么有个 0d 呢?而且 BLASTER=A220 等内容既然是正序排列,为何位于 !,! 内容之前?
用 d9000:5e00 l140 继续观察前后内容(之前没发现,原来刚才那段段数据前面还有内容,汗,那就不是堆栈的原因了),发现这里似乎和变量表的内容不同- -d9000:5e70 l120
- 9000:5E70 8C 16 30 00 2E 8E 16 57-22 BC A2 07 E8 80 31 8A ..0....W".....1.
- 9000:5E80 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5E90 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5EA0 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5EB0 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5EC0 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5ED0 61 61 61 61 61 61 61 61-61 61 61 61 00 20 20 20 aaaaaaaaaaaa.
- 9000:5EE0 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20 .....
- 9000:5EF0 20 20 20 20 20 20 20 20-00 00 00 00 61 61 61 61 ....aaaa
- 9000:5F00 00 0D 42 4C 41 53 54 45-52 3D 41 32 32 30 20 49 ..BLASTER=A220 I
- 9000:5F10 35 20 44 31 20 50 33 33-30 20 54 33 0D 74 2E 65 5 D1 P330 T3.t.e
- 9000:5F20 78 65 0D 61 61 61 61 61-61 61 61 61 61 61 61 61 xe.aaaaaaaaaaaaa
- 9000:5F30 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5F40 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5F50 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5F60 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5F70 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
- 9000:5F80 B4 0E CD 21 2E 8E 1E 1A-96 B8 FF FF 87 06 B4 02 ...!............
复制代码 得出的结果实在让我费解,为何这里也多了个 00 0d...
反复试验了一下,和我昨日的猜测不一样,似乎即使变量长度达不到 8190 也能看到同样的内存数据,那究竟是何处发生数据溢出的呢?
昨天没有想周全,所以当时的猜测不正确,看来仍然是个谜(对我来说) |