回复 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) | | ) | | COPY |
以下为进入 debug 后的键入的命令及输出: | -d2cl2 | | 1EEC:0020 51 07COPY |
可知变量表的数据段地址为 0751 | -s751:0 lffff ",=aaa" | | 0751:0028COPY |
得知 !,! 变量在变量表中始于 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.txtCOPY |
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 COPY |
用 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 COPY |
果然有关联,但怎么有个 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 ...!............COPY |
得出的结果实在让我费解,为何这里也多了个 00 0d...
反复试验了一下,和我昨日的猜测不一样,似乎即使变量长度达不到 8190 也能看到同样的内存数据,那究竟是何处发生数据溢出的呢?
昨天没有想周全,所以当时的猜测不正确,看来仍然是个谜(对我来说) |