風水網(wǎng)站開發(fā)登錄注冊入口
第一步?? ?先checksec一下(沒有啟用NX保護、PIE、完整的RELRO和棧保護,還有具有RWX權(quán)限的內(nèi)存段。)
分析一下這個文件的保護機制:
- Arch: amd64-64-little
- 這表示該可執(zhí)行文件是為64位的AMD64架構(gòu)編譯的,并且使用的是小端字節(jié)序(little-endian)。
- RELRO: Partial RELRO
- RELRO(Relocation Read-Only)是一種安全特性,旨在減少攻擊者修改程序運行時的全局偏移表(GOT)的能力。有兩種RELRO設(shè)置:
- Full RELRO:將GOT置于只讀段,從而在程序啟動時就完全確定,并且在運行時不可更改。
- Partial RELRO:只將部分GOT置于只讀段,這意味著攻擊者可能仍然有能力在運行時修改GOT,盡管這比沒有任何RELRO保護要困難。
- Partial RELRO表示該程序沒有實現(xiàn)完全的RELRO保護,因此存在一定的風險。
- RELRO(Relocation Read-Only)是一種安全特性,旨在減少攻擊者修改程序運行時的全局偏移表(GOT)的能力。有兩種RELRO設(shè)置:
- Stack: No canary found
- 棧保護可以通過棧溢出保護(Stack Smashing Protector,SSP)實現(xiàn),通常使用一個稱為“canary”的隨機值來檢測棧溢出。如果攻擊者試圖通過棧溢出覆蓋返回地址,canary值會被改變,程序可以檢測到這種改變并終止。
- No canary found表示該程序沒有啟用棧保護,這使得它更容易受到棧溢出攻擊。
- NX: NX disabled
- NX(No-eXecute)是一種硬件支持的功能,它將內(nèi)存區(qū)域標記為不可執(zhí)行,從而防止了在數(shù)據(jù)段(如堆棧或堆)中執(zhí)行代碼。
- NX disabled表示該程序沒有啟用NX保護,這允許攻擊者在程序的堆?;蚨焉蠄?zhí)行代碼,增加了受到攻擊的風險。
- PIE: No PIE (0x400000)
- PIE(Position-Independent Executable)是一種安全特性,它使得程序的代碼可以在內(nèi)存中的任意位置加載,這樣每次程序運行時地址空間布局都是隨機的,增加了利用內(nèi)存損壞漏洞的難度。
- No PIE表示該程序不是位置獨立的,它總是在固定的地址(在這個例子中是0x400000)加載,這使得利用某些類型的漏洞更容易。
- RWX: Has RWX segments
- RWX表示內(nèi)存段同時具有讀(Read)、寫(Write)和執(zhí)行(eXecute)權(quán)限。通常,內(nèi)存段應(yīng)該只有讀和執(zhí)行權(quán)限,或者只有讀和寫權(quán)限,而不應(yīng)該同時具有所有三個權(quán)限。
- Has RWX segments表示該程序有內(nèi)存段同時具有讀、寫和執(zhí)行權(quán)限,這是不安全的,因為它允許攻擊者修改內(nèi)存中的代碼并執(zhí)行它。
第二步? 拖入ida,發(fā)現(xiàn)關(guān)鍵字flag,雙擊后按ctrl + x
?發(fā)現(xiàn)該語句在sub_40060D中
進入該函數(shù),該函數(shù)就是一個簡單的system()函數(shù),這個函數(shù)的作用就是輸出flag的文件信息
與之前一題相似:觸發(fā)后門函數(shù)sub_40060(),函數(shù)地址為0x40060D
第三步? 進入該數(shù)組
以下是對這兩個特殊字段 “r” 和 “s” 的解釋:
- r:代表返回地址(return address)。當一個函數(shù)被調(diào)用時,調(diào)用者的返回地址(即調(diào)用指令之后的地址)會被自動推入棧中。這個返回地址在函數(shù)執(zhí)行完畢后用于控制流返回到調(diào)用點。
- s:代表保存的寄存器(saved registers)。在函數(shù)開始執(zhí)行時,如果函數(shù)要使用某些寄存器,并且這些寄存器在調(diào)用者中之后還需要使用,那么這些寄存器的值需要在棧上保存,以便在函數(shù)返回前恢復(fù)。
解釋一下最后var部分:
- var_40 db 64 dup(?):這行代碼聲明了一個名為var_40的局部變量,它是一個字節(jié)數(shù)組,大小為64字節(jié)。db表示聲明字節(jié)(double byte),64 dup(?)表示重復(fù)64次,每次分配一個未初始化的字節(jié)(用?表示)。這個數(shù)組在棧幀中的位置相對于基指針ebp是偏移量-40的地方(如果ebp指向棧幀的底部),這通常意味著它是函數(shù)中的一個局部變量。
- s db 8 dup(?):這行代碼聲明了一個名為s的局部變量,它是一個字節(jié)數(shù)組,大小為8字節(jié)。這個數(shù)組用于保存寄存器的值,正如之前提到的Saved regs: 8,這通常用于保存兩個32位寄存器的值。
- r db 8 dup(?):這行代碼聲明了一個名為r的局部變量,它也是一個字節(jié)數(shù)組,大小為8字節(jié)。這個數(shù)組用于保存返回地址,盡管在大多數(shù)匯編語言中,返回地址是自動保存在棧上的,而不是顯式聲明一個變量來保存。這里的聲明可能是為了示例或說明目的,實際上并不常見。(就我個人理解這個8應(yīng)該不算在內(nèi),要算的的話只算前面那兩個32位寄存器的。僅為個人理解,如有錯誤,請指正。)
如此看的話填充數(shù)據(jù)大小為64+8(var_40加上兩個32位寄存器),72個。
第五步 編寫腳本
成功得到flag