LitCTF2023 - Reverse方向 全WP

news2025/1/20 1:49:07

文章目录

  • [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 base64

str = '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-box
    S = list(range(256))
    j = 0
    for i in range(256):
        j = (j + S[i] + key[i % len(key)]) % 256
        S[i], S[j] = S[j], S[i]

    # 初始化变量
    i = j = 0
    plaintext = []

    # 解密过程
    for byte in ciphertext:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[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 = 0

while 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)
        break
    num += 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.coloradmin.cn/o/1224541.html

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

相关文章

C语言从入门到精通之【其他运算符】

sizeof运算符和size_t sizeof运算符以字节为单位返回运算对象的大小。 例如 :sizeof(int) 打印转换说明,使用C99新增的**%zd转换说明 – 如果编译器不支持%zd,请将其改 成%u或%lu**。 C 语言规定,sizeof 返回 size_t 类型的值…

Systemverilog中Clocking blocks

1. clocking block的作用 Clocking block可以将timing和synchronization detail从testbench的structural、functional和procedural elements中分离出来,因此sample timming和clocking block信号的驱动会隐含相对于clocking block的clock了,这就使得对一些…

详谈动态规划问题并解最大子数组和

今天刷力扣又学会了一种算法----动态规划,经过我查阅不少资料后,这些我总结的分享给大家 动态规划是什么? 动态规划(Dynamic Programming)是一种求解最优化问题的数学方法,它通常用于解决具有重叠子问题和…

django理解02 前后端分离中的问题

前后端分离相对于传统方式的问题 前后端数据交换的问题跨域问题 页面js往自身程序(django服务)发送请求,这是浏览器默认接受响应 而请求其它地方是浏览器认为存在潜在危险。自动隔离请求!!! 跨域问题的解决…

链表题(4)

本章内容 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 今天继续给大家带来链表的相关练习题。 相交链表 这道题来自力扣网,链接…

提升工作效率,打造精细思维——OmniOutliner 5 Pro for Mac

在当今快节奏的工作环境中,如何高效地组织和管理我们的思维和任务成为了关键。而OmniOutliner 5 Pro for Mac正是为此而生的一款强大工具。无论你是专业写作者、项目经理还是学生,OmniOutliner 5 Pro for Mac都能帮助你提升工作效率,打造精细…

【Linux】20、进程状态:不可中断进程、iowait、僵尸进程、dstat strace pstree

文章目录 一、进程状态1.1 iowait 分析1.2 僵尸进程1.3 小结 短时应用的运行时间比较短,很难在 top 或者 ps 这类展示系统概要和进程快照的工具中发现,你需要使用记录事件的工具来配合诊断,比如 execsnoop 或者 perf top。 讲到 CPU 使用率的…

HTTPS流量抓包分析中出现无法加载key

HTTPS流量抓包分析(TLSv1.2),这篇文章分析的比较透彻,就不班门弄斧了 https://zhuanlan.zhihu.com/p/635420027 写个小问题:RSA密钥对话框加载rsa key文件的时候注意不要在中文目录下,否则会提示:“Enter the passwor…

赛宁网安分靶场全力支持第三届“鹏城杯”攻防演练

为加速推进我国网络安全战略与数字化进程接轨,创新信息系统安全防护与网络安全技术研究模式,促进各行业网络安全建设的融合与协作,由鹏城实验室和中国网络空间安全人才教育论坛联合牵头举办的第三届“鹏城杯”联邦网络靶场协同攻防演练正式启…

特征缩放和转换以及自定义Transformers(Machine Learning 研习之九)

特征缩放和转换 您需要应用于数据的最重要的转换之一是功能扩展。除了少数例外,机器学习算法在输入数值属性具有非常不同的尺度时表现不佳。住房数据就是这种情况:房间总数约为6至39320间,而收入中位数仅为0至15间。如果没有任何缩放,大多数…

【总结】I/O接口中的数据线,地址线,控制线,状态线传输什么信息?

数据线 方向:双向功能:在内存、寄存器和数据缓冲寄存器进行数据交换;接口和设备的状态信息也通过数据线传给CPU(这里的状态指的是设备独有的,和状态线中的忙碌、空闲相区别);CPU对外设的控制命…

第一次组会汇报(2023/11/18)

目录 一,浅谈学习规划 二, 两个比较典型的注意力机制 ㈠SEnet ⒈结构图 ⒉机制流程讲解 ⒊源码(pytorch框架实现)及逐行解释 ⒋测试结果 ㈡CBAM ⒈结构图 ⒉机制流程讲解 ⒊源码(pytorch框架实现)…

【数据分享】2023年我国省市县三级的专精特新“小巨人”企业数量(Excel/Shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平!比如一个城市的金融企业较多,那这个城市的金融产业肯定比较发达;一个城市的制造业企业较多,那这个城市的制造业肯定比较发达。 之前我们给大家分享了…

『 MySQL数据库 』数据库之表的约束

文章目录 前言 💻空属性约束(非空约束) 🔖default约束(默认值约束,缺省) 🔖列描述comment 🔖数字类型长度zerofill 🔖主键primary key 🔖📍 追加主键 📍📍 删除主键 &…

鞋业生产制造用什么ERP软件?能为企业带来哪些好处

鞋服这类商品的种类众多,同时也是我们生活当中较为常见的产品,各个制鞋企业有差异化的营销渠道和经营模式,日常生产过程存在的问题呈现多样化。 有些制鞋企业依然采用传统的管理方式,在这种模式之下,企业并不能随时掌…

97.qt qml-自定义Table之实现ctrl与shift多选

我们之前实现了:93.qt qml-自定义Table优化(新增:水平拖拽/缩放自适应/选择使能/自定义委托)-CSDN博客 实现选择使能的时候,我们只能一行行去点击选中,非常麻烦,所以本章我们实现ctrl多选与shift多选、 所以在Table控件新增两个属性: 1.实现介绍 ctrl多选实现原理:当我…

Linux命令之查看文件和权限修改操作

目录 查看文件 1. cat --- 将文件中的内容打印在输出设备 2. more --- 分页显示文件内容 3.less ---查看文件内容 4. head -- 查看文件前n行内容 5.tail -- 查看指定文件的后n行内容或实时监测文件 6. wc -- 可计算文件的字节数、字数和列数 文件搜索 1.which --- 获取…

Selenium——利用input标签上传文件

Selenium利用input标签上传文件 完整流程 打开文件上传页面选择要上传的文件点击上传按钮确认文件上传成功介绍怎么方便的获取对应元素的Xpath或者Css 简单介绍 在使用Selenium进行浏览器自动化测试时,文件上传是一个常见的需求。而 标签就是实现文件上传功能的…

Leetcode—206.反转链表【简单】

2023每日刷题(三十三) Leetcode—206.反转链表 头插法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* reverseList(struct ListNode* head) {if(head NULL…

MySQL 的执行原理(一)

5.1 单表访问之索引合并 我们前边说过 MySQL 在一般情况下执行一个查询时最多只会用到单个二级 索引,但存在有特殊情况,在这些特殊情况下也可能在一个查询中使用到多个二 级索引,MySQL 中这种使用到多个索引来完成一次查询的执行方法称之为&…