noip2 stack buffer overflow
TRANSCRIPT
安全程式設計Noip2
Stack based buffer overflow第五組:林昱辰陳宗暉蘇才維吳尚浩閻昱萱
漏洞出處
軟體介紹: Noip
Noip 是全球最知名的動態 DNS 提供商,他們的動態更新客戶端存在於眾多的系統、軟體和嵌入式軟體中
漏洞成因:
Summary:
File Format:ELF 32 bitDynamically linkedNot Stripped
Payload = (292 - 21)*nop + shellcode + ret_address ↑ buffer 到 ret address 的 bytes 數 – shellcode bytes 數
Shellcode 21 個 bytes ↓
SCRIPT
Nop Slide
DEMO
結束
才怪
因為 shellcode 出了點意外,換了好多個都無法提權, SO…… 我們決定做個小彌補
Noip2Stack based buffer overflow BETA
利用 ret2ibc+ROP 繞過 NX
DEPData Execution Prevention可寫的地方不可執行,可執行的地方不可寫gcc: -zexecstack( 關閉 NX)
shellcode
shellcodeshellcode
shellcode
STACK
ROPReturn Oriented Programming返回導向編程執行針對性的機器語言指令序列 (=Gadget)RET 到自身含有 ret 的代碼上
Gadget名詞:小機具、小組件一段一段由 ret 組成的程式碼片段
CODE:Func(argv1, argv2)
STACK
argv2ESP→
Assembly:PUSH argv2
STACK
argv2argv1ESP→
CODE:Func(argv1, argv2)
Assembly:PUSH argv2PUSH argv1
STACK
argv1argv2
Ret addrESP→
CODE:Func(argv1, argv2)
Assembly:PUSH argv2PUSH argv1call Func
STACK
argv2argv1
Ret addrPrev ebpESP→ CODE:
Func(argv1, argv2)
Assembly:PUSH argv2PUSH argv1call Funcpush EBP
argv2argv1
Ret addrPrev ebpEBP=ESP→ CODE:
Func(argv1, argv2)
Assembly:PUSH argv2PUSH argv1call Funcpush EBPMOV EBP,ESP
STACK
argv2argv1
Ret addrPrev ebpbuffer
EBP→ CODE:Func(argv1, argv2)
Assembly:PUSH argv2PUSH argv1call Funcpush EBPMOV EBP,ESPSUB ESP,8
ESP→
Ret2Libc
執行 C 語言程式通常都會載入Libc 裡面有很多好用的 function
覆蓋返回地址為現有函數地址※ 不能 return 到 shellcode ,就 return 到現有函式上偽造堆疊,建立函數呼叫
AAAA system() ret_addr ptr“/bin/bash”
STACK
HIGH
LOW
Ret_addr
Libc Function = Libc Base Address + Function Offset ↑ ↑ 動態載入決定 固定不變 (NoASLR→ 固定 )
SCRIPT
AAAAgets_func@libc
pop_retgets_argv_addr
system@libcAAAA
gets_argv_addr
Padding
讀 /bin/bash 字串進來清空 stack + Chain
存 /bin/bash 字串在 bss segment
執行不重要隨便打system 的參數 ( 跟上面那個同地址 )
DEMO
結束
真的啦