noip2 stack buffer overflow
Embed Size (px)
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

結束

真的啦