题目名称 easyalgorithm
FLAG: ACTF{Oolong_milk_tea}
大概就先把文件拖进IDA里面反编译一下,看反编译出来的c代码大概就知道是首先判断输入是否为ACTF{},然后将花括弧中的字符串赋给dest,然后通过4006A6和400792两个函数对dest进行加密,然后将得到的密文和v3后的连续地址上的asc码进行比较
然后进入792函数
发现对密文主要进行加密的就是选中的那一条语句,且发现异或运算的逆运算为异或运算所以将v3后面的先赋给dest然后然dest执行一遍792函数即可
题目名称:[Column Permutation Cipher](http://actf2020.csuaurora.org/challenges#Column Permutation Cipher)
FLAG:忘了
好像是矩阵转置吧,大概就把字符串先读入然后依次枚举j,输出str[i%j]=0 1 2 3 4....j;
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
char s[maxn];
int main()
{
gets(s);
int t=5;
for(;t<51;t++){
int tt=0;
printf("%d\n",t);
for(int t1=0;t1<=t;t1++){
for(int i=0;i<strlen(s);i++){
if(i%t==t1){
printf("%c",s[i]);
}
}
}
puts("");puts("");
}
return 0;
}
题目名称:我的密码本
FLAG:忘了
emmmm大概替换密码,本来想用字频分析的,但是中间几个连续的太明显了,一看就是I have a dream,接着把每个符号换成对应的字母就行了
题目名称:[bomb or boom](http://actf2020.csuaurora.org/challenges#bomb or boom)
FLAG:也忘了
emmm5个密码只用破译四个就能拿到最后密码,明显是门限方案,结合题目名称,应该是bloom门限
密码1:培根密码
密码2:盲文
密码3:音符
密码4:放进浏览器f12即可
密码5:beautifulfxxk
from Crypto.Util.number import long_to_bytes
#from Cryptodome.Util.number import *
a1 =2891369521230520600
d1 =5539166121540472709
a2 =5485400237604727152
d2 =9993590208169240051
a3 =10305113992248275270
d3 =23524210813213316809
a4 =63558232650391605454
d4 =134070550878039878083
dd = d1*d2*d3*d4
t1 = pow(dd//d1,d1-2,d1)
assert(t1*d2*d3*d4%d1 == 1)
t2 = pow(dd//d2,d2-2,d2)
assert(t2*d1*d3*d4%d2 == 1)
t3 = pow(dd//d3,d3-2,d3)
assert(t3*d2*d1*d4%d3 == 1)
t4 = pow(dd//d4,d4-2,d4)
assert(t4*d1*d2*d3%d4 == 1)
s = a1*t1*d2*d3*d4+a2*t2*d1*d3*d4+a3*t3*d1*d2*d4+a4*t4*d1*d2*d3
p = 80804238007977405688648566160504278593148666302626415149704905628622876270862865768337953835725801963142685182510812938072115996355782396318303927020705623120652014080032809421180400984242061592520733710243483947230962631945045134540159517488288781666622635328316972979183761952842010806304748313326215619695085380586052550443025074501971925005072999275628549710915357400946408857
s %= dd
print(s)
s %= p
print(long_to_bytes(s))
s1=long_to_bytes(s)
string = str(s1, ‘utf-8‘)
题目名称:[naive encryption](http://actf2020.csuaurora.org/challenges#naive encryption)
FLAG:也忘了
脚本没了QAQ,大概就是一个很简单的加密,本来应该用逆元来干的,脑抽了,后来索性就把1-1000赋给一个数组然后把这个数组送进脚本加密,最后根据密文从这个数组中搜索相同的值,那个值的数组下标就是对应的明文
题目名称:[naive rsa](http://actf2020.csuaurora.org/challenges#naive rsa)
FLAG:也忘了(梅 开 六 度
大概就是一个知道n,e和p%q的rsa加密,数字都比较大,就通过两个方程来联立
n=p*q
p=i*q+r r=p%q
大概联立之后是一个一元二次方程,求根公式得到Δ表达式,然后枚举i,求i=?Δ开方为整数
计算i的脚本
import math
from Crypto.Util.number import *
import random
import gmpy2
#from flag import FLAG
from hashlib import sha512
# k=1004566198076519599602210506731394352706714405801310206329305430708682949563948700333927208488048733764810655777562050736705748648879470498998723741270
# N=6175514749485049413373053071377575530945321634164009072622885654208471537300095005766963778577419199581721246040523785483324001647047467977214814050030943587133763852027399660086870815580138990175204425542876441687390233356169129495839603358265027911239762126454056305503929467053024849366236798248475696207
k=1664378273764672561481497292551642336941327875994089223647717998013917832303422428361645030411515444821419803773096130060882949555523385748675583853223
N=5754094104856015920963155315529694503752968701370323713954167246906863558022656918708749389447554038178168689652102239536100003732359209400841675514433022980427389298328148493518873305290450595854131004830326345098651091200924006517559346903653009437814617233027734388847229394921531624565677894307201380299
enc=2661364740807287854110181071739266317728462490127466995676506910093610338260841203050069626005131198286843482586503455269576555138365541733524628733534905931329636510784603944959000258482158578421511001987422779325971552722003155928579456158300542375865577164829487177394136543724724417365476765424760984669
def main():
# w1=gmpy2.mpz(1)
# w2=gmpy2.mpz(1)
# print(w1==w2)
for i in range(1,N):
tmp=pow(k,2)+4*i*N
t2=gmpy2.mpz(tmp)
t1=gmpy2.isqrt(tmp)
t1=gmpy2.mpz(t1)
if(t1*t1==t2):
print(i)
print(t1*t1)
print(t2)
tmp1=(-k+t1)
print(tmp1%(2*i)==0)
tmp1=tmp1//(2*i)
q=tmp1
print(q)
print("\n")
p=N//q
print(p)
print(p*q==N)
break
if __name__ == "__main__":
main()
破解明文的脚本
import math
from Crypto.Util.number import *
import random
#from flag import FLAG
from hashlib import sha512
import gmpy2
#enc=619131807053341983712996592129731844946129596361804867448023818077266884366071907777148396343131913424753531469667253075830996004711559531521437680038739168021990771840146116736026028722046579674483003435680909352182226754031166260584553606550138319245292347367443791048564768901364057882741366609043947257
#p%q=1664378273764672561481497292551642336941327875994089223647717998013917832303422428361645030411515444821419803773096130060882949555523385748675583853223
N=5754094104856015920963155315529694503752968701370323713954167246906863558022656918708749389447554038178168689652102239536100003732359209400841675514433022980427389298328148493518873305290450595854131004830326345098651091200924006517559346903653009437814617233027734388847229394921531624565677894307201380299
enc=2661364740807287854110181071739266317728462490127466995676506910093610338260841203050069626005131198286843482586503455269576555138365541733524628733534905931329636510784603944959000258482158578421511001987422779325971552722003155928579456158300542375865577164829487177394136543724724417365476765424760984669
e=65537
#N=6175514749485049413373053071377575530945321634164009072622885654208471537300095005766963778577419199581721246040523785483324001647047467977214814050030943587133763852027399660086870815580138990175204425542876441687390233356169129495839603358265027911239762126454056305503929467053024849366236798248475696207
#cmp=‘actf‘
q=3200913633159406700739711619676356828830359533084335918792917056899609530674479638023261347286860850048621666570302221712996430920616792302792029358479
p=1797641162587862886621385006530773899427124515827105214755163452706932525563681417095567980804026038624450846609018641414592282480829787314218357947364376581
def main():
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)
c=enc
m=pow(c,d,N)
print(m)
m=int(m)
# a=input()
print(long_to_bytes(m))
if __name__ == "__main__":
main()
原文:https://www.cnblogs.com/DrumWashingMachine-Lhy-NoobInCsu/p/13174962.html