Try   HackMD

angstromctf 2023

Crypto

ranch

Challenge cho chuỗi Caesar dressing is so 44 BC
rtkw{cf0bj_czbv_nv'cc_y4mv_kf_kip_re0kyvi_uivjj1ex_5vw89s3r44901831}

decode bằng dcoder

Flag: actf{lo0ks_like_we'll_h4ve_to_try_an0ther_dress1ng_5ef89b3a44901831}

impossibble

Nhập tràn số quá 64bit

Flag: actf{se3ms_pretty_p0ssible_t0_m3_7623fb7e33577b8a}

Lazy Lagrange

Challenge cho file lazylagrange.py

Ta gửi số nguyên 1 đến máy chủ và sau đó gửi danh sách 10 số nguyên đến máy chủ. Máy chủ phản hồi với 10 số nguyên được lưu trong danh sách y.
Tạo một đối tượng bộ giải Z3 và xác định 18 biến số nguyên k[0] đến k[17] bằng cách sử dụng hàm Int từ Z3.
Thêm các ràng buộc vào bộ giải sao cho mỗi biến k[i] nằm trong khoảng từ 32 đến 126 (tương ứng với các ký tự có thể in được ASCII).
Thêm các ràng buộc bổ sung cho bộ giải s sao cho đa thức tmp bằng y[i] cho mỗi i từ 0 đến 9, trong đó tmp là tổng của (k[j] * (i ** j)) cho j từ 0 đến 17.
Sau đó kiểm tra xem bộ giải s có thỏa mãn hay không và thu được một mô hình m thỏa mãn (tức là, việc gán các giá trị cho các biến k[0] đến k[17] thỏa mãn tất cả các ràng buộc).

Solution.py

from z3 import *
import pwn

conn = pwn.remote("challs.actf.co", 32100)

N = 18

x = [ i for i  in range(10)]
conn.sendlineafter(b":", b"1")
conn.sendlineafter(b">", " ".join(map(str, x)).encode())
y = [int(conn.recvline()) for _ in range(10)]

s = Solver()
k = [Int(f"{i}") for i in range(N)]
for i in range(18):
    s.add(32 <= k[i], k[i] < 127)
for i in range(10):
    tmp = 0
    for j in range(18):
        tmp += k[j] * (i ** j)
    s.add(tmp == y[i])
s.check()
m = s.model()

conn.sendlineafter(b":", b"2")
conn.sendlineafter(b">", " ".join(map(str, [m[k[i]].as_long() for i in range(N)])))
p = list(map(int, conn.recvline().split()))
flag = [''] * N
for i in range(N):
    flag[p[i]] = chr(m[k[i]].as_long())
print("".join(flag))

Flag: actf{f80f6086a77b}

Royal Society of Arts

Challenge cho file rsa.py và output

from Crypto.Util.number import getStrongPrime, bytes_to_long
f = open("flag.txt").read()
m = bytes_to_long(f.encode())
p = getStrongPrime(512)
q = getStrongPrime(512)
n = p*q
e = 65537
c = pow(m,e,n)
print("n =",n)
print("e =",e)
print("c =",c)
print("(p-2)*(q-1) =", (p-2)*(q-1))
print("(p-1)*(q-2) =", (p-1)*(q-2))

n = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230158509195522123739130077725744091649212709410268449632822394998403777113982287135909401792915941770405800840172214125677106752311001755849804716850482011237
e = 65537
c = 40544832072726879770661606103417010618988078158535064967318135325645800905492733782556836821807067038917156891878646364780739241157067824416245546374568847937204678288252116089080688173934638564031950544806463980467254757125934359394683198190255474629179266277601987023393543376811412693043039558487983367289
(p-2)(q-1) = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230125943565148141498300205893475242956903188936949934637477735897301870046234768439825644866543391610507164360506843171701976641285249754264159339017466738250
(p-1)
(q-2) = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230123577760657520479879758538312798938234126141096433998438004751495264208294710150161381066757910797946636886901614307738041629014360829994204066455759806614

Từ dữ kiện bài cho lập hệ 2 phương trình 2 ẩn p,q. Và giải hệ pt tìm được p,q

(p-2)(q-1) = A
(p-1)(q-2) = B
p + 2q = n - A + 2
2p + q = n - B + 2
solution.py

import math
from Crypto.Util.number import *
n = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230158509195522123739130077725744091649212709410268449632822394998403777113982287135909401792915941770405800840172214125677106752311001755849804716850482011237
e = 65537
c = 40544832072726879770661606103417010618988078158535064967318135325645800905492733782556836821807067038917156891878646364780739241157067824416245546374568847937204678288252116089080688173934638564031950544806463980467254757125934359394683198190255474629179266277601987023393543376811412693043039558487983367289
#(p-2)*(q-1) = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230125943565148141498300205893475242956903188936949934637477735897301870046234768439825644866543391610507164360506843171701976641285249754264159339017466738250
#(p-1)*(q-2) = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230123577760657520479879758538312798938234126141096433998438004751495264208294710150161381066757910797946636886901614307738041629014360829994204066455759806614


A = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230125943565148141498300205893475242956903188936949934637477735897301870046234768439825644866543391610507164360506843171701976641285249754264159339017466738250
B = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230123577760657520479879758538312798938234126141096433998438004751495264208294710150161381066757910797946636886901614307738041629014360829994204066455759806614

a = n - A + 2
b = n - B + 2 
print(2*a -b)
q = (2*a - b)//3
p = a - 2*q
phi = (p-1)*(q-1)
d = pow(e,-1,phi)
print(long_to_bytes(pow(c,d,n)))
print(p*q == n)

Flag: actf{tw0_equ4ti0ns_in_tw0_unkn0wns_d62507431b7e7087}

Royal Society of Arts 2

Challenge cho file rsa2.py

from Crypto.Util.number import getStrongPrime, bytes_to_long, long_to_bytes
f = open("flag.txt").read()
m = bytes_to_long(f.encode())
p = getStrongPrime(512)
q = getStrongPrime(512)
n = p*q
e = 65537
c = pow(m,e,n)
print("n =",n)
print("e =",e)
print("c =",c)

d = pow(e, -1, (p-1)*(q-1))

c = int(input("Text to decrypt: "))

if c == m or b"actf{" in long_to_bytes(pow(c, d, n)):
    print("No flag for you!")
    exit(1)

print("m =", pow(c, d, n))

Vì server check c = m hoặc "actf{" trong flag nên ta có thể nghịch đảo c rồi submit , khi server decypt và return m ,ta nghịch đảo lại m để lấy flag

solution.py

import math
from Crypto.Util.number import *
from pwn import *

r = remote( 'challs.actf.co' ,32400)
r.recvuntil(b'n = ')
n = eval(r.recvline())
r.recvuntil(b'e = ')
e = eval(r.recvline())
r.recvuntil(b'c = ')
c = eval(r.recvline())
c1 = pow(c,-1,n)
r.recvuntil(b'Text to decrypt: ')
r.sendline(str(c1).encode())
r.recvuntil(b'm = ')
m = eval(r.recvline())
m = pow(m,-1,n)
print(long_to_bytes(m))

Flag: actf{rs4_is_sorta_homom0rphic_50c8d344df58322b}