BeginCTF 部分Writeup

SStuck题目做到一半思路卡壳
FFinished完成该题
1First Blood获得一血
2Second Blood获得二血
3Third Blood获得三血

目录

MISC部分

F3 | real check in |

F | Tupper |

F2 | devil's word |

F | 你知道中国文化嘛1.0 |

F | where is crazyman v1.0 |

F | where is crazyman v2.0 |

F2 | where is crazyman v3.0 |

Forensics部分

F | beginner_Forensics!!!! |

F | beginctf逆向工程入门指南 |

F | 学取证咯 - cmd |

F | 学取证咯 - 计算机的姓名? |

F | 学取证咯 - 想登录我的计算机吗? |

Crypto部分

F | 我玩青水的 |

总结


MISC部分

F3 | real check in |

题目给了一串base32,随波逐流一把梭

bbb13ba090d24748ad5f894876293c3c.png

手速比较快,抢了个三血(第一次拿血是签到,哭死!)

begin{WELCOMe_to_B3GinCTF_2024_H0Pe_YOU_wiL1_11ke_i7}


F | Tupper |

题目给的压缩包里有很多txt文件,直接打开最后一个发现有=,先把文件数据读取下来

import os
​
path = "C:/Users/Xia/Desktop/tupper/tupper" #文件夹目录
files= os.listdir(path) #得到文件夹下的所有文件名称
files.sort(key=lambda x: int(x.split('.')[0]))
txts = []
for file in files: #遍历文件夹
    position = path+'\\'+ file #构造绝对路径,"\\",其中一个'\'为转义符
    print (position)           
    with open(position, "r",encoding='utf-8') as f:    #打开文件
        data = f.read()   #读取文件
        txts.append(data)
txts = ''.join(txts)#转化为非数组类型  
print (txts)

跑完得到文件里的数据

MTQyNzgxOTM0MzI3MjgwMjYwNDkyOTg1NzQ1NzU1NTc1MzQzMjEwNjIzNDkzNTI1NDM1NjI2NTY3NjY0Njk3MDQwOTI4NzQ2ODgzNTQ2NzkzNzEyMTI0NDQzODIyOTg4MjEzNDIwOTM0NTAzOTg5MDcwOTY5NzYwMDI0NTg4MDc1OTg1MzU3MzUxNzIxMjY2NTc1MDQxMzExNzE2ODQ5MDcxNzMwODY2NTk1MDUxNDM5MjAzMDAwODU4MDg4MDk2NDcyNTY3OTAzODQzNzg1NTM3ODAyODI4OTQyMzk3NTE4OTg2MjAwNDExNDMzODMzMTcwNjQ3MjcxMzY5MDM2MzQ3NzA5MzYzOTg1MTg1NDc5MDA1MTI1NDg0MTk0ODYzNjQ5MTUzOTkyNTM5NDEyNDU5MTEyMDUyNjI0OTM1OTExNTg0OTc3MDgyMTkxMjY0NTM1ODc0NTY2MzczMDI4ODg3MDEzMDMzODIyMTA3NDg2Mjk4MDAwODE4MjE2ODQyODMxODczNjg1NDM2MDE1NTk3Nzg0MzE3MzUwMDY3OTQ3NjE1NDI0MTMwMDY2MjEyMTkyMDczMjI4MDg0NDkyMzIwNTA1Nzg4NTI0MzEzNjE2Nzg3NDUzNTU3NzY5MjExMzIzNTI0MTk5MzE5MDc4MzgyMDUwMDExODQ=

由于长度大于500随波逐流没法一把梭,猜一下应该是base64(base全试完发现也只有64可以),解码得到一大串数字

14278193432728026049298574575557534321062349352543562656766469704092874688354679371212444382298821342093450398907096976002458807598535735172126657504131171684907173086659505143920300085808809647256790384378553780282894239751898620041143383317064727136903634770936398518547900512548419486364915399253941245911205262493591158497708219126453587456637302888701303382210748629800081821684283187368543601559778431735006794761542413006621219207322808449232050578852431361678745355776921132352419931907838205001184

这时候我以为是十六进制转文件发现并不是十六进制,回去看题目发现题目上有信息,Tupper,百度搜索发现这是塔珀自指公式涉及到一个函数 f ( x , y ) ,一个参数 k,和一个图片 a。f ( x , y )对 a 中的每一个点 ( x , y )进行判断,决定该点的颜色是0还是1,因此决定了 a 的图案。这时候就知道了这是k值,我们现在需要的就是利用塔珀自指公式得到图片

import numpy as np
import matplotlib.pyplot as plt
​
def Tupper_self_referential_formula(k): 
    aa = np.zeros((17,106))
    def f(x, y):
        y += k
        a1 = 2**-(-17*x - y%17)
        a2 = (y // 17) // a1
        return 1 if a2 % 2 > 0.5 else 0
 
    for y in range(17):
        for x in range(106):
            aa[y, x] = f(x, y)
    
    return aa[:,::-1]
​
k = 14278193432728026049298574575557534321062349352543562656766469704092874688354679371212444382298821342093450398907096976002458807598535735172126657504131171684907173086659505143920300085808809647256790384378553780282894239751898620041143383317064727136903634770936398518547900512548419486364915399253941245911205262493591158497708219126453587456637302888701303382210748629800081821684283187368543601559778431735006794761542413006621219207322808449232050578852431361678745355776921132352419931907838205001184
aa = Tupper_self_referential_formula(k)
plt.figure(figsize=(15,10))
plt.imshow(aa,origin='lower')

这是网上找的脚本但是没跑出来,所以就找的一个在线网站。 (Tupper's Formula Tools (tuppers-formula.ovh)

a4a58603646c4edb96d4ca5a6b58d736.png

得到flag

begin{T4UUPER!}


F2 | devil's word |

题目描述:

leu lia leu ng leu cai leu jau leu e cai b cai jau sa leng cai ng ng f leu b leu e sa leng cai cai ng f cai cai sa sa leu e cai a leu bo leu f cai ng ng f leu sii leu jau sa sii leu c leu ng leu sa cai sii cai d

根据题目我们搜索恶魔的语言可以知道恶魔的语言指的是温州话,但是最开始并没有想到这是数字的发音就浪费了很多时间都没有找到对应的。后面看一个常用话的温州音的时候才反应过来。

lia = 2
sa  = 3
sii = 4
ng  = 5
leu = 6
cai = 7
bo  = 8
jau = 9

对照温州话数字音译来转化,这里要注意的是单个字母不用转化得到字符串

626567696e7b7930755f6b6e30775f77336e7a686f755f6469346c6563747d

放到随波逐流里试下,一眼看没有什么特别的,但是仔细看发现其中一个解码

23ee64643012474baa9c8a90f1872dbf.png

发现可能是故意少加了个b,得到flag,运气比较好拿了个二血

begin{y0u_kn0w_w3nzhou_di4lect}


F | 你知道中国文化嘛1.0 |

最开始没有看出来是什么,猜的应该有八卦或者其他的中国文化解码在里面。后面拿4KML开头的一小串去解码发现base32能解出八卦。这里要注意的是每段字符的后面一点不能一起解码,不然会发生错误

首次解码得到(手动分了下组)

1.☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☶☲☲☶☲☰☷☳☴☶☲☳☰☲☱☶☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☷☱☲☶☳☳☴☷☲☵☵☲☱☱☳☴☶☲☲☶☲☰☷☳☴☶☲☳☰☲☱☶☳☴☵☲☱☷☲☱☳☳☴☵☲☲☶☲☰☴☳☴☶☲☶☳☲☲☵☳☴☶☲☶☲☲☷☳☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☶☲☶☳☲☲☵☳☴☶☲☶☲☲☷☳☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☶☲☲☶☲☰☷☳☴☶☲☳☰☲☱☶☳☴☵☲☰☵☲☵☴☳☴
2.4KMLNYUYWLRJRNPCTC26FGF$
3.☴☳☳☴☵☲☷☱☲☶☳☳☴☷☲☵☵☲☱☱☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☷☱☲☶☳☳☴☷☲☵☵☲☱☱☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☷☲☱☰☲☶☱☳☴☵☲☳☳☲☷☵☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☷☱☲☶☳☳☴☷☲☵☵☲☱☱☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☵☰
4.4KMLFYUYWDRJRN&CTCZOFGFV
5.☲☳☴☷☲☲☴☲☶☱☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☷☲☱☰☲☶☱☳☴☵☲☳☳☲☷☵☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☵☲☵☷☲☱☴☳☴
6.4KMLLYUYWLRJRN&CTC2OFGFS
7.☷☲☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☷☲☱☰☲☶☱☳☴☵☲☳☳☲☷☵☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☶☲☶☳☲☲☵☳☴☶☲☶☲☲☷☳☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☷☱☲☶☳☳☴☷☲☵☵☲☱☱☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☵☰☲☰☷☲☵☲☳☴☷☲☲☴☲☶☱☳☴☶☲☲☶☲☰☷☳☴☶☲☳☰☲☱☶☳☵☰☲☵☷☲☳☲☳☴☴☲☷☷☲☴☱☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☶☲☲☶☲☰☷☳☴☶☲☳☰☲☱☶☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☷☱☲☶☳☳☴☷☲☵☵☲☱☱☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☶☲☲☵☲☵☴☳☴☴☲☷☰☲☳☲☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☵☰☲☰☷☲☵☲☳☴☷☲☲☴☲☶☱☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☶☲☶☳☲☲☵☳☴☶☲☶☲☲☷☳☳☴☵☲☱☷☲☱☳☳☴☵☲☲☶☲☰☴☳☴☶☲☶☳☲☲☵☳☴☶☲☶☲☲☷☳☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☶☲☲☵☲☵☴☳☴☴☲☷☰☲☳☲☳☴☶☲☶☳☲☲☵☳☴☶☲☶☲☲☷☳☳☴☵☲☱☷☲☱☳☳☴☵☲☲☶☲☰☴☳☴☵☲☷☱☲☶☳☳☴☷☲☵☵☲☱☱☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☶☲☶☰☲☲☱☳☴☴☲☷☰☲☷☳☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☶☲☶☳☲☲☵☳☴☶☲☶☲☲☷☳☳☴☶☲☲☶☲☰☷☳☴☶☲☳☰☲☱☶☳☵☰☲☵☷☲☳☲☳☴☴☲☷☷☲☴☱☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☶☲☶☰☲☲☱☳☴☴☲☷☰☲☷☳☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☷☲☱☰☲☶☱☳☴☵☲☳☳☲☷☵☳☴☶☲☲☶☲☰☷☳☴☶☲☳☰☲☱☶☳☵☰☲☵☷☲☳☲☳☴☴☲☷☷☲☴☱☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☶☲☶☰☲☲☱☳☴☴☲☷☰☲☷☳☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☶☲☲☶☲☰☷☳☴☶☲☳☰☲☱☶☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☱☷☲☱☳☳☴☵☲☲☶☲☰☴☳☴☷☲☱☰☲☶☱☳☴☵☲☳☳☲☷☵☳☴☵☲☲
8.4KMLFYUYWLRJRMPCTC@OFGFT
9.☵☰☲☶☰☲☲☰☳☴☷☲☱☰☲☶☱☳☴☵☲☳☳☲☷☵☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☶☲☶☰☲☲☱☳☴☴☲☷☰☲☷☳☳☴☵☲☰☵☲☵☴☳☴☶☲☵☵☲☴☳☳☴☵☲☲☲☲☱☴☳☵☰☲☶☰☲☲☰☳☴☵☲☰☵☲
10.4KMLLYUYWTRJRM7CTC@OFGFW
11.☳☴☶☲☵☵☲☴☳☳☴☵☲☷☱☲☶☳☳☴☷☲☵☵☲☱☱

我们看到其中有几组里面存在其他符号,通过搜索我们能发现文本中存在同样的文本,替换再进行解码

2.4KMLNYUYWLRJRNPCTC26FGFS	☶☲☵☵☲
4.4KMLFYUYWDRJRNPCTCZOFGFV	☲☰☵☲☵
6.4KMLLYUYWLRJRNPCTC2OFGFS	☵☲☵☴☲
8.4KMLFYUYWLRJRMPCTC2OFGFT	☲☲☱☴☳
10.4KMLLYUYWTRJRM7CTC2OFGFW	☵☴☳☴☶

将得到的八卦解码得到社会主义核心价值观密文

公正文明公正和谐公正平等文明友善法治和谐法治公正文明公正平等公正平等和谐爱国公正平等和谐和谐公正
☰☲☰☵☲☵☲
由和谐爱国和谐富强
和谐爱国公正公正公正和谐公正法治公正平等公正自由文明诚信和谐和谐文明公正平等公正公正和谐敬业和谐自由公正公正法治友善法治公正敬业法治友善平等公正民主和谐法治文明诚信和谐和谐民主和谐爱国文明诚信和谐和谐民主和谐文明公正友善爱国和谐爱国和谐民主公正和谐公正平等

但是在解码的过程中发现中间有六个八卦不能解码,而我们发现任意一个字对应六个八卦,所以在这里猜一下这里应该是自来对应下面的由。社会主义核心价值观解码得到字符串

bce-7bee8e3d808fcged-2ef94f}i{a7-18-12n81ce

栅栏一把梭得到flag

48a814bf0cce4c60a29bcaa3ffc079b6.png

begin{eec8da87-ee32-11ed-8f8c-907841e2ffbc}

F | where is crazyman v1.0 |

骗你的,其实我是二刺螈(寸不已!!!)三字二次元地名

begin{秋叶原}


F | where is crazyman v2.0 |

这道题心服口服,社工能力还是太差了,一开始百度搜图没有搜出来主要是因为谷歌不知道怎么进不去了。后面没办法去修谷歌修好了一搜就搜到了

6d0d03ce040f43d4af848fab2daae320.png

找到个相关视频进去看一下

2b6449c9a4b3419cb9522743df171214.png

这俩只能说一模一样,得到flag

begin{Boulevard World}

以后搜图还得谷歌


F2 | where is crazyman v3.0 |

首先从图中我们可以大致知道这是在一个星巴克,最重要的信息是瓶子上面有Boudl Apart Hotel的字样。在谷歌地图上搜索,发现有两家,但是第二家没有步行五分钟以内的星巴克

6aa23071012c45acbdfdfc5469e82a11.png

其实这里浪费了很多时间在第二个酒店上,一方面是梯子的原因死活上不去,另一方面是以为那个瓶子只有一家有,亏贼曼老师!

搜索第一个酒店附近的星巴克,有一家步行时间四分钟,是唯一符合要求的

3f09263b68c9405eaa99090f27cad8f2.png

在这家星巴克的评论区里找最新评论有一条是亏贼曼师傅一分钟前发的

YmVnaW57R29vZ2xlX21hcF9pc191c2VmdWxfYW5kX25vdF9mb3JnZXRfY29tbWVudH0=

看起来像base64,随波逐流一把梭得到flag

43eb1ac08d4d415ab9db9cf905d25dfb.png

begin{Google_map_is_useful_and_not_forget_comment}

运气比较好,拿了二血,以后得找一个好用点的梯子,edge插件的梯子质量不是很好,卡了很久


Forensics部分

F | beginner_Forensics!!!! |

当时看没有几个做出来以为很难所以放了一下,但是后面自己看的时候发现网上其实有现成的脚本,只需要改一下就可以用了

我们将未识别文件用010打开发现 &cls::BatchEncryption Build 201610 By gwsbhqt@163.com

16cef3746a0f489f946d96045b03ee85.png

网上搜一下,想看看有没有,结果还真找到了,而且这个没猜错的话应该是2023年强国杯的那道题改编过来的。然后就是找代码了,这里放一下改了之后的代码

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Batch Decryption 202009 (BatchEncryption Build 201610)
#

import os


def decryption(data):
    if not (data[0] == 0xFF and data[1] == 0xFE):
        print('Batch decryption bom error!')
        return
    if str(data[2:9], encoding="utf-8") != ' &cls\r\n':
        print('Batch decryption cls error!')
        return
    if str(data[9:60], encoding="utf-8") != '::BatchEncryption Build 201610 By gwsbhqt@163.com\r\n':
        print('Batch decryption build error!')
        return

    vars = {}

    # decryption line
    i = 60
    l = len(data)
    while i < l:
        i = run(vars, data, i)


def run(vars, data, i):
    buf = ''
    f = 0
    t = 0
    x = False
    l = len(data)
    while(True):
        if data[i] == 0x0d and data[i+1] == 0x0a:
            i += 2
            break
        # get %var:~x,y% %0
        if data[i] == 0x25:
            if not x:
                x = True
                f = i
            else:
                x = False
                t = i
                rst = var_percent(data[f:t+1], vars)
                buf += rst
        else:
            if not x:
                buf += str(data[i:i+1], encoding="utf-8")
            else:
                if (f + 1 == i) and ((data[i] >= 0x30 and data[i] <= 0x39) or data[i] == 0x2a):
                    x = False
                    t = i
                    rst = str(data[f:t+1], encoding="utf-8")
                    buf += rst
        i += 1
        if i >= l:
            break
    #
    print(buf)
    bufs = buf.split('&@')
    for var in bufs:
        if var[0:4] == 'set ':
            var = var[4:]
            b = var.find('=')
            vars[var[0:b]] = var[b+1:].replace('^^^', '^')

    return i


def var_percent(data, vars):
    full = str(data, encoding="utf-8")
    buf = full[1:len(full)-1]
    buf = buf.split(':~')
    var = buf[0]
    if not var in vars:
        vars[var] = os.getenv(var)
    ent = vars[var]
    if (len(buf) > 1):
        l = len(ent)
        buf = buf[1].split(',')
        f = int(buf[0])
        t = int(buf[1])
        if f < 0:
            f, t = l + f, t
        rst = ent[f: f+t]
    else:
        rst = full
    return rst


encrypt_file = 'C:\./Users/Xia/Desktop/2.txt'

if __name__ == '__main__':

    try:
        file = open(encrypt_file, "rb")
        data = file.read()
    except Exception as err:
        print('Batch decryption read error:', err)
        exit
    else:
        file.close()

    decryption(data)

跑出来得到一段文字

e0036454fc2142faa198e01052e8bd73.png

@echo on&@endlocal&@cls 
@echo off 
echo catf1y:your flag is already deleted by me. 
set find_me_pls = b@TcH_O8FU$c@T1on_15_e@SY_70_SO1vE 
echo crazyman:no no no no no no !!!!! i need flag. 
echo Attention:can you help crazyman to find the flag? 
echo Attention:Submit the info you are looking for on begin{*}

分析得到flag,一开始没看完以为不用套壳子后面翻译了才发现需要和壳子一起提交

begin{b@TcH_O8FU$c@T1on_15_e@SY_70_SO1vE}


F | beginctf逆向工程入门指南 |

第一次做pdf类型的题,一开始以为是在010里面找结果发现在全选的时候左上角有文字被选中,全选粘贴到文本框里得到flag,因为一开始方向错了没抢到血,可惜

39d97bf807414b41b4bd8df5858efada.png

955ed30ba8c44b35bec703b1d747ade5.png

begin{0kay_1_thiNK_YoU_Ar3_a1Re@DY_rE4D_6uiDe8ooK_AnD_9OT_FL46}

F | 学取证咯 - cmd |

题目描述:

1.你在我的电脑上干了什么?快使用volatility看一看cmd吧

根据题目描述是查看命令行操作,显示cmd历史命令

先分析操作系统

Volatility -f 1.raw imageinfo

7ca973287b044ef9b80d3c3a6a028e39.png

再使用volatility的查看命令行操作命令

volatility -f 1.raw --profile=Win7SP1x64 cmdscan

得到flag

d4bbf92233674e01b404ea9946f6319e.png

flag{Cmd_1in3_109_i5_imp0rt@nt}

F | 学取证咯 - 计算机的姓名? |

题目描述:

3.想要知道WORKGROUP的名字捏(提交时外面包上begin{}

主机名需要通过查询注册表,先用hivelist

Volatility -f  1.raw --profile=Win7SP1x64 hivelist

5bbc1f501e934460be24450af7743d29.png

剩下的操作比较繁琐,主要是一步步寻找键名

volatility -f 1.raw --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey
volatility -f 1.raw --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -k "ControlSet001"
volatility -f 1.raw --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -K "ControlSet001\Control"
volatility -f 1.raw --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -K "ControlSet001\Control\ComputerName"
volatility -f 1.raw --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -K "ControlSet001\Control\ComputerName\ComputerName"

254f770ca6994f4ba8ab75a21381e753.png

得到flag

begin{VVHATI5Y0VRNAM3}


F | 学取证咯 - 想登录我的计算机吗? |

题目描述:

4.想登录我的计算机吗?我可不会告诉你登录口令

与密码相关直接PTF一把梭,得到flag

fe82b3ce6ef141d59fdf27c33441084f.png

flag{Mimikatz_0r_j0hn}

按理来说应该是用mimikatz来获取密码 但是插件没安上就用了下轮子


Crypto部分

F | 我玩青水的 |

加密过程

from Crypto.Util.number import *
from secret import flag

m = bytes_to_long(flag)
e = 2
p = getPrime(512)
c = pow(m, e, p)

print(f"p = {p}")
print(f"c = {c}")

'''
p = 7709388356791362098686964537734555579863438117190798798028727762878684782880904322549856912344789781854618283939002621383390230228555920884200579836394161
c = 5573755468949553624452023926839820294500672937008992680281196534187840615851844091682946567434189657243627735469507175898662317628420037437385814152733456
'''

大概解释一下就是核心就是c=m**e%p,我们已知c,e,p需要去求m。因为e=2非常小是低加密指数分解攻击类型,这时候我们爆破一下

有两个脚本针对e=2和e=3的情况,在这里都列出来

import gmpy2
import libnum
c = 5573755468949553624452023926839820294500672937008992680281196534187840615851844091682946567434189657243627735469507175898662317628420037437385814152733456
m = gmpy2.isqrt(c)
m = int(m)
m_text = libnum.n2s(m)  #将十六进制转为字符
print(m_text)
import libnum
from gmpy2 import iroot

e = 0x2
n = 7709388356791362098686964537734555579863438117190798798028727762878684782880904322549856912344789781854618283939002621383390230228555920884200579836394161
c = 5573755468949553624452023926839820294500672937008992680281196534187840615851844091682946567434189657243627735469507175898662317628420037437385814152733456

k = 0
while 1:
    res = iroot(c+k*n,e)  #c+k*n 开3次方根 能开3次方即可
    #print(res)
    #res = (mpz(13040004482819713819817340524563023159919305047824600478799740488797710355579494486728991357), True)
    if(res[1] == True):
        print(libnum.n2s(int(res[0]))) #转为字符串
        break
    k=k+1

我是用第二种设置的e=2爆破出来的,前前后后大概用了十多分钟(也有可能是电脑的问题)。这道题是自己第一次自己写脚本跑出来的,在等的时候还很怕是不是写错了。

得出flag

18e302a9f69a4449bae74ca17a2f8fb9.png

begin{quadruticresidue_i5_s0_3asy}

总结

这次比赛学到了很多,感谢各位师傅们的题,这次比赛对于我这种刚接触的新人来说是一个很好的机会和平台来检测自己的学习成果,虽然有不足但是还是比较满意的,希望下一次能变得更好。同时,非常感谢我的老伙计Dreammm✌🏻,虽然是个人赛,但是仍然大公无私的提供了很好用的工具(跪谢)!

  • 20
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值