【正文】
如圖為我已經(jīng)公布的序的 buffer構(gòu)造。 特定程序 A設(shè)置一個環(huán)境變量后通過 exec相關(guān)函數(shù)使用特定命令行參數(shù)執(zhí)行其他程序 B時 , B程序空間內(nèi)部的該環(huán)境變量存放的位置可以非常精確的取得 。 漏洞所在 漏洞所在 $ ct abc ct: bad phone number abc 對比打印的消息和用 dumpmsg對 /usr/lib/nls/C/ 可以發(fā)現(xiàn)該消息對應(yīng)號碼為 set_num = msg_num=1128。 格式化字符串問題 格式化字符串問題所有系統(tǒng)通用,更多的利用信息可以參考 warning3等的相關(guān)文章。buff[i++]=39。 如果有程序員使用第一種方法定義 p后又往 p拷貝數(shù)據(jù)就有問題了。 棧溢出 棧溢出 棧溢出在上一章已經(jīng)詳細(xì)講解了,這里就不多說了,值得注意的是 HP上棧溢出需要至少兩層調(diào)用 : caller callee 為一層 callee要滿足非葉子節(jié)點(diǎn)還需要調(diào)用其他函數(shù)。 目前對堆空間分配還沒有研究多少,并不知道堆溢出是否可以利用。 ? 跳轉(zhuǎn)回到 caller。 void caller() { char buff[32]。 以后對參數(shù)的引用在通過父函數(shù)的參數(shù)存放區(qū)來讀取。 strcpy(buff,用戶輸入的數(shù)據(jù) )。 } 2. 葉子函數(shù)指內(nèi)部不會再調(diào)用其他函數(shù)的函數(shù),如: int add(int x,int y) { return x+y。 運(yùn)行時體系結(jié)構(gòu)主要包括以下幾個方面: ? 空間布局 ? 函數(shù)調(diào)用 ? 系統(tǒng)調(diào)用 程序空間布局 共 享 庫 信 息程 序 代 碼只 讀 數(shù) 據(jù) 區(qū)已 初 始 化 數(shù) 據(jù) 區(qū)函 數(shù) 導(dǎo) 入 表 P L T數(shù) 據(jù) 導(dǎo) 入 表 D L TG L O B A L未 初 始 化 數(shù) 據(jù) 區(qū)堆棧共 享 庫系 統(tǒng) 代 碼共 享 內(nèi) 存 區(qū)S R 4S R 5S R 7程 序 運(yùn) 行 過 程 中 的 內(nèi) 存 分 部 和 重 要 寄 存 器 值系 統(tǒng) 空 間代 碼 空 間數(shù) 據(jù) 空 間系 統(tǒng) 空 間D PS P0 x 0 0 0 0 0 0 00 x 4 0 0 0 0 0 0 00 x 8 0 0 0 0 0 0 00 x F F F F F F F F3.1 程序空間布局 當(dāng)程序運(yùn)行起來時其空間布局如下,系統(tǒng)初始化了數(shù)據(jù)指針寄存器DP和空間寄存器 SRSR SR7,及狀態(tài)寄存器 PSW。 STW,m %r3, 0xC0(%sr0,%sp) 將 %r3存入棧中,同時將棧指針 %sp加 0xC0(注意那個 m),函數(shù)基本都在開始處使用這條指令來給自己分配??臻g。常用的有: LDB 從內(nèi)存加載一字節(jié)數(shù)據(jù)到寄存器。 額外轉(zhuǎn)移 : ?ADDB 加法運(yùn)算,并在運(yùn)算完成后跳轉(zhuǎn)到目標(biāo)地址。 ?B, L target, t 跳轉(zhuǎn)到目標(biāo)地址,并且將返回地址放入寄存器 r。 空間寄存器共 8個,通常我們不會跟他們打交道,系統(tǒng)相關(guān)的有如下 4個: ?SR0 調(diào)用共享庫函數(shù)時存放返回?cái)?shù)據(jù)空間。 GR2 RP 返回地址指針。 目前最常見的 其自帶的系統(tǒng)命令及系統(tǒng)庫都是針對 芯片編譯的我們以下都是以該版本為例進(jìn)行講解,一些 。 ? HPUX Kernel有 32/64位之分, 64位系統(tǒng)版本號前有一個標(biāo)識符‘ B’ ,現(xiàn)在使用最多的系統(tǒng)版本為 。 ? IA64上運(yùn)行的系統(tǒng)版本為 、 。 HPUX簡況 二 . PA芯片簡介 二、 PA芯片簡介 PA芯片的各個版本都是向下兼容的。我們主要關(guān)系的是通用寄存器。 GR28 RET0 函數(shù)返回值 1 GR29 RET1 函數(shù)返回值 也作為靜態(tài)鏈接寄存器。 空間寄存器與控制寄存器 分支指令 分支跳轉(zhuǎn)指令 無條件局部轉(zhuǎn)移 : B、 BLR、 BV。常見用法: ?BE wd (sr,r) 跳轉(zhuǎn)到 sr指定的空間,地址為寄存器 r加上 wd。 ?MOVB 搬運(yùn)數(shù)據(jù)后跳轉(zhuǎn),對應(yīng)還有 MOVIB。 還有 ADD、 ADDI、 COPY、 XOR等相關(guān)指令或偽指令。 ? 然后跳轉(zhuǎn)到 sub_test處執(zhí)行。 ? 對其數(shù)據(jù)起始就是無用數(shù)據(jù)區(qū),由于??臻g大小以 64字節(jié)對齊,就有可能有些地址是不會被使用的。 } 對照函數(shù)棧分布圖我們可以看到 sprintf后 sprintf會首先將返回地址寄存器 %RP存放到 caller的棧幀標(biāo)識區(qū),然后開始往 caller的局部變量區(qū)寫數(shù)據(jù),最后從 caller的棧幀標(biāo)識 區(qū)讀出返回地址然后再跳轉(zhuǎn)到該地址運(yùn)行。}棧 幀 標(biāo) 識 區(qū)c a l l e r 的 棧 頂?shù)?地 址高 地 址棧 增 長方 向進(jìn) 入 c a l l e e 后 的 棧 分 布 情 況c a l l e e 的 棧 頂棧 幀 標(biāo) 識 區(qū)參 數(shù) 存 放 區(qū)局 部 變 量 區(qū)對 齊 數(shù) 據(jù)寄 存 器 保 存 區(qū)參 數(shù) 存 放 區(qū)S P局 部 變 量 區(qū). . . . . .c a l l e r 的 棧 區(qū) 間c a l l e e 的 棧 區(qū) 間這兒主要介紹函數(shù)的參數(shù)傳遞和棧幀標(biāo)識區(qū) . . . . . .A R G 4A R G 3A R G 2A R G 1A R G 0擴(kuò) 展 D a t a / L T P o i n t e r擴(kuò) 展 S R 4 / L P P o i n t e r擴(kuò) 展 R P當(dāng) 前 R PS t a t i c L i n kC l e a n U PR e l o c a t i o n S t u b R PP r e v i o u s S PS t a c k P o i n t e r參 數(shù) 存 放 區(qū)棧 幀 標(biāo) 識 區(qū)低 地 址高 地 址S P 8S P 2 0S P 2 4S P 3 6 函數(shù)參數(shù) 函數(shù)棧的參數(shù) . . . . . .A R G 4A R G 3A R G 2A R G 1A R G 0擴(kuò) 展 D a t a / L T P o i n t e r擴(kuò) 展 S R 4 / L P P o i n t e r擴(kuò) 展 R P當(dāng) 前 R PS t a t i c L i n kC l e a n U PR e l o c a t i o n S t u b R PP r e v i o u s S PS t a c k P o i n t e r參 數(shù) 存 放 區(qū)棧 幀 標(biāo) 識 區(qū)低 地 址高 地 址S P 8S P 2 0S P 2 4S P 3 61. 調(diào)用函數(shù)時如果參數(shù)小于或等于 4個則通過 寄存器傳遞,如果大于 4個就需要用調(diào)用函數(shù)的棧來傳遞了。 ?SP24 : 當(dāng)調(diào)用動態(tài)連接庫時使用該地址來存放返回地址。 ? 將返回地址寫入 SP24處。