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,反之...