위 블로그 글에 나온대로 풀려고 했는데, 주어진 zip파일은 파일 크기 부분이 정상이 아니었기 때문에, data부분의 정확한 크기를 알 수 없었습니다. 그래서 1바이트씩 줄여가며 시도할 생각으로 0000이 끝나는 부분을 기점으로 추출해서 zip파일을 만들고 파이썬 코드로 압축 풀기를 시도했습니다.
m과 a가 C에 중복으로 대응되는 것으로 보아, 카이사르는 아니다. 그래서 비제네르로 돌려봤다.
본문 key = key
플래그 key = n
Classic Cipher -1 100
Hint : [::-1]
?y4zl4J_d0ur_b0f_0K zp nhsm
[::-1] 은 reverse. 즉 글자 순서를 뒤바꿔주면 된다.
그 다음에 카이사르를 돌리니 플래그가 나왔다.
HackCTF{D0_y0u_kn0w_C4es4r?}
RSA
200
RSA 알고리즘을 이용하여 값을 해독해보자! 파일에 나와있는 c, p, q, e 는 RSA 대한 파라미터 값이다.
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
n = 10283681839193276126097189449431804469761940095295471888398234447479454966284763902940257262270896218602885591849219329295416054197234326881779747263501982465102957508563705432633950651360492963151374387619070656704554971992649022858286686244477458518219811343940208016922937570643216329114427596008380607613093481777894261584227765149699743645734317383348201997748556656749211035951710759363655486663011079526697122026161182876988679088458171192764980121987583057238040415225285169219391637708267493561674900564748140379192079752942242600521017002960185256025253900075152690586476143729320416895984549165574371936823
c = 0x5c93ba85692a8b3981a5d47be0e80d129b8a2f6cf4dc134547aa7e1620f6691513b1dc1d69e085c39e261c2b49026436bb243dba70a86f7fcd1a3a7e6b0f0ecfac015becad0a76e9cf208d5d31e2b4865
e = 3
n은 매우 크고 e는 매우 작다.
c = m^e mod n = m^e
HelloCryto
350
key 길이는 14
flag 앞에는 HackCTF{ 인 것을 알고 있으니 key 14자리중 8자리 알아낼 수 있고
메세지 뒤에 key값이 붙은 것이 다시 key 앞에 8자리랑 연산을 하니 key 뒷자리도 알아낼 수 있음.
4개의 사각형 내부가 하얀색으로 비워져 있다. 그림판으로 해당 부분을 검정으로 채우고 읽으면 된다.
달라란 침공
150
ncctf.j0n9hyun.xyz9003
1, 2, 3 모두 계산해야 되는 식들이 나온다.
식의 결과값을 입력해주면 된다.
1은 20개 2는 30개 3은 40개의 문제가 있다.
from pwn import *
p = remote("ctf.j0n9hyun.xyz", 9003)
p.recvuntil("input ) ")
p.sendline("1")
p.recvline()
for zzzz in range(0,20):
m = p.recvline()
m = m.replace("\n", "")
print(m)
a = eval(m)
p.recvuntil(": ")
p.sendline(str(a))
print(p.recvline())
print(p.recvline())
p.recvuntil("input ) ")
p.sendline("2")
p.recvline()
for zzzz in range(0,30):
m = p.recvline()
m = m.replace("\n", "")
print(m)
a = eval(m)
p.recvuntil(": ")
p.sendline(str(a))
print(p.recvline())
print(p.recvline())
p.recvuntil("input ) ")
p.sendline("3")
p.recvline()
for zzzz in range(0,40):
m = p.recvline()
m = m.replace("\n", "")
print(m)
a = eval(m)
p.recvuntil(": ")
p.sendline(str(a))
print(p.recvline())
print(p.recvline())
p.interactive()
페이지 소스를 까서 submit의 value값을 button에서 flag로 변경해주고 버튼을 클릭하면 플래그가 출력된다.
FLAG : HackCTF{0k4y...php_c4nn0t_cr34t3_4_butt0n}
보물 100
page 값에 모든 정수값을 대입해봐야 하는 것 같다.
burp suite을 이용해서 1부터 10000 까지 시도하도록 했고, 중간에 길이가 다른 응답이 날라와서 확인해 보니 플래그가 있었다.
burp suite을 이용했다.
FLAG : HackCTF{0hhhhh_5o_g0od_try!}
Guess me 100
게싱문제는 아니다.
$filename의 값을 'secret.txt'로 선언한 뒤에 extract($_GET);을 이용해 값을 받고 있다.
따라서 우리는 $filename의 값을 바꿀 수 있고, $filename의 값을 아무 값으로 변경해 준다면, 해당 파일은 존재하지 않을 것이므로 -> guess에 아무 값도 입력해주지 않는다면 $guess === $secretcode 가 TRUE가 되어 플래그가 나올 것이다.
n : 3032477561712159969038624247612606302727093197744745572360777744993048030579151290131884950670071512201722458811242592707243074323418373868073398996531180136126242688542841461913438478172053913773719857973056957510415089185531311916330433139160859155532409659622858101341629671133093910407988882203728644794239348874379289178268208136028146328608462805956004322306707963431825015814504527120066991706462521947050575789728072629790386979812591216920320695619189898158302924158362481320767791340177005794951187859952230300784183151549243274733552565133526078458260073961873518009693814714967027162359505297313081834097 e : 1284326209972781865603077160971589716597082902272211399147338196589345961573850891014620874113849550830317643345862732752124534686326463252899962000181188143162889928709347890165345017914959645496102666603718956753486894961504533642515954173645086524281277713918605331772209589332254176733343767685347067353884996601325356300748766439627935771840516032698936889600866124222228999743139709077148311384874536127451456213137422854764346519585961972790189180618601186990003649947864963747868420118048077351758919340934501383717797396822778472985089935849274746400142421412113278085759384358033116596950545779218825432105 c : 1806317310369980009932706441907756891122685977239032637376117653939592629181132498482038670618195984694250867867129559863693561069046351110958045303559854954588234447977692922829988785926862451801584819310702407585491177718755152055518733553927421577214740347956274468684747058682785453167186126384869898095355009620193273626895484591988153555158110880196986268949355968500092832237411654394295951441648748044375864656268901973180401377014754165200068392806529746504801815744345095507516459256483869799173054189822960434563127784898151685448212418354649354925633786590825084141495329161421555698179241894408873422390
e가 매우 크므로 위너 공격을 사용하면 된다. 위에 올려둔 포스트대로 코드를 수정하여 사용했다.
그러면 d값을 구할 수 있다.
Hacked! D = 1235441821
복호화 작업
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def powermod4(a, b, n):
if b ==1:
return a % n
r = powermod4(a, b /2, n)
r = r * r % n
if (b &1) ==1:
r = r * a % n
return r
#c^d mod N
#a^b mod c
a = 1806317310369980009932706441907756891122685977239032637376117653939592629181132498482038670618195984694250867867129559863693561069046351110958045303559854954588234447977692922829988785926862451801584819310702407585491177718755152055518733553927421577214740347956274468684747058682785453167186126384869898095355009620193273626895484591988153555158110880196986268949355968500092832237411654394295951441648748044375864656268901973180401377014754165200068392806529746504801815744345095507516459256483869799173054189822960434563127784898151685448212418354649354925633786590825084141495329161421555698179241894408873422390
b =1235441821
c = 3032477561712159969038624247612606302727093197744745572360777744993048030579151290131884950670071512201722458811242592707243074323418373868073398996531180136126242688542841461913438478172053913773719857973056957510415089185531311916330433139160859155532409659622858101341629671133093910407988882203728644794239348874379289178268208136028146328608462805956004322306707963431825015814504527120066991706462521947050575789728072629790386979812591216920320695619189898158302924158362481320767791340177005794951187859952230300784183151549243274733552565133526078458260073961873518009693814714967027162359505297313081834097
n : 14563994539777678316321336781712344883711529518189434139233680882263409604514153869699501702104322682479573897503872406635890483506906896813982089686642192006130896329932374470690714494675193648369783731927754727548782563723442681780574596631901415395263336968261396444462141129255716197310580275877681304858562705807686921384452565148850113267428665758030506035314679252439022969913295597306528946210184007253645129375949497711293612867692547866985135149571625792745784234869796370504461309988327790266777539646009367784188629367635437858554533733747458534618750336302736798813966890424262766487012612696221075689613 e : 7 c : 3257687211413179849713234287228115652852064803596545802006316144655701336714918948672668217982037728069055370417273850104541474476810598369542627961429180060096555295519064954697207788677528957569208943432299557549774333187664920215674167987939460257141632237998790136575185293301081863083862494006009415801599660234577382347813571039134562532471377834137776834839392965274882404992875421226913724316557631483699200757
e의 값이 7로 매우 작고 N은 매우 크다. 이 경우 M^e mod N = c 에서 mod N 과정을 거치지 않게 되어 M^e = c가 된다. 그럼 c의 e제곱근이 M이 된다.