20145325张梓靖 《网络对抗技术》 PC平台逆向破解

20145325张梓靖 《网络对抗技术》 PC平台逆向破解

  

学习任务

  • shellcode注入:shellcode实际是一段代码,但却做为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode 的地址。
  • Return-to-libc 攻击实验:即便栈有不可执行的能力,没法将shellcode放入堆栈中运行,但咱们却能够直接让漏洞程序调转到现存的代码来实现咱们的攻击。(本次实验所用的是已经载入内存的 libc 库中的 system()函数等)
      
      

基础知识

  • ps -ef | grep pwn1:
      ps:将某个进程显示出来
      ps:将某个进程显示出来
      ps参数:-A  显示全部程序;-e  此参数的效果和指定"A"参数相同;-f  显示UID,PPIP,C与STIME栏位
      ps显示进程结果格式:UID PID PPID C STIME TTY TIME CMD
         UID 程序被该 UID 所拥有
         PID 就是这个程序的 ID
         PPID 则是其上级父程序的ID
         C CPU 使用的资源百分比
         STIME 系统启动时间
         TTY 登入者的终端机位置
         TIME 使用掉的 CPU 时间。
         CMD 所下达的指令为什么
      本条命令意为:查找与pwn1有关的进程,并用-ef格式显示出来
  • (gdb) attach: GDB能够对正在执行的程序进行调度,它容许开发人员中断程序并查看其状态,以后还能让这个程序正常地继续执行。在GDB中使用“attach”命令是一个方法。
  • (gdb) disassemble foo: 反汇编一段内存地址,
  • (gdb) c: 继续执行被调试程序,直至下一个断点或程序结束,Continue的简写
  • (gdb) x/16x : 使用x命令(examine的简写)来查看内存地址中的值。
    * x命令的语法:x/ (n、f、u是可选的参数)
    * n表示单元个数,f表示显示的进制,u表示每一个单元的大小。
    linux

  • ln -s 源文件 目标文件 :为某一个文件或目录在另一个位置创建一个同步的连接
  • chmod u+s 文件 :对文件设置强制位,即SET-UID,能够使非文件拥有者或文件所属群组的用户具备执行该文件的权限
  • export [-fnp][变量名称]=[变量设置值] : 设置或显示环境变量。(好比咱们要常常使用到一个命令时,而这个命令的执行文件又不在当前目录,这时能够在代码中先执行export,即告诉程序,要执行什么东西时,须要的文件就在这些目录里)
  • echo : 在显示器上显示一段文字
  • gdb -q : -q用以使得gdb不输出gdb程序的版本等信息
  • system :是一个函数,用于运行其它外部程序
      
      git

注入Shellcode并执行

  • 先将环境设置为:堆栈可执行、地址随机化关闭
    shell

  • 以 anything+retaddr+nops+shellcode 的结构来构造,先估计返回地址所在位置,而且找到 shellcode 所在地址
    sass

  • 要验证返回地址所在位置以及找到 shellcode 地址,须要使用GDB调试
    * 先运行 20145325pwn1 可执行文件
    bash

  (先不输入“回车”,在后面的调试过程当中须要继续运行的时候再回车,到时候就会显示如图的字符部分)服务器

* 再找到正在执行的 20145325pwn1 的进程号

*  进入GDB,联系上该进程号

*  在 ret 处设置断点,接着运行到断点处,显示当前esp的值并依照此位置显示接下来的内存地址内容,并由此分析出返回地址位置的正确性以及shellcode的地址

  (红色方框为返回地址处,红色椭圆为 shellcode 代码,由此推算出 shellcode 地址为 “\x31\xd3\xff\xff”)网络

*  继续运行,再次检测是否跳到覆盖的返回地址所表示的地方

  (如红框所示,已经能够确认返回地址是被 \x10\x20\x30\x40 所覆盖的)ide

  • 将做为输入的 input_shellcode 处的 “\x10\x20\x30\x40” 换为上面所找到的 shellcode 地址 “\x31\xd3\xff\xff”
    函数

  • 执行 20145325pwn1 ,成功注入 shellcode
    学习

  
  

Return-to-libc 攻击实验

  • 进入linux32的环境,将地址随机化关闭,同时使用ln命令,让 /bin/sh 指向另外一个shell程序(这里是zsh)(由于原 /bin/bash 有保护措施,即便能调用一个shell,也不能在这个shell中保持root权限)

  • 编写retlib文件并进行编译(注意要使堆栈处于不可执行状态),同时将其设为 Set-UID 程序

  • 编写读取环境变量的程序并进行编译

  • 编写攻击代码

  • 使用编译好的 读取环境变量 程序,获得/bin/sh的地址

  • 编译攻击程序,并经过调试该程序获得 system 与 exit 的地址

  • 再将攻击程序中的buf换为刚刚得到的3个地址

  • 从新编译攻击程序

  • 先运行攻击程序,再运行SET-UID程序,观察是否成功得到root权限

 成功

  • 尝试将/bin/sh 从新指向/bin/bash,观察可否攻击成功

 居然成功了

  • 又尝试将/bin/sh 从新指向 /bin/dash ,观察可否攻击成功

 又成功了?

  • 按理来讲,后2种从新指向后,应该是没法得到root权限的,但这里居然都成功了,难道实验楼环境里的 /bin/dash 与 /bin/bash尚未保护措施?

  

参考连接

逆向及Bof基础实践说明
Return-to-libc 攻击实验

相关文章
相关标签/搜索