'2019/11/12'에 해당되는 글 2건

암호문과 pem 형식으로 된 두 개의 공개키를 제공해 준다. pem 파일에서 n을 각각 추출한 뒤 최대 공약수를 확인해보면 공개키 생성 과정에서  공통된 소수를 사용해 p 값을 구할 수 있다.


python RsaCtfTool.py --key ../rsa/seccon/pub1 --dumpkey

python RsaCtfTool.py --key ../rsa/seccon/pub2 --dumpkey


solve.py


from gmpy2 import *

from Crypto.PublicKey import RSA


n1 = 763718912475160487902804749669814117361530270298225094625871588939939773892509348006077810445741086683427253000695920011673348476297973798322806091336777405584801442639626925406721932533140226556519019440300864340670199686368307155860493615065198319490060598587202051942638792919648596288576294804549738135969737494734307362891313864027749187674251692407867312885251279302785352318725391842117065840058358065676707016006124478822206302825992616559261930620693061673348139416033418864269248381876692676529410115745518353146254670349865568255213560376368953292931958006941630719304442332912813624543600126197554727832190226632919876204677667384620275620336951964833888599634720101911051166398907898747710391394105753614253527704990658698844796442515669670816004761855554187277637871343595647487793209271354240148469085627742503649786300484610102224828274384484809539697728008552925590472129497180290668277790132130824141651399551803499770513576176720509094833332201946177880267399933460994496277590932311628302240154240967341858152145815276163397709272690500041597393678630136932574450837982593210399370333578887450410911663220219423601973078501237709613593311133945501455828164291429228495931943107997137587307522565029820756690578833


n2 = 847796795638781450678718708664542960446354226336422534142899480441478781747168340722544245493739168125415291376063352480076469305992008517388366298914970810765149321160596112226917023146371080685458239747986992197343482255681414590678694753885521068656675164266739274608505094927725285868801825144058835115051061857233824816176186349372737400492228548130718029270482313906040935333159681273527671359469173939861889228505791626525994180917670701909816457560622922219797109618405842358250940062127841301193206255543580550667149741357342408703680375118252445296600962244008043713708516004025217199954286478272550961283413053789743740774140439284662596273452124779590753836094450154459078034659421366584354005421566290862244000178569163732971816333961711759000171156293724203334889496589376907683142167883476184246287660764821622298961378903818077158234683927321823293466245584486980446609569799420950073036635602004293246754252079757527610246223280774592566063422181158810677919909523144033543195999214800559998598003329294711989868113423468536273984117507008756542731210465222475943122324672467669623079721727526348599823126409108190030551584092950358235465140166515452377475799157617227362838246912839086733412861436353117994501342653


p = gcd(n1,n2)


n = n2


q = n/p

e = 65537


phi = (p-1)*(q-1)


d = invert(e,phi)

f = open("./cipher","rb")

c = f.read()

c = int(c.encode("hex"),16)


print("%x"%pow(c,d,n))[1:].decode("hex")


블로그 이미지

JeonYoungSin

메모 기록용 공간

,

문제 파일은 아래와 같다.


revolutional-secure-angou-de97106aa248a41a40fdd001fc5f7b4b4f28a39eb6bcabf8401b108b7a8961c5.7z


압축을 풀어보면 암호화된 flag, pem 형식의 공개키, 문제 소스가 존재한다.


generator.rb


require 'openssl'


e = 65537

while true

  p = OpenSSL::BN.generate_prime(1024, false)

  q = OpenSSL::BN.new(e).mod_inverse(p)

  next unless q.prime?

  key = OpenSSL::PKey::RSA.new

  key.set_key(p.to_i * q.to_i, e, nil)

  File.write('publickey.pem', key.to_pem)

  File.binwrite('flag.encrypted', key.public_encrypt(File.binread('flag')))

  break

end


소스는 루비를 통해 pem 형식의 공개키를 만들고 해당 공개키로 flag를 암호화하는 구조이다.


pem 파일에 존재하는 공개키를 구하기 위해 아래 툴을 사용하였다.



ssrinc@ssrinc-virtual-machine:~/RsaCtfTool$ ./RsaCtfTool.py --key ./publickey.pem --dumpkey

[*] n: 16809924442712290290403972268146404729136337398387543585587922385691232205208904952456166894756423463681417301476531768597525526095592145907599331332888256802856883222089636138597763209373618772218321592840374842334044137335907260797472710869521753591357268215122104298868917562185292900513866206744431640042086483729385911318269030906569639399362889194207326479627835332258695805485714124959985930862377523511276514446771151440627624648692470758438999548140726103882523526460632932758848850419784646449190855119546581907152400013892131830430363417922752725911748860326944837167427691071306540321213837143845664837111

[*] e: 65537


n,e를 추출할 수 있고 n을 factor db에서 찾아보면 p,q를 구할 수 있다.

p =117776309990537864360810812340917258096636219871129327152749744175094693075913995854147376703562090249517854407162616412941789644355136574651545193852293544566513866746012759544621873312628262933928953504305148673201262843795559879423287920215664535429854303448257904097546288383796049755601625835244054479553

q = 142727552290123521017279182847387099553980176436653156686571005621360593567236973858972940588412513104338972342496604878974964273707518226570604980944855067127507753049804700855693115963197456876865788199179854448882972688495369967044453040443306336140280352904742571391288666823388345281672776486027914172087

이를 통해 phi를 구하고 d를 구해주면 된다.

d = 12685738484942314313789152088713015321019042297472437411782771035468772791022201521866687554829534334295978407562541895590222583725770119967316900820330308145867154895678917621233321220214541972265647639328917389446528753900228898248644358670442755834434712778789218829263758255497813697203332390148558830175147310866644665626759237615318035132719007400987467338201448864296771161037512985522673902009017617912715914889661745903763404559187778470360726556095437014337838584308534776262391743663242452258751468290150198568013508078353178322517408204393733661168920690604442379722902170230064742991792065054165583806721

이제 이 d값으로 pem 형식의 private key를 만들면 되는데, rsatool이란 툴을 이용해서 만들어보려고 하니까 내 환경에서 뭐가 꼬인건지 rsatool쪽 소스에서 자꾸 에러가 났다.

해결해보려다가 그냥 다른거 찾아보니 RsaCTFTool 여기에 pem 형식의 공개키를 읽어서 자동으로 pem 형식의 개인키를 만들어주는 기능이 있었다. 내부적으로 읽어온 n값이 소인수분해가 가능하거나 db에 존재하는 값일 경우 자동으로 개인키를 복구해서 만들어 주는 것 같았다.
이를 통해 pem 형식의 개인키를 복구한 뒤 해당 개인키로 암호화된 flag파일을 복구했다.

./RsaCtfTool.py --publickey ./publickey.pem --private > private.key

openssl rsautl -in ./flag.encrypted -decrypt -inkey private.key

TWCTF{9c10a83c122a9adfe6586f498655016d3267f195}





'Crypto & Network & Etc > Crypto Practice' 카테고리의 다른 글

TAMUCTF 2019 Crypto Writeup  (0) 2019.11.15
Seccon CTF 2017 Ps and Qs  (0) 2019.11.12
Plaid CTF 2015 Strength  (0) 2019.11.11
TokyoWesterns CTF 2019 baby_rsa  (0) 2019.11.11
KCTF Operation 1  (0) 2019.11.08
블로그 이미지

JeonYoungSin

메모 기록용 공간

,