Skip to content

Commit

Permalink
Update 20240618_0.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Pochi-Liberluna authored Jun 20, 2024
1 parent b374e5d commit db1b7e9
Showing 1 changed file with 64 additions and 2 deletions.
66 changes: 64 additions & 2 deletions src/pages/blog/posts/20240618_0.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ print("FLAG:", flag)
```
ctf4b{R3l4ted_pr1m3s_4re_vuLner4ble_n0_maTt3r_h0W_l4rGe_p_1s}
```
二分探索(?)をするのがいいみたいです。
<h2>math</h2>
時間中に解けませんでした。理由はどこかの過程で計算ミスをしていてバイナリからテキストに変換できませんでした。
</br>
Expand Down Expand Up @@ -138,6 +139,67 @@ assert gmpy2.mpz(b) % 3576039347807316812055446043940841851793886900049157597197
```
このコードを見ると、 $a$ , $b$ , $x$ はいずれも完全平方数で、 $a$ と $b$ はそれぞれ $p$ , $q$ から $x$ を引いた数であり、どちらも巨大数との $mod$ が $0$ になると推測されます。たぶん。
</br>
$ab$ は $a$ , $b$ の積なので、素因数分解を行うことで $a$ と $b$ をある程度絞り込めます。
$ab$ は $a$ , $b$ の積なので、素因数分解を行うことで $a$ と $b$ をある程度絞り込めます。たぶん。
</br>
また、 $p$ , $q$ はそれぞれ $(a+x)$ と $(b+x)$ であり、 $p*q = n$ なので、 $x**2 + (a+b)*x + (ab-n) = 0$ の方程式が成り立つことがわかります。
また、 $p$ , $q$ はそれぞれ $(a+x)$ と $(b+x)$ であり、 $p*q = n$ なので、 $x**2 + (a+b)*x + (ab-n) = 0$ の方程式が成り立つことがわかります。たぶん。
</br>
少し割愛して、特定した $a$ , $b$ , $x$ を使用すると $p$ , $q$ を求めれるので、solverを書きます。
</br>
solver
```python
n = 28347962831882769454618553954958819851319579984482333000162492691021802519375697262553440778001667619674723497501026613797636156704754646434775647096967729992306225998283999940438858680547911512073341409607381040912992735354698571576155750843940415057647013711359949649220231238608229533197681923695173787489927382994313313565230817693272800660584773413406312986658691062632592736135258179504656996785441096071602835406657489695156275069039550045300776031824520896862891410670249574658456594639092160270819842847709283108226626919671994630347532281842429619719214221191667701686004691774960081264751565207351509289
e = 65537
cipher = 21584943816198288600051522080026276522658576898162227146324366648480650054041094737059759505699399312596248050257694188819508698950101296033374314254837707681285359377639170449710749598138354002003296314889386075711196348215256173220002884223313832546315965310125945267664975574085558002704240448393617169465888856233502113237568170540619213181484011426535164453940899739376027204216298647125039764002258210835149662395757711004452903994153109016244375350290504216315365411682738445256671430020266141583924947184460559644863217919985928540548260221668729091080101310934989718796879197546243280468226856729271148474
ab = 28347962831882769454618553954958819851319579984482333000162492691021802519375697262553440778001667619674723497501026613797636156704754646434775647096967729992306225998283999940438858680547911512073341409607381040912992735354698571576155750843940415057647013711359949649102926524363237634349331663931595027679709000404758309617551370661140402128171288521363854241635064819660089300995273835099967771608069501973728126045089426572572945113066368225450235783211375678087346640641196055581645502430852650520923184043404571923469007524529184935909107202788041365082158979439820855282328056521446473319065347766237878289

_facs = [3, 173, 199, 306606827773]

facs = []
for x in _facs:
facs.append(x*x)

sub_a = 4701715889239073150754995341656203385876367121921416809690629011826585737797672332435916637751589158510308840818034029338373257253382781336806660731169
sub_a *= sub_a
sub_b = 35760393478073168120554460439408418517938869000491575971977265241403459560088076621005967604705616322055977691364792995889012788657592539661
sub_b *= sub_b
from Crypto.Util.number import *
import gmpy2

for S in range(1 << 4):
A = sub_a
B = sub_b
for i in range(4):
if S >> i & 1:
A *= facs[i]
else:
B *= facs[i]

ng = 0
ok = (1 << 1024)

while ok - ng > 1:
mid = (ng+ok) // 2
if (A+mid)*(B+mid) >= n:
ok = mid
else:
ng = mid

P = A + ok
Q = B + ok

if P*Q != n:
continue

phi = (P - 1) * (Q - 1)

d = pow(e, -1, phi)

m = pow(cipher, d, n)

print(long_to_bytes(m))

```
実行するとflagが出ます。
```
ctf4b{c0u1d_y0u_3nj0y_7h3_m4theM4t1c5?}
```

0 comments on commit db1b7e9

Please sign in to comment.