SECCON Beginners CTF 2020 Writesup

8421 단어 CTF보안
SECCON Beginners CTF2020에 참가했으므로 Writesup을 기재합니다
스코어 서버
htps : / / s 이것. 베긴 rs. 괜찮아. jp/짱게 s

Welcome




문제문에 기재된 대로 SECCON Beginners의 Discord 채널에 액세스하면 플래그가 있다.



FLAG:ctf4b{sorry, we lost the ownership of our irc channel so we decided to use discord}

emoemoencode



이모티콘을 기반으로 플래그를 추정합니다.
처음 세 문자가 ctf로 변환된다고 가정하고 이모티콘을 숫자로 변환하면 다음과 같이됩니다 (python ord 사용)
🍣 127843 ⇔   c 99
🍴 127860 ⇔ t 116
🍦 127846 ⇔ f 102
이와 같이, 이모티콘을 숫자로 변환 후, 127744를 뺀 것을 다시 영문자로 변환하면 플래그를 취득할 수 있다.

답변 코드
question="🍣🍴🍦🌴🍢🍻🍳🍴🍥🍧🍡🍮🌰🍧🍲🍡🍰🍨🍹🍟🍢🍹🍟🍥🍭🌰🌰🌰🌰🌰🌰🍪🍩🍽"
result=""

for q in question:
   result=result+chr(ord(q) -127744)

print(result)

FLAG:ctf4b{stegan0graphy_by_em000000ji}

mask



파일을 다운로드 한 후 실행하면 다음과 같이 사용법이 표시됩니다.
./mask 
Usage: ./mask [FLAG]
./mask  a
Putting on masks..
a
a
Wrong FLAG. Try again

올바른 플래그를 입력하면 지울 수 있습니다.
해당 파일을 IDA 혹은 gidra로 열면, 이하의 2개를 만족하는 캐릭터 라인인 것을 알 수 있다

1. 인수로 건네준 문자열과 0x75의 문자열의 논리합을 취득해, 그 결과가 "atd4`qdedtUpetepqeUdaaeUeaqau"가 되는 것
2. 인수로 건네준 문자열과 0xeb의 문자열의 논리합을 취득해, 그 결과가 "c`b bk`kj`KbababcaKbacaKiacki"가 되는 것



답변 코드
v1="atd4`qdedtUpetepqeUdaaeUeaqau"
v2="c`b bk`kj`KbababcaKbacaKiacki"
result=""

for i in range(len(v1)):

 count=0x00
 while(1):
  result_v1= chr(0x75 & count)
  result_v2= chr(0xeb & count)
  if result_v1 == v1[i] and result_v2==v2[i]:
   result=result+chr(count)
   break
  else:
   count=count+1

print(result)

ctf4b{dont_reverse_face_mask}

Spy



실재하는 종업원을 특정할 수 있으면 플래그를 얻을 수 있는 것 같다.
주어진 코드를 확인하면,
1. 직원 ID가 DB에 없으면 오류를 반환합니다.
2. 직원 ID가 DB에 있으면 암호 해시를 계산하지 않으면 오류를 반환합니다.

   if not exists:
            return render_template("index.html", message="Login failed, try again.", sec="{:.7f}".format(time.perf_counter()-t))

        # auth.calc_password_hash(salt, password) adds salt and performs stretching so many times.
        # You know, it's really secure... isn't it? :-)
        hashed_password = auth.calc_password_hash(app.SALT, password)
        if hashed_password != account.password:
            return render_template("index.html", message="Login failed, try again.", sec="{:.7f}".format(time.perf_counter()-t))

정중하게 실행에 걸린 시간을 출력하는 코드가 기재되어 있으므로, 존재하는 직원의 경우에는 시간이 걸린다고 가정된다. 직원의 ID를 모두 입력하고 걸린 시간이 많은 직원만 식별하면 다음 플래그가 얻어졌다.
ctf4b{4cc0un7_3num3r4710n_by_51d3_ch4nn3l_4774ck}

R&B



다운로드한 파일을 확인하면, 암호화된 결과와 방식이 기재된 파일이 건네진다.
방식에 관해서는
1. FORMAT의 문자열이 R이면 FLAG 문자열이 ROT13 인 것 앞에 R을 부여합니다.
2. FORMAT의 문자열이 B이면 FLAG 문자열이 BASE64 인 것 앞에 B를 부여합니다.
3. 그렇지 않으면 아무 작업도

그러므로 복호할 때는 반대로 하면 되고, 이하를 암호화된 문자열에 적용한다.
1. FLAG 문자열의 시작이 R이면 R을 제거하고 나머지를 ROT13
2. FLAG 문자열의 시작이 B이면 B를 제거하고 나머지를 BASE64

ctf4b{rot_base_rot_base_rot_base_base}

감상



최소한의 인권은 얻었다.
개인적으로는 Crypt 문제에 조금 손을 대고 싶었습니다.

좋은 웹페이지 즐겨찾기