论坛: 网吧专题 标题: 智能ABC的致命bug加强版 复制本贴地址    
作者: figo [figo]    论坛用户   登录
引用:
智能ABC漏洞。
方法是:
在任何程序的输入框中:
切换出智能ABC,之后依次按V,然后按箭头上↑,按DELETE,最后回车或按空格。你会发现出现程序错误!程序随后关闭


发现最近这个方法在网上流传挺广~~~


刚才在WIN2000下无聊之际摆弄了一下~~发现还有有趣的~~不知各位发现没?
方法是:
在任何程序的输入框中:
切换出智能ABC,随便输入一个字母(比如u),然后按箭头上↑,按DELETE,接着回车或按空格,然后连续两次按“BACK SPACE”键,你也会发现出现程序错误!程序随后关闭


HOHO~~~刚才98,2003下也试验通过了~~~~~
受影响版本:智能ABC版本4.0 /5.0


BTW:除v之外的字母都需要用到“BACK SPACE”键来使得程序崩溃~~~~~

本人发布于http://bbs.nsfocus.net/index.php?act=ST&f=10&t=159027


kaspersky于2004-02-26 http://kaspersky.blogdriver.com/index.jsp



地主 发表时间: 04-02-26 16:20

回复: newmyth21 [newmyth21]   论坛用户   登录
这个方法是不错,最近我上网都没给钱,爽啊,要和道偶的那点RMB可来之不易啊

B1层 发表时间: 04-02-26 21:37

回复: lhh2003 [lhh2003]   论坛用户   登录
顶,但智能abc这个漏洞对于pubwin4还是不行,pubwin4会自己重起!

B2层 发表时间: 04-02-26 22:19

回复: wrinkray [wrinkray]   论坛用户   登录
我刚才在网吧的网管程序:万象网管专家专业版v15.2.40.858 上用了。不好用

B3层 发表时间: 04-02-27 05:38

回复: fsqer [fsqer]   论坛用户   登录
顶~

B4层 发表时间: 04-02-27 10:58

回复: figo [figo]   论坛用户   登录
发信人: westervelt (天边的云), 信区: Security
标 题: 对winabc.ime中的某些未检查边界变量之调用的分析
发信站: BBS 水木清华站 (Thu Feb 26 23:57:35 2004), 转信

对winabc.ime中的某些未检查边界变量之调用的分析

winabc.ime是智能ABC中文输入法的动态链接库,就是说这个文件实际上是个DLL。由于其
中的某些函数对输入有多处未作严格检查,会导致意外的内存访问情况发生。

典型症状:
1.调出智能ABC中文输入法,依次输入v,左箭头(或上箭头,使光标左移一位),delete
,回车(或空格)则产生内存访问错误,0x7380c4bb引用0x00080000内存,该内存不能为
"written"。0x77fcb9ae引用0x00000000内存,该内存不能为"written"。
2.任意输入一字词,如“测试”,完成后输入任一字符,左,del,回车,在输入框中得
到前一字词的默认字,“册”,然后连揿两次退格。报出错误:0x7380b431指令引用
0x73825e3f内存,该内存不能为"read"。
进程非正常退出。


说明:静态分析用的IDA,下面很多函数和参数被我重命名了,大家将就着看,多包涵。
比如:
InputState = 0x738129B0
ISv = 0x7381486C
vlength = 0x73811F52
vstring = 0x73811F56
nBack = 0x73815E54


分析:
出错的7380xxxx指令应该属于winabc.ime加载的地址。在任意可输入窗口下,只要调入该
输入法,则该进程此段内存加载入winabc.ime。经跟踪,报错指令属于导出函数
ImeToAsciiEx,入口地址8533。
ImeToAsciiEx调用了0x7380A27B,该函数处理每一个输入的字符,不妨重命名为
OnKeyDown,每当有键揿下,该函数就被调用一次。在OnKeyDown中最后又调用了
0x7380AC79函数,该函数目前看来是分析输入字符并实现其功能用的,重命名为
parse_key,以下是parse_key中的一小段汇编代码:

..text:7380AC9F cmp si, 803Dh
..text:7380ACA4 jnz short loc_7380ACCC ; pt
..text:7380ACA6 cmp InputState, 3
..text:7380ACAD jz return0
..text:7380ACB3 cmp dword_738129AC, 1
..text:7380ACBA jle return0
..text:7380ACC0 mov InputState, 1
..text:7380ACC7 jmp return0

其中si是揿下的键的Hex值,InputState = ds:0x738129B0,return0 = 0x7380AE9A。
函数采用在内存数据段空间里的一些变量作标志位,标志当前输入法的状态。比如这个
InputState标志着当前输入法所处的状态:0为刚刚切换到该输入法,还没有开始输入,3
为输入中间阶段,输入结束键后InputState变为4,结果修正阶段为1,输入完成没有输入
框和候选框的状态为2。(这里关于输入阶段的理论来自该输入法的帮助winabc.hlp)。

下面是parse_key中的另一段代码:

..text:7380ADB2 push esi
..text:7380ADB3 call IscharordigitU
..text:7380ADB8 test eax, eax
..text:7380ADBA jz short loc_7380ADDC
..text:7380ADBC cmp si, 76h ; 与'v'比较
..text:7380ADC0 mov InputState, 3
..text:7380ADC7 setz al ; 不相等的话al=0
..text:7380ADCA mov ISv, al ; 是v的话进入v输入状态
..text:7380ADCF call sub_7380BFA1
..text:7380ADD4 cmp dword_738155CC, ebx
..text:7380ADDA jmp short loc_7380ADFF

刚开始看到这里判断输入是否为'v'感到很奇怪(后面还有与'U'比较的地方),后来在帮
助里才知道原来以uvi这几个字母开始的输入有其他的含义。比如v是用来不切换快速输入
英文/特殊字符的,vword将输出word,而v2则将把GB2312里的二区特殊字符列出供选择(
呵呵,经验值又涨了),我称之为v输入状态。

ISv = ds:0x7381486C,标志着是否在v输入状态下。0:不是,1:是,但其后没有其
他字母,2:是,并且后面跟有其他字母。
vlength = ds:0x73811F52,标志着在v输入状态下,输入框中的字符串长度(包括v)
vstring = ds:0x73811F56,在v输入状态下,除了v之外第二个字符所在的地址

这个IME出错主要在于两点:第一,对delete键的处理不对,导致数据段里的状态参数之
间有矛盾。第二,调用某些函数前没有对真正的参数进行必要的检查,虽然这些函数不对
外开放,但它依赖于某些状态参数之间没有矛盾。

..text:7380AC7F xor ebx, ebx ; ebx后来一直为0
.... ...

..text:7380AE06 OnState_3: ; CODE XREF:
parse_key+72 j
..text:7380AE06 movzx eax, si
..text:7380AE09 push eax
..text:7380AE0A call sub_7380B843
..text:7380AE0F sub eax, ebx
..text:7380AE11 jz short loc_7380AE39
.... ...

..text:7380AE39
..text:7380AE39 loc_7380AE39:
..text:7380AE39 cmp ISv, bl ; 如果ISv=2;
..text:7380AE3F jz short loc_7380AE63 ; 没有发生跳转,正
常情况下vlength肯定大于0
..text:7380AE41 movzx eax, vlength ; 而vlength为0
..text:7380AE48 dec eax ; FFFFFFFF :-(
..text:7380AE49 mov byte_738175CC, 2
..text:7380AE50 push eax
..text:7380AE51 push offset vstring
..text:7380AE56 call sub_7380C330 ; 这个函数将发生错

..text:7380AE5B mov ISv, bl ;
.... ...

问题就出在这里,如果用delete键消去v,vlength变量被置0,然而ISv变量没有变为0,
仍然在v输入状态下。dec eax是为了取得除了v之外的字母串的长度,结果这里变为
0xffffffff,然而这个sub_7380C330并没有检查输入的参数,到后来

..text:7380C4A1 movzx eax, [ebp+arg_8] ; eax = 0xffff
..text:7380C4A5 mov ecx, eax
..text:7380C4A7 mov edi, ebx
..text:7380C4A9 add edi, [ebx+58h]
..text:7380C4AC add esi, ebx
..text:7380C4AE mov esi, [ebp+arg_4]
..text:7380C4B1 mov edx, ecx
..text:7380C4B3 shr ecx, 2 ; ecx = 0x3fff
..text:7380C4B6 mov [ebx+54h], eax
..text:7380C4B9 add eax, ebx
..text:7380C4BB repe movsd ; 要拷贝0x3fff个int
型数据啊!结果就溢出了。

第二个问题基本类似:

..text:7380B414 OnBkSpace proc near ; CODE XREF:
parse_key+E8 p
..text:7380B414 cmp ISU, 0AAh
..text:7380B41B push esi
..text:7380B41C jz short loc_7380B44B
..text:7380B41E mov cx, nBack ; cx = 0
..text:7380B425 dec cx ; cx = 0xffff
..text:7380B427 movzx eax, cx
..text:7380B42A mov nBack, cx
..text:7380B431 movzx edx, byte_73815E40[eax] ; 73815e40 +
ffff = 73825e3f,这个地址访问被拒绝。
..text:7380B438 movzx eax, byte_73815E41[eax]
.... ...
nBack = ds:0x73815E54表示当前输入栏中有多少字/词。而InputState表示当前的输入状
态,值为1,上面这段代码只有InputState = 1时才会运行到。当用退格消去输入栏中最
后一个汉字时,nBack = 0 ,InputState应变为3,表示进入输入状态。但是当我们象例2
中那样操作时(那个“册”字本不该出来),输入第一个退格键,nBack由1变为0,但
InputState并未由1变为3,再次揿下退格键,函数又执行到这里,cx变为0xffff,就出错
了。

这个BUG会导致该IME所HOOK进程退出(NTDLL干的),但由于无法进一步控制内存拷贝的
行为,好象无法做深一步的利用,谁有好的想法欢迎希望与我联系。据称该BUG被用来杀
网吧管理软件的进程,我尝试远程登陆3389时使用,结果winlogon被kill掉,连接被断掉
:-(





--

※ 来源:・BBS 水木清华站 smth.org・[FROM: 202.120.224.*]


http://bbs.nsfocus.net/index.php?act=ST&f=3&t=159087&page=0#entry298247



B5层 发表时间: 04-02-27 14:03

回复: angelj517 [angelj517]   论坛用户   登录
这里好象不仅仅是有上网的`还有网管~~估计网管看了``要想办法了`哈哈```要不钱就都飞了```工资不就少了``

B6层 发表时间: 04-02-27 20:46

回复: nirvy [nirvy]   论坛用户   登录
PUBWIN4不行啊

B7层 发表时间: 04-02-28 12:39

回复: newmyth21 [newmyth21]   论坛用户   登录
可以的,那要看网吧的设置了。偶这里有个网吧就可以。

我冲一个私服,一个星期冲到了44级(比公服精验值10倍而已啊),可是我只花了不到10块钱啊

B8层 发表时间: 04-02-28 13:24

回复: lhh2003 [lhh2003]   论坛用户   登录
偶这里的网吧不行,但偶也管理员口令,哈哈哈!

B9层 发表时间: 04-02-28 14:07

回复: newmyth21 [newmyth21]   论坛用户   登录
我早就有了,我们这里的网吧叫奔腾世纪(btsj)+月份(02)+机号(025)


B10层 发表时间: 04-02-28 14:10

回复: yimarong [yimarong]   版主   登录
阿也输入法漏洞!

好象前年我就在这里见阿也于本版发过帖子了,没想到当时没什么反应,现在倒是火起来了!



其实是导致系统崩溃,是智能ABC的一个BUG,还有很多方式导致,不过很难利用
原因在于智能ABC实现的一个错误,当使用回退键以后,记录位置信息导致的错误,
智能ABC会记录输入框里当前光标之后的输入的字符数字,当之输入一个字母时候,输入回退时,计算不一致,的由0减1变成0XFFFFFFFF了,然后去处理后面这么多的数据,最后导致内存访问违例。
不过这要求在按下回车时系统会判断前面的数据是可显示的时候才会出现,所以有时候输入其他的字符并不能导致这个结果出来,但是还有很多种其他的方式导致。


[此贴被 嘶风(yimarong) 在 02月28日19时07分 编辑过]

B11层 发表时间: 04-02-28 18:01

回复: newmyth21 [newmyth21]   论坛用户   登录


B12层 发表时间: 04-02-29 02:20

论坛: 网吧专题

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号