LitCTF2023 - Reverse方向 全WP

文章目录

  • [LitCTF 2023]世界上最棒的程序员
  • [LitCTF 2023]ez_XOR
  • [LitCTF 2023]enbase64
  • [LitCTF 2023]snake
  • [LitCTF 2023]程序和人有一个能跑就行了
  • [LitCTF 2023]debase64
  • [LitCTF 2023]For Aiur
  • LitCTF{Pylon_OverCharge!!_We_Must_construc7_addition4l_pylons}

[LitCTF 2023]世界上最棒的程序员

在这里插入图片描述

入门题

在这里插入图片描述


[LitCTF 2023]ez_XOR

在这里插入图片描述

在这里插入图片描述

注意Str2 还有个XOR函数,点进去

在这里插入图片描述

3 作为参数 传给XOR,乘以3 所以是异或9 而不是异或3

EXP:

enc = b'E`}J]OrQF[V8zV:hzpV}fVF[t'
flag = []
for x in enc:flag.append(chr(x^9))
print("".join(flag))# LitCTF{XOR_1s_3asy_to_OR}

[LitCTF 2023]enbase64

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

好像对base64码表做了处理,但是不管,先尝试解码再说

在这里插入图片描述

解不了,嗯再回去看。

在这里插入图片描述

有个basechange

在这里插入图片描述

下个断点,用动态调试,Local Windows debugger

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

选中后Shift+E 复制下来就好,

import base64str = 'GQTZlSqQXZ/ghxxwhju3hbuZ4wufWjujWrhYe7Rce7ju'string1 = "gJ1BRjQie/FIWhEslq7GxbnL26M4+HXUtcpmVTKaydOP38of5v90ZSwrkYzCAuND"  # 替换的表string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"print(base64.b64decode(str.translate(str.maketrans(string1, string2))))# LitCTF{B@5E64_l5_tooo0_E3sy!!!!!}

[LitCTF 2023]snake

在这里插入图片描述

pyc文件,反编译一下就好,可以使用在线网站,pyc反编译

也可以使用uncompyle6,安装就是pip install uncompyle6 ,对py版本有要求,自行查询。

在这里插入图片描述

命令如上。

反编译后发现出错,unknown magic number,说明pyc的文件头出错了。

在这里插入图片描述

用winhex看一看

在这里插入图片描述

对比一下正常的magic number

在这里插入图片描述

实际上,pyc文件的magic number是根据编译的python版本而变化的,

文末附上 magic number 的对照表。

这一题题目是37,应该是py3.7编译的,所以我们根据3.7的magic number修改

在这里插入图片描述

再次反编译,

在这里插入图片描述

找到flag部分

在这里插入图片描述

EXP:

flag = [30, 196,52, 252, 49, 220, 7, 243,3, 241, 24, 224, 40, 230,25, 251, 28, 233, 40, 237,4, 225, 4, 215, 40, 231,22, 237, 14, 251, 10, 169]
for i in range(0, len(flag), 2):flag[i], flag[i + 1] = flag[i + 1] ^ 136, flag[i] ^ 119
for i in range(len(flag)):flag[i] = chr(flag[i])
print("".join(flag))# LitCTF{python_snake_is_so_easy!}

[LitCTF 2023]程序和人有一个能跑就行了

在这里插入图片描述

在这里插入图片描述

打开来,一个litctf,一串数据,一个memcmp比较。

sub_4015A0估计是个加密函数,点进去看看

在这里插入图片描述

是个RC4加密,不了解RC4的去学习。

提取出密文,解密

EXP:

def rc4_decrypt(ciphertext, key):# 初始化 S-boxS = list(range(256))j = 0for i in range(256):j = (j + S[i] + key[i % len(key)]) % 256S[i], S[j] = S[j], S[i]# 初始化变量i = j = 0plaintext = []# 解密过程for byte in ciphertext:i = (i + 1) % 256j = (j + S[i]) % 256S[i], S[j] = S[j], S[i]k = S[(S[i] + S[j]) % 256]plaintext.append(byte ^ k)return bytes(plaintext)# 示例用法
encrypted_data = [0x8D, 0x6C, 0x85, 0x76, 0x32, 0x72, 0xB7, 0x40, 0x88, 0x7E, 0x95, 0xEE, 0xC5, 0xED, 0x2E, 0x71, 0x37, 0xF1, 0x4A,0x99, 0x35, 0x18, 0xA7, 0xB0, 0, 0x96, 0xB7]  # 替换成你的密文
encryption_key = b'litctf'  # 替换成你的密钥decrypted_data = rc4_decrypt(encrypted_data, encryption_key)
print("Decrypted Data:", decrypted_data.decode('utf-8'))# Decrypted Data: LitCTF{this_is_a_fake_flag}

[LitCTF 2023]debase64

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我这里为了方便修改了v5,用快捷键Y。

可以看到sub_401520 对 v7进行了处理,大概是放到v4里面,点进去

在这里插入图片描述

在这里插入图片描述

一个base64编码。因为base64编码每三个字节为一组,所以这里只取到0x70,共12个字节。

如果是没有改变数组大小的话,

在这里插入图片描述

需要先转换成十六进制,又因为数据在内存中是小端序存储,所以需要将十六进制前后颠倒一下,

在这里插入图片描述

import base64
str_encoded = [0x46, 0xed, 0x18, 0x96, 0x56, 0x9E, 0xd2, 0x72, 0xb2, 0xb3, 0x80, 0x70]
bytes_encoded = bytes(str_encoded)
decoded_bytes = base64.b64encode(bytes_encoded).decode('utf-8')
print(decoded_bytes)

数据取出来解一下base64.得到Ru0Yllae0nKys4Bw

  • 这里其实有点卡壳,也给我打开了点思路,一直逆向都卡死了,按照原本的思路将我们输入的明文经过base64编码得到密文,那么逆向就是用密文base64解码得到明文flag。但是这里是用 “密文” 来进行编码。导致我一直卡着。斯

Ru0Yllae0nKys4Bw有点怪,每四个字节逆序一下,

enc = b'Ru0Yllae0nKys4Bw'
# 将字节对象按四个字节一组进行切片,然后逆序
enc_reversed = b''.join(enc[i:i+4][::-1] for i in range(0, len(enc), 4))
print(enc_reversed)

得到 Y0uReallyKn0wB4s

再根据题目描述,后面有三个等号,那么 len(flag)+3 = 19。flag长度为20,故根据md5爆破

import hashlib
import string
en_flag = 'Y0uReallyKn0wB4s'
for i in string.printable:end = en_flag + i + '==='if hashlib.md5(end.encode()).hexdigest() == '5a3ebb487ad0046e52db00570339aace':print(end)exit()# Y0uReallyKn0wB4s3===
  • 做完了。其实做的过程中,我有使用 12345678900987654321的输入验证,发现经过base64编码后的数据和自己编码后的截然不同,说明题目的base64编码是经过魔改的,但为何 可以通过 密文 用普通的base64编码得到部分的明文数据?感觉有点费解,还是我钻了牛角尖,不过也算是为我打开了点思路,有时候,不要想太多,不要想太死,思维打开点。呼–>

[LitCTF 2023]For Aiur

在这里插入图片描述

pyinstaller编译的,可以使用pyinstxtractor反编译出文件

具体使用自行查阅。

在这里插入图片描述

在这里插入图片描述

找到主要的pyc文件,先拖入winhex中和struct对比一下,看一看magic number有没有缺失。

这一题中是完好的。

在线网站反编译一下。

在这里插入图片描述

下面都是对于游戏操作的一些设定,看from处有个check,可以,接下来去找ch

在这里插入图片描述

找到后反编译ch.pyc

在这里插入图片描述

解一下就可以了。

EXP:

enc = [
98, 77, 94, 91, 92, 107, 125, 66, 87, 70, 113, 92, 83, 70, 85, 81, 19, 21, 109, 99, 87, 107, 127, 65, 65, 64, 109,
87, 93, 90, 65, 64, 64, 65, 81, 3, 109, 85, 86, 80, 91, 64, 91, 91, 92, 0, 94, 107, 66, 77, 94, 91, 92, 71]
lis = []
num = 0while True:flag = 'LitCTF{'if num % 2 == 0 and num % 4 == 0 and num % 6 == 0 and num % 8 == 0 and num % 12 == 0 and num % 13 == 11:k = str(num)for i in range(len(enc)):flag += chr(ord(k[(i % len(k))]) ^ enc[i])lis.append(ord(k[(i % len(k))]) ^ enc[i])flag += '}'print(flag)breaknum += 1# LitCTF{Pylon_OverCharge!!_We_Must_construc7_addition4l_pylons}
k = str(num)for i in range(len(enc)):flag += chr(ord(k[(i % len(k))]) ^ enc[i])lis.append(ord(k[(i % len(k))]) ^ enc[i])flag += '}'print(flag)break
num += 1

LitCTF{Pylon_OverCharge!!_We_Must_construc7_addition4l_pylons}

``enum PycMagic {    MAGIC_1_0 = 0x00999902,    MAGIC_1_1 = 0x00999903, /* Also covers 1.2 */    MAGIC_1_3 = 0x0A0D2E89,    MAGIC_1_4 = 0x0A0D1704,    MAGIC_1_5 = 0x0A0D4E99,    MAGIC_1_6 = 0x0A0DC4FC,     MAGIC_2_0 = 0x0A0DC687,    MAGIC_2_1 = 0x0A0DEB2A,    MAGIC_2_2 = 0x0A0DED2D,    MAGIC_2_3 = 0x0A0DF23B,    MAGIC_2_4 = 0x0A0DF26D,    MAGIC_2_5 = 0x0A0DF2B3,    MAGIC_2_6 = 0x0A0DF2D1,    MAGIC_2_7 = 0x0A0DF303,     MAGIC_3_0 = 0x0A0D0C3A,    MAGIC_3_1 = 0x0A0D0C4E,    MAGIC_3_2 = 0x0A0D0C6C,    MAGIC_3_3 = 0x0A0D0C9E,    MAGIC_3_4 = 0x0A0D0CEE,    MAGIC_3_5 = 0x0A0D0D16,    MAGIC_3_5_3 = 0x0A0D0D17,    MAGIC_3_6 = 0x0A0D0D33,    MAGIC_3_7 = 0x0A0D0D42,    MAGIC_3_8 = 0x0A0D0D55,    MAGIC_3_9 = 0x0A0D0D61, };``

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

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

相关文章

torch.nn.functional.log_softmax 函数解析

该函数将输出向量转化为概率分布,作用和softmax一致。 相比softmax,对较小的概率分布处理能力更好。 一、定义 softmax 计算公式: log_softmax 计算公式: 可见仅仅是将 softmax 最外层套上 log 函数。 二、使用场景 log_soft…

跟李沐学AI-深度学习课程00-03【预告、课程安排、深度学习介绍、安装】

目录 00 预告 01 课程安排 02 深度学习介绍 03 安装 本地安装 04 数据操作数据预处理 数据操作 数据类型 创建数组 访问元素 数据操作实现 入门 运算符 广播机制 索引和切片 节省内存 转换为其他Python对象 数据预处理实现 读取数据集 处理缺失值 转换为张…

POSIX信号量

POSIX信号量 POSIX信号量用于同步操作,达到无冲突访问临界资源的目的,可以用于线程之间的通信。而信号量的本质其实就是一把计数器!!而我们对计数器有2个操作,一个是增加计数器的值,一个是减少计数器的值。…

Flink(七)【输出算子(Sink)】

前言 今天是我写博客的第 200 篇,恍惚间两年过去了,现在已经是大三的学长了。仍然记得两年前第一次写博客的时候,当时学的应该是 Java 语言,菜的一批,写了就删,怕被人看到丢脸。当时就想着自己一年之后&…

代码随想录算法训练营第五十五天|392. 判断子序列、115. 不同的子序列

第九章 动态规划 part15 392. 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace&q…

使用 Filebeat+Easysearch+Console 打造日志管理平台

近年来,日志管理平台越来越流行。使用日志管理平台可以实时地、统一地、方便地管理和查看日志,挖掘日志数据价值,驱动运维、运营,提升服务管理效率。 方案架构 Beats 是轻量级采集器,包括 Filebeat、Metricbeat 等。E…

Nginx安装配置与SSL证书安装部署

一、Nginx Nginx是一款高性能的开源Web服务器和反向代理服务器,被广泛用于构建现代化的Web应用和提供静态内容。 nginx官网 这里下载nginx-1.24.0-zip Nginx是一款高性能的开源Web服务器和反向代理服务器,被广泛用于构建现代化的Web应用和提供静态内…

“可信区块链运行监测服务平台TBM发展研讨会”将于11月23日在北京召开

为推动区块链治理与创新,积极推进信任科技生态体系建设,中国信息通信研究院、中国移动设计院联合区块链服务网络(BSN)发展联盟共同发起建立了可信区块链运行监测服务平台(TBM)。 TBM平台通过对区块链系统的…

​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​

软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】 课本里章节里所有蓝色字体的思维导图

C语言基本算法----冒泡排序

原理 冒泡排序就是对一个存放N个数据的数组进行N次扫描,每次把最小或者最大的那个元素放到数组的最后,达到排序的目的。 原理图解 冒泡排序过程分析 冒泡排序的执行过程 冒泡排序总结 在此感谢 冒泡排序法_哔哩哔哩_bilibili 这篇blog是对这位up此视…

管理类联考——逻辑——知识+记忆篇——综合推理——考点+记忆

文章目录 整体目录大纲法汇总分类法记忆宫殿法绘图记忆法 考点记忆/考点汇总——按大纲 局部数字编码法归类记忆法重点记忆法歌决记忆法谐音记忆法理解记忆法比较记忆法 本篇思路:根据各方的资料,比如名师的资料,按大纲或者其他方式&#xff…

Consistency Models 阅读笔记

Diffusion models需要多步迭代采样才能生成一张图片,这导致生成速度很慢。Consistency models的提出是为了加速生成过程。 Consistency models可以直接一步采样就生成图片,但是也允许进行多步采样来提高生成的质量。 Consistency models可以从预训练的扩…