• pwnable.kr之Toddler‘s Bottle 8~16题知识点记录


    第八题 mistake

    ^异或运算:相同为0不同为1,因此xor函数是将password中的1变成0,0变成1。
    这道题实际上是利用代码中存在的错误来解题。
    在这里插入图片描述
    这段代码中实际上少加了一个括号,“<”符号的优先级是大于‘=’的,因此会导致fd的值为一个<0的值,在读取文件时实际上就是从终端读取的。
    下面这个代码可以看到优先级,并不是把3赋值给a
    在这里插入图片描述
    在进行终端输入的时候由于它添加了一个sleep的休眠时间,因此在输入时可能误解为终端没有printf :input password是在休眠,但实际上这段时间是在等待用户输入后调用下面的read函数进行读取
    在这里插入图片描述

    总结

    因此这道题原本的password和用户输入的password1都是可以由用户决定的,注意后面用户输入的password1还进行了一次异或操作,这里存在很多答案,如:
    在这里插入图片描述

    shellshock

    参考链接
    感觉这个链接也可以

    目前的bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以
    “(){”开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,
    而是继续解析并执行shell命令。核心的原因在于在输入的过滤中没有严格限
    制边界,没有做合法化的参数判断,此漏洞会错误的将“{}”花括号外的命令进
    行执行。

    这个题利用了一个CVE的漏洞,利用的原理是代码注入导致的用户提权
    这个题看了好几个帖子,还是没懂它的原理到底是什么,然后还去看了该题对应的漏洞依然有点一知半解,尝试着写一下个人的理解吧,首先记录一下这道题需要用到的两个知识点:

    env指令

    对于env指令,在定义环境变量时的格式为:
    env key=value
    key表示定义的环境变量的名称,而value表示内容,在表示环境变量时有以下几种表示方式:

    env指令的使用
    $variable_name
    ${variable_name}

    ${variable_name} 语法还支持以下指定的一些标准 bash 修饰符

    {variable:-word}:表示如果设置了 variable,那么结果就是那个值;如果未设置变量,则结果将是 word
    ${variable:+word}:表示如果设置了 variable,则结果为 word,否则为空字符串
    在所有情况下, word 可以是任何字符串,包括额外的环境变量

    但如果在定义完环境变量后存在指令,env是允许定义完环境变量后直接执行该指令的,这里就存在着代码注入的问题

    bash指令
    # 用于保证命令是bash shell来执行的
    bash -c "执行命令" 
    
    • 1
    • 2

    Bash有两种执行命令的模式:批处理模式、并发模式。 要以批处理模式执行命令(即按照顺序),必须用;分隔
    1

    command1 ; command2 在这个例子中,当command1执行完毕,即执行command2要并发执行两个命令,它们必须用&分隔
    1 command1 & command2
    在这种情况下,command1在后台执行(通过&),从而立即将控制返回到shell,以执行command2 总结:

    一般命令在前台执行(fg),执行完毕后,控制返回给用户。
    在命令后面加上&,它会在后台执行(bg),并将特殊的环境变量$!设置为该任务的进程ID。这时shell可以并发执行其他命令。
    按Ctrl+z可以挂起前台运行的程序
    挂起的程序可以用fg恢复到前台,或者用bg恢复到后台
    后台程序试图写入数据到终端设备时(与写入标准输出不同)可能被阻塞。
    shell可以等待一个后台任务执行完成,只需使用wait命令,加上进程ID或者任务序号;也可以等待所有的后台任务,只需使用不加参数的wait
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    解题

    这道题看了几篇帖子,答案有好几种,但基本格式都是差不多的,个人理解是这样的:
    bash指令下在遇见(){}输入格式时bash不会直接退出,而是后执行env以后的指令,
    在这里插入图片描述在这道题中我们实际上只要只要flag就能知道答案,但是在当前我们的权限是shellshock,而flag需要的权限是shellshock_pwn,我们可以看到shellshock作为一个可执行文件,它拥有shellshock_pwn的权限,因此我们可以借助shellshock的执行来获取这个权限。
    首先我们来看一个env指令的执行过程:
    在这里插入图片描述
    id指令可以用于查看进程的id,而在执行第二条指令和第4条指令之间差一个;bash,而导致的结果是进程的id也发生了变化,这是因为
    对于env来说env x=‘() { :;}’ ./shellshock已经完整定义了环境变量,而添加bash表示在定义完变量后执行的指令,对于bash指令来说,在执行的时候它会创建一个子shell,应该就是相当于创建一个子进程,会复制父进程的env等信息,同时也会获得父进程的权限,通过以下代码也可以看出,在执行完bash指令后cat flag不会再报没有该权限的错误了。
    后面的./shellshock是指在shellshock里面调用 bash。
    在这里插入图片描述答案:

    #表示调用./shellshock后进入到bash状态
    env x='() { :;}; bash' ./shellshock
    cat flag
    #或者  bin -c后面的指令应该用引号括起
    #后面的./shellshock是指在shellshock里面调用 cat flag的。
    这儿就涉及到一个权限问题,因为shellshock组是root权限,所以才能cat flag
    env x='() { :;};bin -c "cat flag" ' ./shellshock
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    还有解答的时候遇见的几个错误:

    x: line 0: syntax error near unexpected token {:' /home/shellshock/bash: x: line 0: x () {:;}; bash -c “cat ./flag” ’
    /home/shellshock/bash: error importing function definition for `x’

    这个的原因是因为少了{}少了一个空格
    在这里插入图片描述而如果不报错却没有正常显示flag的原因则是()和{}之间少了一个空格(真的好费力):
    在这里插入图片描述

  • 相关阅读:
    后缀数组 学习笔记
    Citus 分布式 PostgreSQL 集群 - SQL Reference(查询处理)
    C++ //练习 10.2 重做上一题,但读取string序列存入list中。
    【深度学习】神经网络中 Batch 和 Epoch 之间的区别是什么?我们该如何理解?
    R语言glm函数使用频数数据构建二分类logistic回归模型,分析的输入数据为频数数据、将频数数据转化为正常样本数据(拆分、裂变为每个频数对应的样本个数)
    KMP&Z函数详解
    k8s的pod网络为什么要基于overlay网络?
    Linux——VIM编辑器(详细)
    【百度智能体】零代码创建职场高情商话术助手智能体
    植被参数光学遥感反演方法(Python)及遥感与生态模型数据同化算法技术应用
  • 原文地址:https://blog.csdn.net/weixin_42877778/article/details/125521965