JapsPer指標未定義漏洞分析

2021-12-29 20:45:52 字數 3851 閱讀 5226

japsper指標未定義漏洞分析

001: 簡介

japsper專案是乙個開源專案,它提供了一種基於jpeg-2000部分標準。這個專案最初是由image power和英屬哥倫比亞大學合作完成的。目前,正在進行的japsper軟體的維護和開發的主要作者michael adams進行協調,他是維多利亞大學電子和計算機工程部門的數字訊號處理組(dspg)的成員。影響的版本是2.0.12.

002: 分析

觸發異常資訊:

初步分析是由於函式jpc_dec.c函式中jpc_dequantize造成的core dumped

main() 到出錯之間的呼叫關係1:

暫存器的資訊1:

main() 到出錯之間的呼叫關係2:

暫存器的資訊2:

暫存器的資訊3:

jp2_boxinfo_t *jp2_boxinfolookup(int type)遍歷格式:格式

jasper的輸入jasper ./crash_in2/id_000062,sig_11,src_000901,op_ext_ao,pos_66-t jp2

其中紅色的是產生crash的檔案,-t代表轉換成的影象格式jpg

001: jasper.c

jasper.c函式241行

if (!(image = jas_image_decode(in, cmdopts->infmt,cmdopts->inopts)))

infmt是固定值4(而4 代表了jp2格式);

而inopts來自怎麼得到這個函式的來自引數解析函式,其值為0

in代表輸入檔案,它是由函式jas_stream_fopen()得來的;

jas_image.c 424 lines jas_image_decode(輸入檔案,fmt格式,引數選項)

jas_image_lookupfmtbyid(fmt),看fmt是否存在通過檢視他的id。

對輸入檔案in進行解碼 (*fmtinfo->ops.decode)(in,optstr)這個函式在哪定義的 ?

指標函式指向了jp2_dec.c 的97 lines,

dec = jp2_dec_create()

jp2_box_get(in)在jp2_cod.c 243 lines

box結構,將輸入檔案轉換為box結構

typedef struct data;

} jp2_box_t

error:

if (box)

if (dec)

return 0;

}void jp2_box_destroy(jp2_box_t *box) //jp2_cod.c 209lines

jas_free(box);

}static void jp2_cdef_destroy(jp2_box_t *box)

}解析jp2格式出錯,定義box的結構一共21 ,其中兩個決定了jp2格式的簽名和型別,因此通過迴圈19次得到剩餘19 個 box的資料,再獲取jp2_box_cdef這個box 的時候出錯, jp2_dec.c 這個函式是獲得輸入檔案,而jp2_cod.c這個函式是對每個box 進行建立和銷毀。函式在呼叫 jas_free(cdef->ents) 的時候出錯,而cdef->ents是在函式 *jp2_box_get(jas_stream_t*in) 呼叫

(*box->ops->getdata)(box, tmpstream)即呼叫jp2_cdef_getdata(jp2_box_t*box, jas_stream_t *in)函式的時候進行分配:

static int jp2_cdef_getdata(jp2_box_t *box,jas_stream_t *in)

if(!(cdef->ents = jas_alloc2(cdef->numchans, sizeof(jp2_cdefchan_t))))

printf("memhas \n");

for(channo = 0; channo numchans; ++channo)

}return 0;

}呼叫上述**紅色部分,而此函式內容:

static int jp2_getuint16(jas_stream_t *in,uint_fast16_t *val)

v = c;

if ((c = jas_stream_getc(in)) == eof)

v = (v8) | c;

if (val)

return 0;

}而函式jas_stream_getc(in)在stream.h中用巨集定義的,而具體的巨集內容是

#define jas_stream_getc(stream)jas_stream_getc_macro(stream)使用後者替換函式,而函式jas_stream_getc_macro(stream)也是乙個巨集定義,其內容如下:

#define jas_stream_getc_macro(stream) \

((!((stream)->flags_& (jas_stream_err | jas_stream_eof | \

jas_stream_rwlimit))) ? \

(((stream)->rwlimit_ >= 0 && (stream)->rwcnt_ >=(stream)->rwlimit_) ? \

(stream->flags_ |= jas_stream_rwlimit, eof) : \

jas_stream_getc2(stream)): eof)

flags_:0;執行黃色部分,而rwlimit_ : -1,rwcnt_:1;由於 1>-1 執行黃色中的紅色部分,執行完成或後賦值,然後flags_的值為00004,然後繼續執行函式: jp2_getuint16(jas_stream_t*in, uint_fast16_t *val) 中的綠色語句,此時flags_的值為00004 ,在函式中直接執行?表示式的最後乙個選項即 eof ,然後返回。

destroy在getdata指標函式中是怎麼賦值到乙個數的?

datalen == 1位元組

jp2_boxinfolookup()輪詢box->type

copy函式是怎麼工作?

jas_stream_copy()函式:

有三個引數指標out,指標in型別都是jas_stream_t , 整型n

int all 值取決於n 此處all=0;

003:總結

這個漏洞是指標未初始化造成的,我們採用工具afl挖掘出來的乙個漏洞,但是當我們分析完成後,正準備提交給cve的時候的發現,已經被別人申報了。因此,打算將我們的分析報告傳送出來,請大家指正。此分析對應的漏洞cve是cve-2017-6850。

js報未定義 JS的未定義和undefined

background if window else console.log server side rendering 當我啟專案的時候,不斷的報錯 window is not defined 原因在js中,有一種錯誤是 referenceerror x is not defined 造成這種錯誤出...

名字尚未定義

條件編譯預處理指令允許您指定在什麼條件下會或不會編譯。唯一的條件編譯指令我們將在本節蓋 如果定義了,則和endif 如果定義了預處理指令允許的預處理器檢查值是否已預先 定義。如果是這樣,如果定義了相應的編譯 endif之間的 如果不是的話,被忽略。考慮下面的 片段 123 4567 89 defin...

未定義的索引 php中 php的未定義索引如何解決

通常出現未定義的索引問題是由於陣列沒有這個值造成的,陣列分為關聯陣列和索引陣列,索引陣列是數字下標 關聯陣列是鍵值下標。解決辦法 判斷陣列中是否包含下標鍵值為id的值,如果沒有,則返回錯誤資訊,如何判斷呢,最簡單的方法就是用函式isset來判斷,如isset post id 存在則返回true,反之...