TheseWalls [7 Solves] upsolve
chall
1 | from secret import P, s, o, wrong, flag |
solve
全てのパラメータがP, s, o, wrong, flag
に格納されて何もわからん状態です。
とりあえず、出力から、パラメータ(modも含め)リカバリーできるのでやっていきます。
1 | Ps = [eval(i) for i in open("output.txt").readlines()[2:]] |
これで簡単に復元できます。(グレブナー基底便利)
1 | [A + 42437997016440510106912234059113681926759694788505021671714484006715784960406807326337661210536581463443414294141888675487947253004723175974512262085287744401565107056353588589043894055035481272184124372125833792185916608297835874449349134631410453080264719245505015377542883012707703282190702361267129303085, B + 459126200632887849752040227678358886031820038366770963884159263686486524398810848612517185164748716420888346292004054958933940038260166360595786900336024132100453336182502034941923082615662562466591523855797071255915619970830634702916789796993677327554098916574862778060640867963470961569155246282541122528, 102426836944425277819174256940128868455066517869185115488781035394164877927042198980921397582250905694209313963017944880679709788694772632564808279062807699845761214703586660326307989151472431126842544189892251409194318824261554131269698538462346988910692541060196190265045309883144365795763912362099350625483] |
modが合成数でどうしようかと思っていた矢先に、わざとdivision error起こして素因数分解する手法を思い出し、やってみると、1
ZeroDivisionError: Inverse of 3562548874780288796769030192977 does not exist (characteristic = 102426836944425277819174256940128868455066517869185115488781035394164877927042198980921397582250905694209313963017944880679709788694772632564808279062807699845761214703586660326307989151472431126842544189892251409194318824261554131269698538462346988910692541060196190265045309883144365795763912362099350625483 = 3562548874780288796769030192977*28750998384756811025752129590555132573338276387761714818239168529696001090482641836251161799832248142910954339498915727248648688248809529111284480071606360371923389075510517968865199800431013435656000983440622625813948412147843001184329335317021013178557815932219648144379013979)
よって、1つの因数3562548874780288796769030192977
がわかります。
ここで、更に因数分解を進めると以下になります。
1 | p0 = 3562548874780288796769030192977 |
ここで、p0はSingular curveなのでSingular Curve Point Decompression Attack
が刺さります。
ここで、他の素数p1,p2,p3
は位数がp+1の型なのでMOV attack、なので、p進整数の2つを用いて解きます。
p0の場合
以下で解きます。
1 | x = GF(p)["x"].gen() |
そのほかの場合
MOV attackとzer0pts ctf 2021 writeup (日本語)で解きます。
1 | E = P.curve() |
あとは、適当にCRTで合わせておk
Resonance [2 solve] upsolve
1 | import itertools |
同種写像を使って始点、終点が同じ、その他はほとんど異なる3つのpathを作れという問題
KLPT algrithm
1 |