ROP_bamboofox.key

Similar documents
1 CPU interrupt INT trap CPU exception

目 录

Linux kernel exploit研究和探索

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

untitled

漏 洞 攻 防 EXPLOIT ATTACK & DEFENCE 栏 目 编 辑 脚 本 小 子 scriptsboy@hacker.com.cn HEAD 部 分 大 小 当 然 也 就 是 固 定 的 18200H 如 果 要 提 取 出 HEAD, 我 们 可 以 选 中 前 18200H 字

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

Microsoft PowerPoint - XCon2010_win7_cn.ppt [兼容模式]

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

学习MSP430单片机推荐参考书

"\x33\x31\x43\x17\x83\xeb\xfc\x03\x6b\x0c\xa6\x2b\x97\xda\xaf" "\xd4\x67\x1b\xd0\x5d\x82\x2a\xc2\x3a\xc7\x1f\xd2\x49\x85\x93" "\x99\x1c\x3d\x27\xef\x8

AL-M200 Series

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

NEXT SDT2.51 C:\ARM251 SDT2.51 ARM SDT 2.51 ARM PROJECT MANAGER SDT 2

C/C++ - 文件IO

<4D F736F F D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

2 2 3 DLight CPU I/O DLight Oracle Solaris (DTrace) C/C++ Solaris DLight DTrace DLight DLight DLight C C++ Fortran CPU I/O DLight AM

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與

幻灯片 1


Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt

51 C 51 isp 10 C PCB C C C C KEIL

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

CC213

untitled

Microsoft Word - template.doc

untitled

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

CC213

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt

返回导向编程 (ROP) 译者 :Netfairty 前言 欢迎来到第七部分, 经过前面的学习, 可能你想做一些更有挑战性的事. 好的, 本节我们将 要学习的是 ROP( 返回导向编程 ). 不像前一节我们把参数精心布置在堆栈然后调用 Windwos API 去执行它们. 所有介绍 ROP 教程都需

mvc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

EK-STM32F

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E =====================

2/80 2

TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP

Oracle 4

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

Chapter 2

untitled

概述

1 CPU

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt

鋼結構在綠建築發展趨勢中之綜合評價

untitled

2013年度西藏自治区教育厅

實用文格式大全.doc

个 小 小 的 乡 下 人 木 匠 的 儿 子, 竟 然 有 这 么 大 的 力 量 其 实 就 是 这 点, 祂 活 出 来 的 那 种 爱, 是 世 界 上 没 有 的 祂 活 出 来 的 爱 是 世 界 上 的 人 都 需 要 的, 但 却 是 人 人 在 这 个 世 界 上 都 得 不 到

薛 秦 高 继 宁 宋 明 锁 文 洪 梁 瑞 敏 贾 跃 进 内 蒙 古 自 治 区 (3 人 ) 琪 格 其 图 米 子 良 赵 震 生 辽 宁 省 (8 人 ) 田 素 琴 白 凤 鸣 肖 瑞 崇 黄 恩 申 白 长 川 杨 世 勇 李 敬 林 王 秀 云 吉 林 省 (5 人 ) 赵 继 福

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

碩士論文—健康促進醫院.PDF

软件测试(TA07)第一学期考试

第五章 重叠、流水和现代处理器技术

epub83-1

Linux 操作系统分析 Chapter 9-2 Linux 中程序的执行 陈香兰 苏州研究院中国科学技术大学 Fall 2014 November 4,

instructions.PDF

浙江大学本科论文模板

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

0-Day 甘苦談 (0-Day WTF Talk) Happy Fuzzing Internet Explorer HITCON

的 開 銷, 請 務 必 先 和 家 裡 討 論 後 再 做 決 定 二 研 修 學 校 簡 介 卡 內 基 美 隆 大 學 (Carnegie Mellon University), 位 於 賓 州 匹 茲 堡 會 選 擇 來 這 裡 交 換, 我 相 信 大 部 分 的 人 都 已 經 知 道

Oracle Oracle Solaris Studio IDE makefile C C++ Fortran makefile IDE Solaris Linux C/C++/Fortran Oracle IDE "P

Fuzzy Highlight.ppt

ARM JTAG实时仿真器安装使用指南

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

linux 下的缓冲区溢出 裴士辉 QQ:

柳州化工股份有限公司

Java 1 Java String Date

Slide 1

bingdian001.com

untitled

提纲 1 2 OS Examples for 3

ebook121-20

Microsoft Word - 三峽鎮衛生所_3_-張家宸.李永繁.doc

Microsoft Word - 武漢大學交流營心得_黃莉云_.doc

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt

untitled

PowerPoint Presentation

ebook140-9

> u eip l 3 002f2aa9 90 nop 002f2aaa 90 nop >!chkimg -d -lo 1 ping // 检查文件是否被篡改? 002f2aa7-002f2aaa 4 bytes - ping!maincrtstartup [ e :f0 cc 9

第7章-并行计算.ppt

L15 MIPS Assembly

untitled

OptiROP:

幻灯片 1

2573

Flash Exploit

Cadence SPB 15.2 VOICE Cadence SPB 15.2 PC Cadence 3 (1) CD1 1of 2 (2) CD2 2of 2 (3) CD3 Concept HDL 1of 1


Untitled

第 7 章 下 一 代 网 际 协 议 IPv6 141 足 的 措 施 只 能 是 权 宜 之 计 (3) 路 由 表 膨 胀 早 期 IPv4 的 地 址 结 构 也 造 成 了 路 由 表 的 容 量 过 大 IPv4 地 址 早 期 为 网 络 号 + 主 机 号 结 构, 后 来 引 入

<4D F736F F F696E74202D DA578C657B27BA6E6ABD8BF76B5B2BA63A475B57BAABABADEB27AA8EEABD7BB50A7EFB669ABD8C4B32DBDB2A7D3B4AD2E BACDBAE65BCD2A6A15D>

Microsoft PowerPoint - CA_02 Chapter5 Part-I_Single _V2.ppt

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0

User’s Manual

untitled

Transcription:

ROP Return Oriented Programming Lays @ BambooFox

Who Am I Lays / L4ys / 累死 - l4ys.tw Reverse Engineering BambooFox / HITCON

Outline Buffer Overflow ret2libc / ret2text Return Oriented Programming Payload & More

Buffer Overflow

Buffer Overflow 覆蓋函數返回地址 覆蓋 Function Pointer 覆蓋其他變數

Buffer Overflow 覆蓋函數返回地址 ( Stack Based ) 覆蓋 Function Pointer 覆蓋其他變數

Function Call STACK F1( arg1, arg2 ); ESP > push arg2 push arg1 call F1

Function Call F1( arg1, arg2 ); ESP > STACK arg2 push arg2 push arg1 call F1

Function Call F1( arg1, arg2 ); ESP > STACK arg1 arg2 push arg2 push arg1 call F1

Function Call F1( arg1, arg2 ); push arg2 ESP > STACK ret addr arg1 arg2 push arg1 call F1

Function Call void F1( arg1, arg2 ) { char buffer[8]; } ESP > STACK ret addr arg1 arg2 push ebp mov ebp, esp sub esp, 8

Function Call void F1( arg1, arg2 ) { char buffer[8]; } push ebp ESP > STACK prev ebp ret addr arg1 arg2 mov ebp, esp sub esp, 8

Function Call void F1( arg1, arg2 ) { char buffer[8]; } push ebp EBP > STACK prev ebp ret addr arg1 arg2 mov ebp, esp sub esp, 8

Function Call void F1( arg1, arg2 ) { char buffer[8]; } push ebp mov ebp, esp sub esp, 8 ESP > EBP > STACK buffer prev ebp ret addr arg1 arg2

Function Call void F1( arg1, arg2 ) { char buffer[8]; } push ebp mov ebp, esp sub esp, 8 EBP-8 EBP-4 EBP > EBP+4 EBP+8 EBP+C STACK buffer prev ebp ret addr arg1 arg2

Buffer Overflow void F1( arg1, arg2 ) { char buffer[8]; scanf( %s, buffer ); } EBP-8 EBP-4 EBP > EBP+4 EBP+8 EBP+C STACK buffer prev ebp ret addr arg1 arg2

Buffer Overflow AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Buffer Overflow STACK EBP-8 EBP-4 EBP > EBP+4 EBP+8 EBP+C AAAA AAAA AAAA AAAA AAAA AAAA

Buffer Overflow BEFORE AFTER EBP-8 EBP-4 buffer EBP-8 EBP-4 AAAA AAAA EBP > prev ebp EBP > AAAA EBP+4 ret addr EBP+4 AAAA EBP+8 arg1 EBP+8 AAAA EBP+C arg2 EBP+C AAAA

Buffer Overflow mov esp, ebp pop ebp ret ESP > EBP > AFTER AAAA AAAA AAAA AAAA AAAA AAAA

Buffer Overflow mov esp, ebp pop ebp ESP > AFTER AAAA AAAA ret = POP EIP AAAA

Buffer Overflow mov esp, ebp pop ebp ESP > AFTER AAAA AAAA ret JMP AAAA

Buffer Overflow

Buffer Overflow Shellcode 預先寫好的攻擊代碼 in C / ASM xor %eax,%eax push %eax push $0x68732f2f push $0x6e69622f mov %esp,%ebx push %eax push %ebx mov %esp,%ecx mov $0xb,%al int $0x80 "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69" "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"

Buffer Overflow STACK 0xFFFFD710 AAAA AAAA AAAA 0xFFFFD71C 0xFFFFD720 0xFFFFD720 Shellcode

Buffer Overflow 塞滿 Buffer 覆蓋函數返回地址 跳轉 至 Shellcode 執 行 AAAAAAAAAAAA \x20\xd7\xff\xff Shellcode > >

Exploit Mitigation DEP ( Data Execution Prevention ) - 禁 止執 行位於資料區塊上的代碼 ASLR ( Address Space Layout Randomization ) - 記憶體位置隨機化 Stack Guard 函數返回前檢查 stack 結構完整

checksec.sh Check Security Options checksec.sh --file <executable-file> checksec.sh --proc <proc name> http://www.trapkit.de/tools/checksec.html

DEP Data Execution Prevention

Data Execution Prevention STACK 資料區塊上的代碼無法執 行 [X] Stack [X] Heap 硬體 支援 ( CPU NX bit ) 可以放 shellcode, 但不能 run AAAA AAAA AAAA 0xFFFFD720 Shellcode

世界上最遙遠的距離, 不是 生與死

而是 Shellcode 就在 Stack 上, 你卻無法執 行它 DEP

ret2libc / ret2text Return to existing code

ret2libc DEP [X] Stack [X] Heap [ O ] Binary [ O ] Shared Library

ret2libc Return-to-libc Buffer Overflow 後, 覆蓋返回地址為程式中現有函數地址 不能 return 到 shellcode, 那就 return 到現有的 code 上 利 用 libc.so 中的函數 偽造堆疊結構, 建 立函數呼叫 e.g. system( /bin/sh )

ret2libc STACK AAAA AAAA system() } Buffer Target Function ret address pointer to /bin/sh } Fake Frame system( /bin/sh )

ret2libc STACK system() ret ret address pointer to /bin/sh system( /bin/sh )

ret2libc STACK ret address pointer to /bin/sh system( /bin/sh )

ASLR Address Space Layout Randomization

ASLR 隨機分配記憶體位置 Stack Heap Shared library VDSO 難以預測 目標函數 / shellcode 位置

ret2text Return-to-text return 到程式 自 身 code / PLT 沒開啟 PIE ( Position-independent Executable ) 時,.text 地址固定, 不受 ASLR 影響 泄露有 用資訊, 搭配 ret2libc / ROP

ret2text

ret2libc / ret2text Return-to-libc 需要知道 目標函數地址 受 ASLR 影響, 需配合 Memory Leak / libc.so static link Return-to-text 現有 code 不 一定能滿 足需求

ROP Return-Oriented Programming

ROP Exploitation Return to Shellcode Return to Functions Return to Gadgets

ROP RET 到 自 身程式包含 RET 指令的代碼區塊上

ROP RET 到 自 身程式包含 RET 指令的代碼區塊上

ROP Buffer Overflow AAAA + \xe5\x85\x04\x08 RET = POP EIP 可控的 Stack 內容 透過 RET 再次控制 EIP STACK AAAA AAAA AAAA AAAA

一直 ret 一直 ret ROP 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret 一直 ret

Buffer Overflow to ROP Stack AAAA 0x08040AB0 Overwrite return address

Buffer Overflow to ROP Stack AAAA 0x08040AB0 0x08040CD0 0x08040EF0 Append Addresses

ROP Chain Stack 0x08040AB0 0x08040CD0 0x08040EF0 ret 0x08040AB0 xor eax, eax 0x08040AB1 ret

ROP Chain Stack 0x08040CD0 0x08040EF0 ret 0x08040CD0 inc eax 0x08040CD1 ret

ROP Chain Stack 0x08040EF0 ret 0x08040EF0 mov ecx, eax 0x08040EF2 ret

ROP Chain Stack 0x08040AB0 0x08040CD0 0x08040EF0 0x08040AB0 xor eax, eax ret 0x08040CD0 inc eax ret 0x08040EF0 mov ecx, eax ret

ROP Chain Stack 0x08040AB0 0x08040CD0 0x08040EF0 xor eax, eax inc eax mov ecx, eax MOV ECX, 1

ROP Chain Stack 0x08040AB0 0x08040CD0 0x08040EF0 xor eax, eax inc eax mov ecx, eax MOV ECX, 1

Gadgets Payload

ROP Gadgets 以 ret 結尾的指令序列 pop ebx + pop eax + ret add eax, ebx + xor eax, ecx + ret call eax / jmp eax int 0x80

Operations 讀寫 Register / Memory 資料 : pop eax + pop ecx + ret mov [eax], ecx + ret 調 用 system call: int 0x80 呼叫函數 : ret2libc + pop xxx + ret 算數 / 邏輯運算 : add eax, ecx + ret xor eax, ecx + ret and eax, ecx + ret shr + ret 修改 esp leave + ret 條件跳轉

Operations 讀寫 Register / Memory 資料 : pop eax + pop ecx + ret mov [eax], ecx + ret 調 用 system call: int 0x80 呼叫函數 : ret2libc + pop xxx + ret 算數 / 邏輯運算 : add eax, ecx + ret xor eax, ecx + ret and eax, ecx + ret 修改 esp leave + ret 條件跳轉

Write To Register 寫 入 Register pop reg + ret xchg reg, reg + ret mov reg, reg + ret

Write To Register 寫 入 eax 及 ebx pop eax pop ebx ret

Write To Register 寫 入 eax 及 ebx Stack 0x080400AB 0xAAAAAAAA 0xBBBBBBBB next gadget ret 0x080400AB pop eax 0x080400AC pop ebx 0x080400AD ret

Write To Register 寫 入 eax 及 ebx Stack 0xAAAAAAAA 0xBBBBBBBB next gadget 0x080400AB pop eax 0x080400AC pop ebx 0x080400AD ret

Write To Register 寫 入 eax 及 ebx eax = 0xAAAAAAAA Stack 0xBBBBBBBB next gadget 0x080400AB pop eax 0x080400AC pop ebx 0x080400AD ret

Write To Register 寫 入 eax 及 ebx eax = 0xAAAAAAAA Stack 0xBBBBBBBB next gadget 0x080400AB pop eax 0x080400AC pop ebx 0x080400AD ret

Write To Register 寫 入 eax 及 ebx eax = 0xAAAAAAAA ebx = 0xBBBBBBBB Stack next gadget 0x080400AB pop eax 0x080400AC pop ebx 0x080400AD ret

Write To Memory 寫 入 Memory mov [reg], reg mov [reg+xx], reg

Write To Memory 寫 入 Memory eax = 0xAAAAAAAA ecx = 0xBBBBBBBB mov [ecx], eax ret *0xBBBBBBBB = 0xAAAAAAAA

System Call System Call in ROP sys_execve( /bin/sh, NULL, NULL);

System Call sys_execve( /bin/sh, NULL, NULL) 尋找 int 0x80 指令 寫 入 /bin/sh 到記憶體 mov [reg], reg 設置 register pop reg eax = 11, ebx = & /bin/sh, ecx = 0, edx = 0

DEMO execve in ROP

ROPGadget 以 ROPGadget 尋找 Gadget ropgadget --binary./file ropgadget --binary./file --opcode ropgadget --binary./file --ropchain pip install ropgadget https://github.com/jonathansalwan/ropgadget

ROPGadget https://github.com/jonathansalwan/ropgadget

Conclusion ROP Payload Payload 撰寫難度較 高 / 重複利 用性低 Bypass ASLR / DEP 結合其他攻擊 手段 Load Shellcode ret2libc

More Sigreturn-Oriented Programming ( SROP ) 利 用 sigreturn system call 配合假造的 frame 控制 registers JOP(Jump-oriented programming) COP(Call-oriented programming) 以 call / jmp gadget 控制程式流程

Q & A

Try it Demo service & payload: http://l4ys.tw/f/rop_demo.zip Try to make your own ROP Chain nc pwn.l4ys.tw 4000