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 까지 시도하도록 했고, 중간에 길이가 다른 응답이 날라와서 확인해 보니 플래그가 있었다.
FLAG : HackCTF{0hhhhh_5o_g0od_try!}
Guess me 100
$filename의 값을 'secret.txt'로 선언한 뒤에 extract($_GET);을 이용해 값을 받고 있다.
따라서 우리는 $filename의 값을 바꿀 수 있고, $filename의 값을 아무 값으로 변경해 준다면, 해당 파일은 존재하지 않을 것이므로 -> guess에 아무 값도 입력해주지 않는다면 $guess === $secretcode 가 TRUE가 되어 플래그가 나올 것이다.