本文主要是介绍2022年第三届指挥官杯练习赛题目和writeup,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
0x00、复习一下大端模式和小端模式
0x01、红04-隐写【篡改文件头部】
0x02、明文通信【telent】
0x03、kun1【图片隐写】
0x04、jiehe(未完待续)
0x05、findme【条码】
0x06、giveme【密码、一表人才、二表反行】
0x07、rsa15【rsa基本算法】
0x08、通行证【密码学、栅栏密码加密】
0x09、zips【zip文件格式、压缩、解压缩】
0x0A、kaisa.exe【逆向、密码学】
0x0B、re1【逆向】
0x0C、rsa41【rsa共模攻击】
0x0D、next
2022年第三届指挥官杯练习赛题目在这里https://download.csdn.net/download/qpeity/86726879
0x00、复习一下大端模式和小端模式
举一个例子,比如数字0x12 34 56 78在内存中的表示形式。
大端模式:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。(其实大端模式才是我们直观上认为的模式,和字符串存储的模式差类似)
低地址 --------------------> 高地址
0x12 | 0x34 | 0x56 | 0x78小端模式:Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
低地址 --------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
举个例子,在linux上(小端模式)编译hello.c,执行得到 Hello,w0rld!。
#include "stdio.h"
#include "string.h"int main(int argc, char *argv[]) {//char s[] = {0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x77, 0x30, 0x72, 0x6C, 0x64, 0x21};char s1[20] = {0x48, 0x65, 0x6C, 0x6C}; // Helllong long a[2] = {0x21646C7230772C6FLL, 0}; // !dlr0w,ochar *s2 = (char *)a;char *s3;s3 = strcat(s1, s2);printf("%s\n", s3); // Hello,w0rld!return 0;
}
0x01、红04-隐写【篡改文件头部】
题目是一个名为 隐写.rar 的压缩包,解压缩得到一个 pdf 文件。用010Editor打开,发现 pdf 最后有一部分unknown padding,观察数据头部尾部猜测可能是一个 gif 图片。binwalk提取一下这个 gif 图片。
binwalk -D=gif r04.pdf
打开 gif 发现有报错,于是用010Editor打开这个gif文件,也报错。观察发现文件头部后面还有IHDR,猜想这应该是一个png图片的头部被篡改成gif的头部导致的。
- gif格式文件以 0x47 49 46 38 39 61(GIF89a)开头,以0x3B结束。
- png格式文件以 0x89 50 4E 47 0D 0A 1A 0A(‰PNG....)开头,头部还有IHDR,以 0x00 00 00 00 49 45 4E 44 AE 42 60 82(....IEND®B`‚)结束。
于是修改gif文件头部,改为png文件头部,另存为png文件。再次打开,发现图片是一段命令行截图,最后是cat file,猜测图片高度被篡改了。用01Editor打开,发现CRC32报错。于是利用脚本进行CRC32爆破,得到正确的图像height,flag也显示出来了。
0x02、明文通信【telent】
题目是一个名为 明文通信.rar 的压缩包,解压是一个 1.pcapng 的抓包。明文通信,首先想到 telnet协议。用wireshark打开这个抓包,过滤一下发现确实是telnet协议明文输入了flag。
telnet.data != '' && ip.src_host == 192.168.1.3
提取telnet.data数据,要求telnet.data不为空且源IP为192.168.1.3
tshark -r 1.pcapng -T fields -e telnet.data -Y "telnet.data != '' && ip.src_host == 192.168.1.3" > 1.txt
打开提取结果1.txt得到 flag{telnet_ctf}
0x03、kun1【图片隐写】
题目内容是shu.png 和 laohu.jpg 两张图片。CTF原则之一就是不要相信给你的任何一张图片。
先用010Editor打开shu.png,发现报出了CRC32校验和错误,说明height或者width被篡改过,利用脚本进行CRC32爆破,得到正确的图像height,发现shu.png下方有一串字符。
再用010Editor打开laohu.jpg,发现图片最后有一部分unknown padding,观察数据头部尾部确定是一个zip压缩包。放进kali里面,使用 binwalk 提取出 laohu.zip。利用之前得到的wangshen66作为解压缩密码,解压这个文件,得到hidden_binary文件。
binwalk -D=zip laohu.jpg
用010Editor打开hidden_binary,发现是一个ELF文件,放进kali里面,赋予700权限,执行一下,回显得到flag。
0x04、jiehe(未完待续)
题目内容是8.jpg 和 11.jpg 两张图片。CTF原则之一就是不要相信给你的任何一张图片。
先说11.jpg,用010Editor打开,发现图片最后有一部分unknown padding,观察数据头部尾部确定是一个zip压缩包。放进kali里面,使用 binwalk 提取出11.zip。再用john爆破解压缩密码074312。解压后得到beisi.txt。
观察beisi.txt内容 WlVkc2RXTXlhR3hpWnowOQ==,用3次base64解码一下得到 xinshen
1 isBase64 True WlVkc2RXTXlhR3hpWnowOQ==
2 isBase64 True ZUdsdWMyaGxiZz09
3 isBase64 True eGluc2hlbg==
4 解码结果: xinshen
8.jpg使用F5工具,密码是123456,得到一个文件。
0x05、findme【条码】
题目内容是 xxx文件.zip 和 海绵宝宝.png 两个文件。
虽然 xxx文件.zip 没什么卵用,但是还是说一下。john爆破得到解压缩密码628600,解压缩得到一个名为“看这里”的word,打开之后居然他妈的是这玩意!!!
根据以上提示,我们看看 海绵宝宝.png 图片下面有啥吧。
下面被涂抹的是一个条形码(bar code) ,看来要恢复这个条形码扫码得到flag。于是有2个工具可以用。
PhotoShop,选取没有被涂抹的条码部分,然后按住Ctrl+T拉伸一下,从左到右逐个拉伸得到完整的条码。最终使用工具bcTester解码得到 flag{CePo_sanYa_@JiaYou}
GIMP,选取没有被涂抹的条码部分,然后按住Ctrl+S拉伸一下。注意和PS的使用区别。
0x06、giveme【密码、一表人才、二表反行】
题目描述是:运动会当天小小生病了来不了现场,她给运动员小力发了一段加密的短信,但是不知道是什么。小红看了看这短信说了句:一表人才,二表反行,小力挠了挠头,你能帮小力破解吗?flag格式为flag{xxx}。
题目文件是一个 giveme.zip 压缩文件,解压缩得到 提示.docx 和 附件.txt 短信。内容如下
ACEIBDFHADFGBCEHBCFGBDFHBCEGACEHBCEGADFGACEHACFHBCFGBDEGADEHADEI
一表人才,根据表格把短信密文4个字母一组,翻译翻译得到如下内容:
DXFLOXKAKFATOSBC
二表反行,这个提示不太明显,查了资料才知道啥意思。
- 把提示的字母排列成original_list,反向排序得到reversed_list
- 把上面的密文每个字母在original_list中找到位置,对应在reversed_list里面找到这个位置的字母
- 如此得到明文 WANGCAIXINXUCEPO, flag就是flag{WANGCAIXINXUCEPO}
ciphertext = 'DXFLOXKAKFATOSBC'original_list = ['M','R','K','S','A','B','L','U','D','C','N','V','H','F','O','W','T','G','P','X','E','I','Q','Y']
reversed_list = original_list[::-1]flag = ''
for char in ciphertext:for olist in original_list:if char == olist:oindex = original_list.index(olist)flag += reversed_list[oindex]print(flag)
0x07、rsa15【rsa基本算法】
题目直接给出了rsa算法的几个参数,然后求明文就是flag了。
p = 127346657296966281106854437915566302489035503867209365225464769149364916377649221715644868274969994830021907816536487697037927326669343680817626394628059416307748180509310043959788901776350444278302482572396137760355783028754164111470736033566039120671153208213406728174032320506182380397712402112249416727049
q = 129977522448127985502705135499093758554580803715308992038245139386359526040024981890138010442056823626833608528616652270823127997752903965259510395345535370421708668844593013515811795302231375948724888614600926562868789102880383644712522614357869135221109093902359980800725961683056681691225107119917162111601
e = 498
c = 3191077469066624394578722760655452830413317443932682147378077493651775225542567292121865824956615312277999864765565827995547623582566288394295434817283964215640835363991958352773714052513924940770391587810823272280972154385354186450034042838269763305748144425049076693725170392807170301916734625545526849972706682913921819954213685592148917132794978837982154582529934249549309184927971219477563709516944754956476078539105318141913368813639297354242808182291604352435520129250525943217095451583607906042318148800977086383632916208828781189020367474557726793718384861576249133264239511866972761006093635745864791467673
先回忆一下rsa算法的全过程:
- 任意选取两个不同的大素数p和q,n=pq,φ(n)=(p-1)(q-1)
- 任意选取一个大整数e,满足gcd(e, φ(n))=1 ;注意 e 的选取是很容易的,例如,所有大于p和q的素数都可用。(e, n)作为加密秘钥。
- 确定d,满足(de) mod φ(n)=1,也就是de = kφ(n) + 1,k≥1的正整数即可;注意已知e和φ(n)选取d是很容易的。(d, n) 作为解密秘钥。
- 公开(e, n),保存 (d, n)
- 明文m的加密过程 m^e mod n 得到密文c
- 密文c的解密过程 c^d mod n 得到明文m
过程就是这样,但是题目中的e 和 φ(n) 并不是互素的,也就是不满足gcd(e, φ(n))=1 。咋办呢?知乎上有个写的挺好的帖子,直接看结果Better2021 CTF Writeup(1): BabyEasyRSA - 知乎
注意,这里核心的地方在于最后这段解释,只不过这题把gcd(e, φ(n))=2变成了gcd(e, φ(n))=6
我们写个脚本,把步骤逐个打印出来,得到flag{b85cefed-43a9-40be-aeda-5bba3058ef5b}
import gmpy2
from Crypto.Util.number import long_to_bytesp = 127346657296966281106854437915566302489035503867209365225464769149364916377649221715644868274969994830021907816536487697037927326669343680817626394628059416307748180509310043959788901776350444278302482572396137760355783028754164111470736033566039120671153208213406728174032320506182380397712402112249416727049
q = 129977522448127985502705135499093758554580803715308992038245139386359526040024981890138010442056823626833608528616652270823127997752903965259510395345535370421708668844593013515811795302231375948724888614600926562868789102880383644712522614357869135221109093902359980800725961683056681691225107119917162111601
e = 498
c = 3191077469066624394578722760655452830413317443932682147378077493651775225542567292121865824956615312277999864765565827995547623582566288394295434817283964215640835363991958352773714052513924940770391587810823272280972154385354186450034042838269763305748144425049076693725170392807170301916734625545526849972706682913921819954213685592148917132794978837982154582529934249549309184927971219477563709516944754956476078539105318141913368813639297354242808182291604352435520129250525943217095451583607906042318148800977086383632916208828781189020367474557726793718384861576249133264239511866972761006093635745864791467673phi = (p - 1) * (q - 1)cf = gmpy2.gcd(e, phi)
print(cf)d = gmpy2.invert(e//cf, phi)
d = int(d)
n = p * q
m6 = pow(c, d, n)
print(m6)m = gmpy2.iroot(m6, cf)
print(m)m = int(m[0])
print(m)m = long_to_bytes(m)
print(m)m = str(m, 'utf-8')
print(m)
0x08、通行证【密码学、栅栏密码加密】
题目是个压缩包,解压是个txt文件,内容是第一行,用base64解码得到第二行。
c3thdWZhZHR1bmZ1eW51dnZmaHVkeHJ2bmFhYnZufWFiaHRudA==s{aufadtunfuynuvvfhudxrvnaabvn}abhtnt
这里用栅栏密码加密,栏数是7。W形状的排列是加密过程。得到最后一行字符串,这就符合flag{xxx}的格式了。
s{aufadtunfuynuvvfhudxrvnaabvn}abhtnts y n t{ u n v a na f u r a tu n v x b hf u v d v ba t f u n ad h }synt{unvanafuratunvxbhfuvdvbatfunadh}
栅栏加密的python脚本如下
def encode(m_str, n_fence):c_str = ''f_text = [[] for i in range(n_fence)]flag = Truefor i, c in enumerate(m_str):if i > 0 and i % (n_fence - 1) == 0:flag = not flagif flag:f_text[i%(n_fence-1)].append(c)else:f_text[(n_fence-1)-i%(n_fence-1)].append(c)for line in f_text:c_str += ''.join(line)return c_strdef decode(c_str, n_fence):passdef main():m_str = 's{aufadtunfuynuvvfhudxrvnaabvn}abhtnt'print(encode(m_str, 7))if __name__ == '__main__':main()
最后是对 synt{unvanafuratunvxbhfuvdvbatfunadh} 凯撒解密,解密得到flag。
flag{hainanshenghaikoushiqiongshanqu}
0x09、zips【zip文件格式、压缩、解压缩】
题目是zips.zip压缩包。
zips.zip是加密的,用john爆破,得到密码628600,解压缩得到333.zip。
333.zip文件里面有 flag.zip 和 setup.sh 两个文件。
- 用winrar直接从333.zip提取出flag.zip,flag.zip本身是加密的。
- 从333.zip提取setup.sh是加密的。
但是,这是个障眼法,参考这篇文章zip文件加密的几种破解方法_Dropall的博客-CSDN博客_zip解密,就可以知道这个333.zip是被篡改了的,用010Editor打开这个333.zip找到setup.sh文件的全局方式标记位 0x09 00,改为0x00 00,另存为333-1.zip。解压缩333-1.zip就不需要秘密了。
得到 flag.zip 和 setup.sh,发现flag.zip是加密的,加密方式在setup.sh里面。这密码好复杂,居然是用时间戳做密码。
#!/bin/bash
#
zip -e --password=`python -c "print(__import__('time').time())"` flag.zip flag
所以这个密码应该是加密时候的时间戳,也就是flag.zip的生成的时间戳。可以考虑用ARCHPR或者john爆破。
ARCHPR爆破,用掩码方式,时间戳指定的范围选择大一些,大概5分钟能爆破出结果。
也可以使用john爆破。首先用crunch生成一个字典w.txt。然后用john指定字典爆破。使用john --show 来查看爆破结果。
crunch 13 13 -t 1543%%%%%%.%% > w.txt
zip2john flag.zip > flag.hash
john flag.hash --wordlist=w.txt
john --show flag.hash
最终得到flag
0x0A、kaisa.exe【逆向、密码学】
题目是一个压缩包,里面有个kaisa.exe,看起来是凯撒密码有关的逆向题目。先用IDA64打开,找到main函数,然后F5大法反编译一下。
阅读main函数发现是输入一个字符串,长度38个字符,然后经过了encode_one、encode_two、encode_three三重加密以后得到了密文Str2。再逐个阅读三个加密函数。
encode_one 做的是base64编码,alphabet就是A-Za-z0-9/+的标准base64编码表,注意几个cmove_bits,做的就是3个字符一组共24位,然后每6位进行base64转码的操作。这样38个字符就变成了52个字符。
encode_two做的是把52个字符每13个分成一组,把这4组字符串的位置换一下。原来位置2的换到位置0上,原来位置0的换到位置1上,原来位置3的换到位置2上,原来位置1的换到位置3上。
encode_three是位移为3的凯撒密码加密,注意数字也进行了凯撒密码加密,符号保持不变。
于是,反向做3次解密得到 flag{cepohainanc478a38e9h3g4ds6f45432}
0x0B、re1【逆向】
题目是一个名为re1的ELF文件。直接执行会得到禁止访问的提示。反编译看看吧。
使用ida(不是ida64) 打开,F5大法反编译一下。main里面有非常清晰的流程,看来执行re1的时候要有一个参数,这个参数满足了sub_8048414函数,就允许访问了,再经过sub_8048538函数的处理应该可以显示出flag。
分析sub_8048414函数,入参是执行命令的,另一个入参a2=0。结果是一个switch分支,基本每个分支都会goto到LABEL_19。看来要从case0往下执行,每次执行完都goto到LABEL_19,LABEL_19重新计算a2的值,递归执行sub_8048414函数进行下一个case,a1+1对比下一个字符。最终会走到break。
整个case顺序是0-7-1-3-6-5-9-4-2(default),对应的a1字符值105-115-101-110-103-97-114-100-break,对应的a1字符是isengard。
我们执行一下 ./re1 isengard 回显得到 flag{cepo_xiaoxin_like_ikun_ctrl}
0x0C、rsa41【rsa共模攻击】
题目是下面这样的,看起来同一个明文m用两个e1、e2分别加密了,可以尝试共模攻击。这篇原理和过程写的很好就不多说啥了【密码学RSA】共模攻击原理详解_已知e1*e2的共模攻击题_malloc_冲!的博客-CSDN博客_共模攻击
e1*e2= 151931
n= 84130325462189313261610613840200969686006974931596752912032790684163259588936598567112333205675376575653349699558006190805236048677612743149161267856067749658721310907290563192651822456436162893862332677601389286823850869861627186339695681127691895146627792056779915527655786135390557374522354125691160967603061917013801283769106284129418217154101973930260335807437308795976093605719570668187252953377241106277131154146406710208553604162789827629653779259160590959887598160617569785797679836749435646510582655971711741029417262291445133694164402046308899620645557434194447055229215374986345090010304045839732593934047238792984259915694506040189791018542812674501957158976683553103670916884578330339754410985060529044158920150117253712701573184005911278916381934132179281549735149623256759896156546668842438913581742577907775289270627635194061377904271075235797938643630177588509680531035491329021958784461639411836887676505524012023437950803999811659244823170086524422112788479235025578274269284102996813609639046143942802445958501781726534600684331272113138000127764573457550116220984423875964403470300541258257779535477443662855528497647534458034753495233962850546196096902356580597
c1= 5526981843577863694461841818351673890485198991567434658436770623490360611171871127510696277931234016151166487845669008158730860791187426804659014070306342599593203461644344063671060608024741125863151160681737760825655904785410788429923395448479309181146271656243865686872360070862425446306804455143460283097489937460681185667889651996340602549406246983404553712950903106202637657545318838234089563006281413871664984932655309786145062824775367490677358018047724375137646853089100636910706417957472451511189929270830461215635563336097943145813465687418167325953057560920557811037396525599283369527238547590099431770150410613446367215565152850675941768614103145735526747937173171095406355478150520086157783786157233800132640165602216366493748584897917370650633605868739552901472918463967537246747239034849801736709740501078016729820001908860255554244761014914173396258591186967052039240422376770977181833478209734238146312802796726420114480881217425132382900982749982633798649678323928534549057994366138023265799921199669695092069367137971097924101068016233987031053592978291709434171339215459621867307522559994943572193872611134462980500249831546682238789659886548296132550808672970975
c2= 34084270081687215738807305215251787451638821299044014914682531967321866632121742567116108518795723102917357389974357667834615280184350852689416055137489247144479830563666110553634856291420207301164541339536763839450977561693676245102910452394708665923322529405310574606327895930541878192148924940959431781480647857477703953124323177425707471323985717664697755487011012344887464332487662104362515163201720826713950129753029845783245282363456550757104613456683996197339839069797091412545873164972661844751681352702261084660646346044820936686595737245383217501391011213177128366315025981912576190042188565795126552888941891222878512876415813788639279098423252518562584392383828846310597706984192183323459131536957686029489643645530071134644693970419530213624757323611027399502740215831349835885291912029119606235799410070446960489470382325032756908742170024039020096953892876059066875780052077940300335448034160045048020007407018279790936847112516378129875607582306514635993448576932928782939218669424318874692862402344461024076485525660329526521172000498582344032675985278644197734558735991092983701763358607940473927824852544744622220580239511275435637081454423079295014742864719778127
共模攻击就是使用两个及以上的公钥来加密同一条信息,即c1=m^e1 % n,c2=m^e2 % n。
根据更相减损术(欧几里得算法),对于不完全为0的整数a和b,gcd(a,b)表示a,b的最大公约数,那么一定存在整数x和y,使得gcd(a,b)=ax+by 。如果gcd(e1, e2)=1 ,那么存在两个整数s1和s2使得 e1s1+e2s2=1。
模运算有两条性质可以推倒出
性质1:。性质1容易推导,设,,那么有 ,,那么有 ,易证
性质2:,可以看成b个a相乘,通过性质1易证性质2。
推倒:
又因为,所以
所以本题考虑共模攻击,但是不知道e的具体数值仅知道e1*e2,然后这里使用共模攻击脚本是无法解出来的,原因是用正常脚本计算出来的m为km。分解e1e2=13*13*29*31,最大公因数13。因此,根据上面推导的共模攻击公式 。所以,需要对e进行爆破的同时,需要对m^k进行判别。参考上面那篇博文代码,自己修改了一下,成功得到flag。
# import libnum
import gmpy2e1e2 = 151931
n = 84130325462189313261610613840200969686006974931596752912032790684163259588936598567112333205675376575653349699558006190805236048677612743149161267856067749658721310907290563192651822456436162893862332677601389286823850869861627186339695681127691895146627792056779915527655786135390557374522354125691160967603061917013801283769106284129418217154101973930260335807437308795976093605719570668187252953377241106277131154146406710208553604162789827629653779259160590959887598160617569785797679836749435646510582655971711741029417262291445133694164402046308899620645557434194447055229215374986345090010304045839732593934047238792984259915694506040189791018542812674501957158976683553103670916884578330339754410985060529044158920150117253712701573184005911278916381934132179281549735149623256759896156546668842438913581742577907775289270627635194061377904271075235797938643630177588509680531035491329021958784461639411836887676505524012023437950803999811659244823170086524422112788479235025578274269284102996813609639046143942802445958501781726534600684331272113138000127764573457550116220984423875964403470300541258257779535477443662855528497647534458034753495233962850546196096902356580597
c1 = 5526981843577863694461841818351673890485198991567434658436770623490360611171871127510696277931234016151166487845669008158730860791187426804659014070306342599593203461644344063671060608024741125863151160681737760825655904785410788429923395448479309181146271656243865686872360070862425446306804455143460283097489937460681185667889651996340602549406246983404553712950903106202637657545318838234089563006281413871664984932655309786145062824775367490677358018047724375137646853089100636910706417957472451511189929270830461215635563336097943145813465687418167325953057560920557811037396525599283369527238547590099431770150410613446367215565152850675941768614103145735526747937173171095406355478150520086157783786157233800132640165602216366493748584897917370650633605868739552901472918463967537246747239034849801736709740501078016729820001908860255554244761014914173396258591186967052039240422376770977181833478209734238146312802796726420114480881217425132382900982749982633798649678323928534549057994366138023265799921199669695092069367137971097924101068016233987031053592978291709434171339215459621867307522559994943572193872611134462980500249831546682238789659886548296132550808672970975
c2 = 34084270081687215738807305215251787451638821299044014914682531967321866632121742567116108518795723102917357389974357667834615280184350852689416055137489247144479830563666110553634856291420207301164541339536763839450977561693676245102910452394708665923322529405310574606327895930541878192148924940959431781480647857477703953124323177425707471323985717664697755487011012344887464332487662104362515163201720826713950129753029845783245282363456550757104613456683996197339839069797091412545873164972661844751681352702261084660646346044820936686595737245383217501391011213177128366315025981912576190042188565795126552888941891222878512876415813788639279098423252518562584392383828846310597706984192183323459131536957686029489643645530071134644693970419530213624757323611027399502740215831349835885291912029119606235799410070446960489470382325032756908742170024039020096953892876059066875780052077940300335448034160045048020007407018279790936847112516378129875607582306514635993448576932928782939218669424318874692862402344461024076485525660329526521172000498582344032675985278644197734558735991092983701763358607940473927824852544744622220580239511275435637081454423079295014742864719778127def rsa_gong_N_def(e1, e2, c1, c2, n): # 共模攻击函数e1, e2, c1, c2, n = int(e1), int(e2), int(c1), int(c2), int(n)print("e1,e2:", e1, e2)s = gmpy2.gcdext(e1, e2)print("mpz:", s)s1 = s[1]s2 = s[2]if s1 < 0:s1 = - s1c1 = gmpy2.invert(c1, n)elif s2 < 0:s2 = - s2c2 = gmpy2.invert(c2, n)m = (pow(c1, s1, n) * pow(c2, s2, n)) % nreturn int(m)def de(c, e, n): # 因为此时的m不是真正的m,而是m^k,所以对m^k进行爆破k = 0while k < 1000: # 指定k小于1000mk = c + n * k# 返回的第一个数值为开方数,第二个数值为布尔型,可整除为true,可自行测试flag, true1 = gmpy2.iroot(mk, e)if True == true1:# print(libnum.n2s(int(flag)))return flagk += 1def i2s(i):length = len(str(hex(i)).replace('0x', ''))length = length // 2 + length % 2b = (i).to_bytes(length, 'big')try:s = b.decode('ascii')return sexcept:return Nonefor e1 in range(2, e1e2):if e1e2 % e1 == 0: # 爆破可整除的ee2 = e1e2 // e1c = rsa_gong_N_def(e1, e2, c1, c2, n)e = gmpy2.gcd(e1, e2)m1 = de(c, e, n)if m1: # 指定输出m1# 可以使用libnum.n2s把m1转换成字符串,也可以使用自己写的i2s,print(libnum.n2s(int(m1)))# m1 = 13040004482825621020299718708493757526231130069031398679622047997097305186529331218280047229print(i2s(int(m1)))
在众多爆破结果里面找到flag
0x0D、next
这篇关于2022年第三届指挥官杯练习赛题目和writeup的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!