기타는 로그인하고 내 아내
Lsb 스테 가노 그래피를 보여줄 다른 의미가 없습니다.
lsp의 제목에서 lsb 스테 가노 그래피까지 다음을 사용하십시오.
열리면 세 개의 하위 비트가 0이고
그런 다음 그들 사이의 공백을 제거하십시오.
빅 버드는
같은 소프트웨어를 사용 하여 라운드 턴 라운드 턴 라운드 턴 라운드 턴
프레임 별 분석
모아서 나와
단순 rsa
from Crypto.Util.number import *
import gmpy2
k = 33168381182273613039378043939021834598473369704339979031406271655410089954946280020962013567831560156371101600701016104005421325248601464958972907319520487
c = 15648371218931722790904370162434678887479860668661143723578014419431384242698608484519131092011871609478799077215927112238954528656254346684710581567304227780228595294264728729958171950314042749100472064919234676544341981418897908716041285489451559413615567610248062182987859379618660273180094632711606707044369369521705956617241028487496003699514741969755999188620908457673804851050978409605236834130689819372028797174206307452231481436775711682625666741103384019125790777595493607264935529404041668987520925766499991295444934206081920983461246565313127213548970084044528257990347653612337100743309603015391586841499
e = 4097
phi = k-1
d=gmpy2.invert(e,phi)
flag = pow(c,d,k)
print(long_to_bytes(flag))
Rsa 알고리즘 e의 공개 키를 알고, c (암호문)를 알고 튜플을 제공합니다. 첫 번째 요소는 공개 키이고 두 번째 요소는 개인 키입니다. K는 n이므로 d가 계산됩니다. pow ( c, D, k)는 일반 텍스트를 찾습니다.
참조 웹 사이트 https://blog.cryptohack.org/cryptoctf2020
웹 사이트의 생각 :
이 문제는 모듈러스
N = (p ∗ q ∗ r) ∗ (p + q + r)로 플래그를 암호화하고
출력 n = pqr, k = p + q + r을 제공합니다. 암호 시스템을 완전히 깨뜨리기 위해 우리는 모듈러스의 끈기를 찾고 싶을 것입니다.
ϕ (N) = (p−1) (q−1) (r−1) (p + q + r−1)
하지만 암호화 된 메시지 m이 충분히 작을 때 이것을 단순화 할 수 있습니다. m <k이면 대신 ϕ (k) = k−1을 찾고 e-1modϕ (k)를 찾아 풀 수 있습니다!
모든 n, l에 대해 l | n에 해당하는 한 a≡b (modn)는 mod l : a≡b (modl)도 유지합니다 (그러나 그 반대의 경우 반드시 유지되는 것은 아닙니다). 이것을 완전히보기 위해 우리는
a⇔a⇒a≡b (modn) = b + kn = b + ktl (since l | n, so n = tl) ≡b (modl)
그래서, k | n, 우리는 단일 프라임 RSA 문제인 것처럼 m≡m1 + ϕ (k) (modk)를 풀 수 있습니다. 그리고 m <k이기 때문에 잔사 [m] k (m을 k로 나눌 때의 나머지)는 정확히 m과 같습니다.
암호
분석 로직을 적어 두면 대체 암호, 한 글자가 다른 글자에 해당하고 한 번만 나타나는
것을 알 수 있습니다. 스크립트를 사용하고 싶었고 단어 빈도를 통해 분석했습니다. 그러나 오랫동안 그렇게 한 후에는 인터넷에 금이 간 웹 사이트를 검색해 보았는데 실제로 우회가 필요하다는 것을 알았습니다.
웹 사이트 https://quipqiup.com/에 대한 연결을 끊습니다.
ez_rsa에
대한 질문을 받은 후 즉시 Google에서 검색하여 원래 질문을 찾았습니다.
from Crypto.Util.number import *
from gmpy2 import invert
n=17986052241518124152579698727005505088573670763293762110375836247355612011054569717338676781772224186355540833136105641118789391002684013237464006860953174190278718294774874590936823847040556879723368745745863499521381501281961534965719063185861101706333863256855553691578381034302217163536137697146370869852180388385732050177505306982196493799420954022912860262710497234529008765582379823928557307038782793649826879316617865012433973899266322533955187594070215597700782682186705964842947435512183808651329554499897644733096933800570431036589775974437965028894251544530715336418443795864241340792616415926241778326529055663
e=65537
enc=17505679398266502116464734134128725340247050682772207798718112582701162398326982870035320307354098156145675458669731605067821790146061040637109327455205893324813052120216078570610930872674755246099365674625431655007219684642963335426955196473587347290657014023186920750946928312239116919090008342804123453311441848155223191179999664929660663345568499980778425899869956228245802722031728956228667784902213280684273577858909961747898300981963006329584725303446719192681170020458749808054637224882633325702468591074293728614333360418157985394943356536309321590140334348949095024011542798810065149061943391776967748248277703228
beta=11864389277042761216996641604675717452843530574016671576684180662096506094587545173005905433938758559675517932481818900399893444422743930613073261450555599
tip = (n-1)//(2*beta)
xy1=tip//beta
def attack(xy1):
while True:
try:
xy1=xy1-2
d=invert(e,2*xy1*pow(beta,2))
c=pow(3,e,n)
if pow(c,d,n)==3:
return d
else:
continue
except:
continue
d=attack(xy1)
print long_to_bytes(pow(enc,d,n))
그런 다음 x + y를 얻는 문제에 대해 베타는 512 비트이고 n 비트의 수는 2068이고 평균 p 비트의 수는 1034이고 x 비트의 수는 아마도 1034 – 1 – 512 = 521입니다. x + y와 beta의 차이는 약 10 자리로 완전히 폭력적입니다 .n = p * q = 4xybeta ^ 2 + 2 (x + y) beta + 1
tip = (n-1) / / beta
그런 다음 tip modulus beta를 제공하고 (x + y) % beta를 얻을 수 있습니다. x + y를 얻을 수 있다면 분명히 x * y를 얻을 수 있고 방정식을 풀고 x와 y를 얻을 수 있습니다. p와 q를 얻은 다음 rsa를 해독하여 플래그를 얻을 수 있습니다. 기본적으로 py2로 실행하고 해당 매개 변수를 수정하기 만하면됩니다.
Try
Except 문 을 사용해야합니다 . 블라스팅이 성공하지 못했지만 계속해야하기
때문입니다. 위안으로 되돌릴 수 없음)
초기 오류는 아마도 오류 설명이 작성에 사용되지 않았기 때문일 것입니다.
내 py2 환경이 어디로 가야할지 잊었 기 때문에 내가 작성한 스크립트와 팀원
이 실행 한 exp 가 나와서 체크인했습니다.
참조 웹 사이트 https://www.cnblogs.com/crybaby/p/12940219.html
참조 스크립트
쓰기 특급
from Crypto.Cipher import AES
def xor(p1, p2):
tmp = ''
for i in range(len(p2)):
tmp += chr(ord(p1[i]) ^ ord(p2[i]))
return tmp
key = "\t\xe6\x85]):\x1b\x86\xffD\xf1\x89H\xb1\x9b\xac"
cipherText1 = "ed64978b91ef5b62561a44c8f529b91f".decode("hex")
cipherText = "fd6dd5e0f9ab258b2bc9c813177e3ad677116d2f08c69517d0e7796c1f5e06ba95c3de5a139bb687bf3e779a0730e47c".decode("hex")
plainText = "CBC_Cr4cked_succ"
fakeIV = "aaaaaaaaaaaaaaaa"
fakeIVAes = AES.new(key, AES.MODE_CBC, fakeIV)
fakePlainText = fakeIVAes.decrypt(cipherText1)
enc_msg = xor(fakePlainText, fakeIV)
iv = xor(enc_msg, plainText)
print len(iv)
print "iv is : " + iv
aes = AES.new(key, AES.MODE_CBC, iv)
flag = aes.decrypt(cipherText)
print flag
이 암호화 알고리즘, 모델은 암호화 수업에서 배운 모델입니다. 암호화를 배운 사람들이 사용할 수있을 것이라고 믿습니다. py2 환경이 없기 때문에 여전히 팀원이 실행합니다.
첫 번째 수준을 만든 다음 두 번째 수준을 만들었습니다.
flag = "bxsyyds{
xxxxxxx}
assert flag.startswith("bxsyyds{")
assert flag.endswith("}")
assert len(flag)==16
def lfsr(R,mask):
output = (R << 1) & 0xfffffff
i=(R&mask)&0xfffffff
lastbit=0
while i!=0:
lastbit^=(i&1)
i=i>>1
output^=lastbit
return (output,lastbit)
R=int(flag[8:-1],16)
mask=0b1001000000100000001000100101
f=open("result","w")
for i in range(100):
tmp=0
for j in range(8):
(R,out)=lfsr(R,mask)
tmp=(tmp << 1)^out
f.write(chr(tmp))
f.close()
암호화 실험을 해보면 lsfr 스트림 암호임을 쉽게 알 수 있으며, 결과에 해당하는 바이너리 모드의 처음 7 * 4 = 28 바이너리 스트림을 찾아야합니다.
처음에는 부주의로 인해 16 진수를 2 진수로 변환하는 것이 잘못되었습니다! ! !
꽤 우회
그런 다음 짧은 시간 동안 인생에 대해 생각한 후 이진 시스템이 옳은지 아닌지 확인하면 잘못된 것으로 판명되었습니다.
re1
참조
https://driverxdw.github.io/2019/04/24/2019%E8%A5%BF%E6%B9%96%E8%AE%BA%E5%89%91CTF-%E4%BA%8C/
0x3A = 3 * 16 + 10 = 58
BASE58 인코딩
위를 실행할 때 Enter 키를 누르는 것을 잊었습니다.
>>> s='34avux4BwXYJzh1nHK1oG5xTKeBSCERZs4xC'
>>> t='123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
>>> flag=0
>>> for i in range(len(s)):
... flag=flag*58+t.index(s[i])
... flag
File "<stdin>", line 3
flag
^
SyntaxError: invalid syntax
>>> flag
0
>>> flag
0
>>> for i in range(len(s)):
... flag=flag*58+t.index(s[i])
...
>>> flag
108200298718158997245509125691632101258313020496600351308152445
>>> hex(flag)
'0x43554d544354467b3841736535425f31735f456135797e7e7e7d'
>>> from binascii import *
>>> a2b_hex('43554d544354467b3841736535425f31735f456135797e7e7e7d')
b'CUMTCTF{8Ase5B_1s_Ea5y~~~}'