高校生セキュリティコンテスト2024Writeup

# 高校生セキュリティコンテスト2024Writeup
今まではWriteup公開してなかったのですが、今回は公開します。

### 開催期間
2024/12/07(土)13:10　～　2024/12/07(土)15:40

### コンテスト方式
- CTFのJeopardy
- Firstbloodは5点

### 難易度
以下のように想定していました。
- 100点：高校生20人中15名くらいが解ける問題
- 200点：高校生20人中8名～10名くらいが解ける問題
- 300点：高校生20人中5～6名くらいが解ける問題
- 400点：高校生20人中2～3人くらいが解ける問題
- 500点：高校生20人中1～2人解けるか解けないかの問題

### 分野
- Welcome
- Crypto
- OSINT
- Rev
- Web
- Misc

# 目次

## Crypto
- confidential information
- RSA_Easy
- RSA_Hard
- RSA_Nightmare

## OSINT
- The Scars of the Typhoon
- Where is my friend ?
- 画像からフラグ探し
- 寄り道！そして迷子！

## Rev
- BreakingFull
- 汚れを取ろう！
- 秘密のワード

## Web
- A Lesson in Insecurity
- Break Through the Login Wall!
- ChatPHP4o
- Confusion
- え？押せない？

## Misc
- Elementary, my dear Watson.
- Goorugle
- where is here ?
- あなたは猫が欲しくなる！
- ちぎれた写真
- フラグRPG
- わかるかなセキュリティ用語2024
- 怪盗からの予告状

## 感想
- 問題の感想
- サーバ運営の感想
- まとめ

## Crypto

インターネットで買い物をするときや機密文書を提出する際に安全に情報が守られている必要があります。
その時に「暗号」という技術が活躍します。「暗号」は、情報を第三者に知られないよう、ある決められたルールで情報を別に変える技術です。
しかし、コンピュータの性能が日々向上しているため、より強固な暗号化技術の開発が常に求められています。

### confidential information
```
社員が会社の大事な情報の鍵に暗号をかけたのだが会社を辞めてしまった
そのカギがこれだ　yjttkw2024{t1gyvi_rex0}　
情報が見れなくなってしまって困っている。君にはその暗号至急解いてもらいたい。
彼は、昔から広く使われている暗号だと言っていたが...
```

flagのフォーマットが``hscctf2024{??????}``であることに注目すると以下のことがわかります。

y → h
j → s
t → c
k → t
w → f

この5つに共通していることとして、暗号化するには9文字前に、復号するには9文字後ろにずらしています。
したがって、記号、数字を除きアルファベットを9文字後ろにずらすことでflagが出てくるのではないかと考えることができます。

![confidential information_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/e32e5fe2-7dc3-fdbb-58ae-d137d8007f04.png)

9文字後ろにずらしたカギは``hscctf2024{c1pher_ang0}``よりflagを求めることができました。

``hscctf2024{c1pher_ang0}``

この問題は換字式暗号という方法で暗号化されていました。換字式暗号は、文字を別の文字や記号に置き換える暗号です。シーザー暗号も換字式暗号です。

https://ja.wikipedia.org/wiki/%E5%8D%98%E4%B8%80%E6%8F%9B%E5%AD%97%E5%BC%8F%E6%9A%97%E5%8F%B7

### RSA_Easy
```
RSA暗号は素因数分解が難しいことを利用した公開鍵暗号のことである。
・・・が、どうやらこの暗号は素因数分解ができるようだ・・・
```

RSA暗号は、インターネット通信などで広く利用されている公開鍵暗号方式の一種です。
この方式は、暗号化と復号に異なる鍵を使用するという特徴があり、その安全性は非常に大きな素数の素因数分解の難しさに基づいています。

https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7

- e,p,qは素数
- n = p*q
- l = (p-1)*(q-1)
- d = e^(-1) mod l
- 暗号文 c = m^e mod n
- 復号した文 m = c^d mod n

素因数分解ができるようなので素因数分解をします。sympyを使うと楽に素因数分解ができます。
```python
from sympy import factorint

n = 3362602097072036947975058801484711040036244906877808714143900753656859945755369896454903656439391683530132491538518973300445157894747422557004302869487905008045223413056375528770319769001696965600844347010988024107266768441700986518088355831616309583101788067443458302224322707818982932276937211018388268963687414453844724441554035558652321288875256410199958975425957027581907037085514454315745190613668680257665330995646190404022260757026997114204690539661841324247346705538470484269335978158744326265791407929642321388956220884949737731737038771869090323491374666227805543639577223908675421084689916059502015217116022853294099137595551535733525066402957489521985348064271655826695203349871985840161076884535626710846681222578537887458526028879024597779267766489072484984181236042922751836902135770752690653700198428179667937983131616950415720131782695345973559475727098389048506566414528218661291959257272713615406768350699619501283853236334130639661221333322570965872889840090807255819862129028731674246235941186791789807897189008750474948804988693461386171431194999450998226803832104599369818478491989685217301878551525825163360736365154012969922481092133842650397947946214752241889866216097390531577384474178804393688661204938086538463663518711085115798242672633847292212523807137386022585575703160296068229125494392415508368991355464192063465965101684791943349753212042644521337533375912443628646313933089346978279817735221059997706411528014987235334278781676567624023798424772280925774736853877700434346510488840607031128320161126034515265002650814693394170532066171024199666347149078785103816722463737729198713106305329598252521538704653889973368847090926058891636045140792243121221949645216243490635626265216600862901678972339835809086900605995331424712480381466321088727034649384106257815980080484354134788885957022185813227270918663281946408382925826079948107981983407774602123697736727466258653813068442644516945532706483527183559054017915918954140282873199169859083115286025250797083782212224470676973726033094004060731734877588720558386559387744486695087462049597948905552243703116429008797393483317156393631121692665700353726004661132347027890670355845898369339774054121267669056516925462191409525610845298992142866163749379209346653974832547697073906709507736110147514597784657043418134879600273386412400851754895003385984512621959742613335403930776486182173416921546388544968529281750380789123974347
factors = factorint(n)

print(factors)
```

AとBを素数とすると
出力結果が``{A: 1, B: 1}``となった場合
``n = A * B``
と求められます。

出力結果が以下のようになります。

```
{57987947860499744951440061673431162618454140824566514383322157867700120929035574871280327259703102490055924960343601557226165573782006055222324078737770321191495525844444060313512410749500338575066697229740902153060054697372848422304827105064113247311018643987646117376513014602888967685775948844353099944412474014862400956079113245673392960889572351865866728873740667748295222588374697653062227526796149775138392144074113626255378958163619797709706129546208370337966089550354304809733251614169919308706177117004278411036288320361867141681810978735088458315366013197793900431400930451286438222426881481247377333023581572271612137451049309730889939430892988897381349038299152837972737630831819444912116561561085810784878700630956323969152742630003526880817083411268278662484611476512730786147737800370783403975362708901292526161464733142655658812399244863788414858082902250446897413048746041646564086543751952166059633713458508296740763683793194764357826934090252522291608692146339836786550906723233188267517172292476860747798026318327043390665034660309174080478438397576117799436370516918309215353567933288005003924270034619774561826519558600252497313482063668535324899073208937302170415090465123205180376813: 1, 57987947860499744951440061673431162618454140824566514383322157867700120929035574871280327259703102490055924960343601557226165573782006055222324078737770321191495525844444060313512410749500338575066697229740902153060054697372848422304827105064113247311018643987646117376513014602888967685775948844353099944412474014862400956079113245673392960889572351865866728873740667748295222588374697653062227526796149775138392144074113626255378958163619797709706129546208370337966089550354304809733251614169919308706177117004278411036288320361867141681810978735088458315366013197793900431400930451286438222426881481247377333023581572271612137451049309730889939430892988897381349038299152837972737630831819444912116561561085810784878700630956323969152742630003526880817083411268278662484611476512730786147737800370783403975362708901292526161464733142655658812399244863788414858082902250446897413048746041646564086543751952166059633713458508296740763683793194764357826934090252522291608692146339836786550906723233188267517172292476860747798026318327043390665034660309174080478438397576117799436370516918309215353567933288005003924270034619774561826519558600252497313482063668535324899073208937302170415090465123296312167319: 1}
```

これでpとqが求められたため復号を行います。

```python
import sympy
import gmpy2
n = 3362602097072036947975058801484711040036244906877808714143900753656859945755369896454903656439391683530132491538518973300445157894747422557004302869487905008045223413056375528770319769001696965600844347010988024107266768441700986518088355831616309583101788067443458302224322707818982932276937211018388268963687414453844724441554035558652321288875256410199958975425957027581907037085514454315745190613668680257665330995646190404022260757026997114204690539661841324247346705538470484269335978158744326265791407929642321388956220884949737731737038771869090323491374666227805543639577223908675421084689916059502015217116022853294099137595551535733525066402957489521985348064271655826695203349871985840161076884535626710846681222578537887458526028879024597779267766489072484984181236042922751836902135770752690653700198428179667937983131616950415720131782695345973559475727098389048506566414528218661291959257272713615406768350699619501283853236334130639661221333322570965872889840090807255819862129028731674246235941186791789807897189008750474948804988693461386171431194999450998226803832104599369818478491989685217301878551525825163360736365154012969922481092133842650397947946214752241889866216097390531577384474178804393688661204938086538463663518711085115798242672633847292212523807137386022585575703160296068229125494392415508368991355464192063465965101684791943349753212042644521337533375912443628646313933089346978279817735221059997706411528014987235334278781676567624023798424772280925774736853877700434346510488840607031128320161126034515265002650814693394170532066171024199666347149078785103816722463737729198713106305329598252521538704653889973368847090926058891636045140792243121221949645216243490635626265216600862901678972339835809086900605995331424712480381466321088727034649384106257815980080484354134788885957022185813227270918663281946408382925826079948107981983407774602123697736727466258653813068442644516945532706483527183559054017915918954140282873199169859083115286025250797083782212224470676973726033094004060731734877588720558386559387744486695087462049597948905552243703116429008797393483317156393631121692665700353726004661132347027890670355845898369339774054121267669056516925462191409525610845298992142866163749379209346653974832547697073906709507736110147514597784657043418134879600273386412400851754895003385984512621959742613335403930776486182173416921546388544968529281750380789123974347
p = 57987947860499744951440061673431162618454140824566514383322157867700120929035574871280327259703102490055924960343601557226165573782006055222324078737770321191495525844444060313512410749500338575066697229740902153060054697372848422304827105064113247311018643987646117376513014602888967685775948844353099944412474014862400956079113245673392960889572351865866728873740667748295222588374697653062227526796149775138392144074113626255378958163619797709706129546208370337966089550354304809733251614169919308706177117004278411036288320361867141681810978735088458315366013197793900431400930451286438222426881481247377333023581572271612137451049309730889939430892988897381349038299152837972737630831819444912116561561085810784878700630956323969152742630003526880817083411268278662484611476512730786147737800370783403975362708901292526161464733142655658812399244863788414858082902250446897413048746041646564086543751952166059633713458508296740763683793194764357826934090252522291608692146339836786550906723233188267517172292476860747798026318327043390665034660309174080478438397576117799436370516918309215353567933288005003924270034619774561826519558600252497313482063668535324899073208937302170415090465123205180376813
q = n // p
e = 65537
l = (p-1)*(q-1)
d = gmpy2.invert(e,l)
c = 2333180888343805833564939610006643031517157833277370083055464650577372013852734542498999392155473154956136673392922069112479279399237349891928953232693686907380690191027302323223571745649722962898056188487877081403507619749005969254765876441007157248254948013910060580090149636651501976382149856254068785229320632213111020563334866158311510572292010502102346382679710504113896073051103376701224619851046420945056220342606391480928923224702612885929868959406095862797545279316616356809327721991643296695939171733622203977458182464861737071957293134378283217007223423049772066403718647591168980176620921219510541906000845139329475239793768099033551652137369064426389931223697687414643248863005292414689595966718345745345233905658403113679426305364670787815515670942956137806368332012333707718371489480894655986111708744297354653766310723973625445505010371838127554285425841983790304660758016062377409693744711069105474704458649817325596111668660136538529071936442595233891510262476278059845543688506701726184829540910201985965386552031171413461524187646107073901762832028265373884743471217441852847743985998227365049067430654656812912432903407077239899694524313455704407901998507826668993894662453090600555297683820241556118893114154578482690902218990062532836373369380047545333211837212899830404957154277497510215005191675424305903207608673759548132027601299093735830209278795897267863718698947230595680471470396410819118087338052048692461856900666824633975809125204232832813570777355588186733359709852309663932212443758100567757742649544650924538231563142179096309200876905546217865374429001815311583348478354704863856425714500635168578943714720702610618576277079575377880243116853595639623422208356925976738298893853309435007496395018751402360668773947442770855945457099890681978420157575402717285412800260540872369130804593990882982840891414445815897989438166119256257956603803062125322657625998741690536038741076708169069808181868633137393665953701670146912617987427124894544203632829017345038244611541212297379357578545094196216636125389026865911356439274848219901779963238019821512282329212909776242974427444169137339412877614424440587758325464112249818861906725340570469676017434630679624130262693830506049786039551438424128299941916893601748812909520622531425035952059057143768196953745201895050480435650360966486697767010878732544597427941419062010962346290021764686453064158211777770924705579922607958832623
m = pow(c, d, n)
decrypted_message = int(m).to_bytes((int(m).bit_length() + 7) // 8, "little").decode("utf-8")
print("Decrypted message:", decrypted_message)
```

``hscctf2024{S1mil4r_numb3r_1s_dang3rous}``

追記：今回、nは約2400桁で素因数分解しようにも難しいと感じた方がいると思います。
しかし、pとqが非常に似た値になるとフェルマー攻撃でnが素因数分解でき、またsympyでも
素因数分解が可能です。
フェルマー攻撃の解説はtnakagawaさんが詳しく解説しています。

https://qiita.com/tnakagawa/items/d87fd8459ec9e1ce6844

・・・・紙とペンで素因数分解できた?
なにそれ知らん・・・こわ・・・

### RSA_Hard
```
あーあ、数学の先生がRSA暗号の素数には気をつけろ気をつけろってうるさいから点検するか
このRSA暗号が破られるわけねーよな
異常ねえや
```

Easy同様に素因数分解しようとしてもできないようなので、ほかの方法を模索します。
ここで、問題文に「RSA暗号の素数には気をつけろ」と書かれているのに注目します。
つまり、RSA暗号のpもしくはqに有名な素数を入れてしまったのではないかと推測し
有名な素数を探します。
今回は第二ユークリッド数(クンマー数)から[ここ](https://oeis.org/A057705 "第二ユークリッド数一覧のサイト")に飛び

``19361386640700823163471425054312320082662897612571563761906962414215012369856637179096947335243680669607531475629148240284399976569``

を見つけます。

```python3
import sympy
import gmpy2
n = 179204381812271696595458353288210788371922229050780460931554025606071656732441605398342073415788445381076690059002540295496037402632699624508470728339904310662233713597325172124112253625989941216095743992470817346205853593270298356651329670454536946399847686754673338698584105766831777728956210388574223435334437801384637885726271673232343507728866002778752595805021932813583546503626189334196696905248635730071957305614312708095453463409948700850003398385571186514922637208291630860792142660013573062700382946664079670956214297930084447430497755841249037594440220128230680288666951222172184014302652239516452897596519433974308579306206603808624076602450089109464026480074681313921826368211959151141177202360542107715042394798768986711430580615668458819480150175410205374907705547941595610198634697331378653655089195891882608870650007444266756862868637868242084095447550639338529150488739322653144124447852640534085494133378372249566135846297716630989277407390535010458049324095467874773449318457716632776829664837970404208881710210067908537312644514267677113417173905066261479437069399778433245730503239944727607528263578354436269
p = 19361386640700823163471425054312320082662897612571563761906962414215012369856637179096947335243680669607531475629148240284399976569
q = n // p
e = 65537
l = (p-1)*(q-1)
d = gmpy2.invert(e,l)
c = 178923184378152317809616014183336358177644823302227529314052534837816955445920383925712518562798952714864368487768521723030172318275363861088759354472855203518021026730963546974218482490405874492770583972505754751979745124534675001604811757820481175490233578992985168248415159726475199788942414846074550258677779445024247584012492847824612313268105120661441422089999045869248074759509507038332319393506597267308731877763839305328815087859212203986451080591367636977902926690755738724755909382144538788743534710365488654405468169082853880966267685915406080034181909388707602405549191725295811679405109855469368482828977807058918245819976187065721478914213716725650328244138980077177068006535678245363663918311569044518566747752562518623981747505215758798745802053068220771351901572295079449509192756313940387095646741361716996666720332913992658059622217059785169920968399215007035402742896714022035412247785144990701505935835466081473020625390391695921395298161005257436054054300932262194645224611282962424128878584254939955557666406933585909197227692563461332707237662895648174906299420113080674214710771363201950703314567774431297
m = pow(c, d, n)
decrypted_message = int(m).to_bytes((int(m).bit_length() + 7) // 8, "little").decode("utf-8")
print("Decrypted message:", decrypted_message)
```

``hscctf2024{Be_4ware_of_F4mous_Pr1me}``

追記：この問題は有名な素数があるからEasyの方法で解けなくても有名な素数であれば
素因数分解できてしまうことを意図して作成しました。
うまく誘導できるヒントがなかったので悪問ですね・・・

### RSA_Nightmare
```
Error 404 : E is Not Found
```

RSA暗号においてeがないと復号ができない・・・と思うかもしれません。
逆手に取りましょう。eが原因で復号できてしまう脆弱性を探します。
ここで候補に挙がるのがLow Public Exponent Attackとwiener's attackの2つになります。

Low Public Exponent Attack
- eが小さいことを利用した脆弱性

wiener's attack
- eが大きいことを利用した脆弱性

ここで、仮にwiener's attackが正解の解法になってしまうとeが求められなくなり
(総当たりだとしてもかなり時間がかかるので)問題として成立しなくなってしまいます。
したがってLow Public Exponent Attackでeを小さい順から総当たりで求めます。
今回はe = 13の時に復号が可能です。

```python
import gmpy2

def int_to_bytes(x: int) -> bytes:
    return x.to_bytes((x.bit_length()+7)//8, 'little')


def LPA(c, e, n):
    while(True):
        m, b = gmpy2.iroot(c, e)
        if b:
            break
        else:
            c += n
    return int(m)


def main():
    n = 418927484311230766148150712412358479562598775340547469555761243854134150997303320705177126960140926247065301852881813734004392804924673875208328198917498785962134788704939456601676779845464460477949072273828032654836626476222554433201531091921837710307973124844151902545201460740954106914266073102953719369031361997405675903596710374205306816450268625788810502222661988123238530469015676772995794116558513332965236554314667046621775755507568385625850986462363766745622842498277119874384640853308798617031924447645454364729766712777981300406847208320112886127246230963679052267028231679048903422424450935495388518413081865257212431015787730170498345198473379281925661340033030515180737436271204859075366866845757012181190900025200079217023322765992783427284959125632179247705408062042893240082312209336689674490015336083960512171264289222997402535867506657863156165668334446506128680143254910952241966584389785080567140730218262228486343734917161398629850437295236672233862006049569019851321164208521482364069499164128874560296190312142888036882268339676433842080720046087937954160808245019972070649774637894586724225251993476472881068530825950499631963386545298982343920672686786519666173961850872111967002239164164192780399714931065914963572567823193956447463493986847954377642080879421636384637649142576857289224859607680119942986933045871002004678982436889909454712534520952065429837595158020412694986790175419485145005016898987116753622977091487278128177571798243676922952979928540559978688083682400098022631855652981514407234876317376778292195185297696465405566745131788747739191847439769615380611585404414464944418273440884557345428018264305209902937100358203510657985072317885697079282922238852190514206517659337755200745398399556465906450205101262792273176302149117560886772674615585691186387961469658680872764971318207883876738906137097501637711299769283851517062270427461279901777936259412676290614854664622748141049346280384833917049496036497343626575702715981354114125396418098606267401451068128634994839525837370147936292517595450920629209983280110334063668993750856975361794277408505753128147672906345131561368929684931131129247572031234147500514547318101304986291331919650677927777652385252905010057564780975918275060527868725267221233843469061924097481191245263134128093224708210211106704148568888996968747350798250056919193367100367763715216273948928348543959634148384731439559438163641990339950382353840788259563115973686362893094320086994860748297814801777141208086615147758142609882255610753663880612078090242090962414817634944607529493254660357130162131868273477368484120946350509607123911425283505731400712128384214785611143493583301954813874862706477665092038930686225584116598996581711783891104063384003067682245023177141247476729506646311053264432697986596162107771594697812620862986559660736278114036827216647355413576877979760073983661787388505626846562483848759623143619621873189274621268242824754623881311796784781928201986225978122953463915969512695594285592582784029529
    e = 13
    c = 62862746041048012293535276313544972641425651579048299686235705126932384257126228089332299298021426488615733843233465692911422098664142494548610536931739064229774417738151140425702887544259704598118744146575660989993159348267516391521825805519138146261220672921707048305021294166486324424344303930274655528510855768718036122821061072637158293914089844809846329312755446394673404735969254687295507919679008587614502837118532751078500920650631047538901622230953277211348806288162063750196980570231955412419335947627731900638735173301473749027331622597458550067032536533586237675671189267469812976119429621353572560373440076466228634162144847518332834261419275041540707824335631564084140400164953942508768688294607713817989982365191017661899524189221323804038127748136071924517878980635165021058569104774411442348586038795325710160815935427742108321764585232817545218150299512829980231380024208176410393399413323132793696827809955111183503141116505620114791642556774861926255084616225664568470617980928
    m = LPA(c, e, n)
    
    flag = int_to_bytes(m).decode().strip()
    print(flag)

if __name__ == '__main__':
    main()
```

``hscctf2024{B3_c4r3fu1_of_RSAs_e}``

## OSINT

OSINTとは、Open Source Intelligenceの略で、誰でもアクセスできる公開されている情報（ニュース記事、SNSの投稿、企業のウェブサイトなど）を収集し、分析して、何かを読み解こうとする活動です。
例えば、キーワード検索や画像検索、地理情報システム（GIS)といったツールを使い、特定の人物や場所に関する情報を集めることができます。

OSINTは、逃亡者の特定のように犯罪捜査に役立つ一方で、個人情報の漏洩やプライバシー侵害といった悪用される可能性も孕んでいます。
例えば、SNSの投稿から個人の行動パターンを特定し、不審な人物に情報を提供してしまうケースも考えられます。

OSINTを行う際には、個人情報保護法や著作権法など、関連する法律を遵守し、倫理的な観点から慎重に行うことが重要です。また、OSINTの技術は日々進化しているため、常に最新の知識を習得しておく必要があります。

:::note warn
Writeupを書く際に検索した日は2024年12月12日です。
日にちによってこの方法では出ない可能性があります。
:::

### The Scars of the Typhoon
```
aさんは災害ボランティアに向かった
ここは台風の被害を受けたらしい
水害が発生し、氾濫が起こるなど過去最大の被害を被った地域である。
ここはどこだろうか
なお、地域名は「●●県××市」または「●●県△△郡□□町」の形式で、漢字で答えてね
```

画像の下にある倒れている看板に``森町``と書かれているので

「”過去最大”　台風　水害　氾濫　*森町」と調べると``宮城県伊具郡丸森町``が出てくるのでこれが答えです。

``hscctf2024{宮城県伊具郡丸森町}``

別解：Googleレンズだけでも答えにたどり着いた・・・?

追記：写真が被災した場所なので掲載するのは控えました。

### Where is my friend ?

```
友人と待ち合わせをしたのだが写真の場所が分からない。
今いる場所を送ってもらったから何とか特定したい。
写真の場所の郵便番号7ケタ（ハイフンなし）で答えてね
```

![Where_is_my_friend.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/d9626ff7-3c59-d1cb-b21d-d868046fdd30.jpeg)

Googleレンズで検索を行うと相模原にあるアルファリンクの施設であることがわかります。

そこから「アルファリンク相模原」とGooglemapで調べると住所(``252-0244``)が出てくるのでこれが答えです。

``hscctf2024{2520244}``

### 画像からフラグ探し
```
二俣川のとある学校の帰りに撮った写真らしい。この写真の後ろにある交番の郵便番号を答えよう！
答え方はhscctf{〇〇〇-〇〇〇〇}（ハイフンつき）と入力してね！
```

![unnamed_Image_Enhancer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/3ed3ce78-2f5a-0f0a-8468-48b57cde8f7e.jpeg)

画像の真ん中をよく見ると「ポリテクセンター」と書かれている。
そこから「ポリテクセンター」とGooglemapで調べるとポリテクセンター周辺にある交番は1つしかないので
その交番の住所が答えです。

![画像からフラグ探し.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/67d091e7-e3b2-168d-60f0-1f64ad2725b4.png)

``hscctf2024{241-0824}``

追記：最初見たとき「ホリアクセンター」って見えた・・・

### 寄り道！そして迷子！
```
真っ直ぐ帰らなくてもいいじゃない。たまには迷ってもいいじゃない。人間だもの
※フラグ形式hscctf2024{公園名}
入力例　答えが　スカイパーク　の場合　hscctf2024{sukaipaku}　のように
ヘボン式ローマ表記で入力してください。
```

![Yorimiti_Main.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/4adec904-06c1-93f8-daae-be7a15d00fcd.jpeg)

写真に写っている浮き輪に「パシフィコ」「横浜市港南局」と書かれているのが見えるので
パシフィコ横浜に近い場所で写真が撮られていることが推測されます。
そこからGooglemap、Googleレンズを使い以下の2つの条件を満たす場所を探します。
- パシフィコ横浜に近い
- Googlemapの検索結果にある

この2つの条件を満たす場所は「臨港パーク」のみなのでこれが答えです。

``hscctf2024{rinkopaku}``

## Rev
### BreakingFull
```
あなたの会社に凄腕のプログラマーがおり、たくさんのプログラムを暗号化して残しました。
しかしこのプログラマーは会社を辞めて海外に移住したため、今となっては復旧が困難になりました。
あなたの会社を助けるために、このプログラマーが作ったプログラムをハッキングしてみよう。
```

Ghidraを使って逆コンパイルを行うとmain関数はvulnerable_function関数を呼び出していることがわかります。
vulnerable_function関数の中身は以下の通りとなっています。

![Breakingfull_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/399e3ef6-70b1-8159-e5b8-5646dcc1c73c.png)

この関数は以下の手順で動いています。
1. 長さ1024文字の配列を作る
2. 入力された文字列を配列に入れる
3_A. 入力された文字列の長さが1024文字未満の場合はその文字列をそのまま書き込む
3_B. 入力された文字列の長さが1024文字以上の場合はprint_flag関数を呼び出す

したがって実行した際に1024文字以上の文字列を入れればflagが獲得できそうです。

ただ実行するにはLinuxが必要で少し面倒くさいのでprint_flag関数の中身を見ます。

![Breakingfull_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/90265b0f-1549-1adc-b369-9a5146eabbc6.png)

0x68 = h
0x73 = s
99 = c
0x74 = t
0x66 = f

つまり、上から順番にflagが書かれているのではないか?と仮定し組み立てるとflagが出来上がります。

``hscctf2024{long_dis_luv4er}``

### 汚れを取ろう！

```
写真にフラッグを書いたら汚れがついて見えなくなってしまったよ。
汚れを取って写真を見えるようにしてくれるかい?汚れる前の写真も一緒に置いておくね。
```

バイナリエディタを使います。ここではstirlingを使って解説します。

![汚れを取ろう_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/2521b4c8-f1bb-6116-6c72-07366ce8fc43.png)

yogoreの部分をflagなしの部分からコピーアンドペーストして
編集することで汚れが取れたことになります。

![汚れを取ろう_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/be1ca802-2798-1469-a43a-21843e953dc7.png)

ここで編集した汚れたIMGを開くとflagを獲得することができます。

![汚れを取ろう_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/7ba8674b-95b1-f43c-c990-c43bbaa4e977.png)

``hscctf2024{D1r7y_B1n4ry}``

### 秘密のワード
```
秘密は誰にも知られたくない。
自分の好きなワードと番号だけは。。。
```

URLにアクセスするとこのような画面が出てきます。

![secret_word_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/f697b972-7f47-4401-0bb2-91db37be9b60.png)

試しに何か入れてみます。

![secret_word_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/873d1d2d-4a69-4fb4-8f98-15a0221663c1.png)

「Not FLAG!」とでてきました。どんな仕組みなのか開発者ツールで見てましょう。

![secret_word_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/75d46cc7-f79d-758b-d5a7-6c8bcc53ff1a.png)

問題はhtmlとjavascript、cssで動いているようです。script.jsとget.jsが怪しいので見てみます。

script.js
```javascript
// 入力チェック
function checkFlag() {
    // 各入力フィールドを取得
    // ワード
    var word = document.getElementById('word').value.trim();
    //  好きな番号
    var num = Array.from(document.querySelectorAll('input[name="num"]:checked')).map(CheckBoxOb => CheckBoxOb.value);

    // 判定
    if(isNameCorrect(word) && isNumberCorrect(num)){
        alert(getFLAG(true));
    }else{
        alert(getFLAG(false));
    }
}

// ワードのチェック
function isNameCorrect(word){
    check = false;    
    correctWord = atob("cGFydGljaXBhbnQ=");

    if (word === correctWord) {
        check = true;
    }

    return check;
}


// 番号のチェック
function isNumberCorrect(num){
    check = true;
    //　入力できる番号List
    allNumbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
    // 正解の番号List

function _0x10f2(){var _0x194bb0=['92pzbFzk','906645guJAqY','596104aMcqlf','203388Zuzcsk','82180pXLaqq','63AnHWys','22pWdCnn','77KppIKi','318410kpLerb','2893656lOkUsq','1629790JWAqao','5AaybRa'];_0x10f2=function(){return _0x194bb0;};return _0x10f2();}function _0x5c36(_0x119ecf,_0x445500){var _0x4c932a=_0x10f2();return _0x5c36=function(_0x33e5cb,_0xf826fe){_0x33e5cb=_0x33e5cb-(-0x257b+-0x805*0x4+-0x4719*-0x1);var _0x3be7c9=_0x4c932a[_0x33e5cb];return _0x3be7c9;},_0x5c36(_0x119ecf,_0x445500);}(function(_0x33486d,_0x136e9f){var _0x421490={_0x3ca822:0x18c,_0xc05361:0x18e,_0x5dcc0f:0x18d,_0x5a00db:0x191,_0x410437:0x190,_0x535054:0x194,_0x59bd04:0x18f,_0x29ac98:0x18b,_0x39892c:0x193,_0x3c8858:0x18a},_0xc6bb17=_0x5c36,_0x209486=_0x33486d();while(!![]){try{var _0x44ca59=parseInt(_0xc6bb17(_0x421490._0x3ca822))/(0x197+-0x384+0x1ee)*(-parseInt(_0xc6bb17(0x195))/(0x8*0x224+0x1*0x7f+-0x9*0x1f5))+parseInt(_0xc6bb17(_0x421490._0xc05361))/(0x706+0x577*-0x1+0x42*-0x6)+parseInt(_0xc6bb17(_0x421490._0x5dcc0f))/(-0x447+-0x1055+0x14a0)*(-parseInt(_0xc6bb17(_0x421490._0x5a00db))/(0x24d6+0x24ca+-0x23b*0x21))+parseInt(_0xc6bb17(_0x421490._0x410437))/(0x6*-0x2a7+-0x17a*-0x13+0x21*-0x5e)*(parseInt(_0xc6bb17(_0x421490._0x535054))/(0x1f83+-0xc*-0x89+-0x25e8))+-parseInt(_0xc6bb17(_0x421490._0x59bd04))/(0x108f*-0x1+0x1*-0x18b9+0x2950)*(-parseInt(_0xc6bb17(0x192))/(-0x1c*-0x29+-0x1*-0x62a+-0xa9d))+-parseInt(_0xc6bb17(_0x421490._0x29ac98))/(0x2402+0x1895+-0x3*0x142f)*(-parseInt(_0xc6bb17(_0x421490._0x39892c))/(-0x1*0x14fd+0x168*0x19+-0xe20))+parseInt(_0xc6bb17(_0x421490._0x3c8858))/(-0x7d*-0x1+-0x4ad*-0x5+-0xbe9*0x2);if(_0x44ca59===_0x136e9f)break;else _0x209486['push'](_0x209486['shift']());}catch(_0x4a99d0){_0x209486['push'](_0x209486['shift']());}}}(_0x10f2,-0x41313*-0x1+-0x2a897+0x79523),correctNumbers=['3','5','6','9']);


    //  サイズの確認
    if(num.length === correctNumbers.length){
        // 中身の確認
        for(i = 0; i < num.length; i++){
            if(num[i] !== correctNumbers[i]){
                check = false;
                break;
            }
        }
    }else{
        check = false;
    }
    
    return check;
}

```

get.js
```javascript
function getFLAG(bool){
// .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .-----------------.
var flag=("" + Math)[11]+"sc"+"c"+"f"+String(70*30-76)+("");
flag=flag+'{';
//| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
//| |      __      | || |    _______   | || |     ______   | || |     _____    | || |     _____    | || |              | || |      __      | || |  _______     | || |  _________   | || |              | || |  ________    | || |  _________   | || |    _______   | || |     _____    | || |    ______    | || | ____  _____  | |
flag=flag+("false"[1]+"false"[3]+"[object Object]"[5]+"undefined"[5]+"undefined"[5]).toUpperCase();
//| |     /  \     | || |   /  ___  |  | || |   .' ___  |  | || |    |_   _|   | || |    |_   _|   | || |              | || |     /  \     | || | |_   __ \    | || | |  _   _  |  | || |              | || | |_   ___ `.  | || | |_   ___  |  | || |   /  ___  |  | || |    |_   _|   | || |  .' ___  |   | || ||_   \|_   _| | |
flag=flag+"-"+(("" + ![])[1]).toUpperCase()+"true"[1]+"t"+"-"+"D"+("" + !{}.a)[3]+"false"[3]+"undefined"[5]+("" + String)[14]+"undefined"[1];
//| |    / /\ \    | || |  |  (__ \_|  | || |  / .'   \_|  | || |      | |     | || |      | |     | || |    ______    | || |    / /\ \    | || |   | |__) |   | || | |_/ | | \_|  | || |    ______    | || |   | |   `. \ | || |   | |_  \_|  | || |  |  (__ \_|  | || |      | |     | || | / .'   \_|   | || |  |   \ | |   | |

flag=flag+'}';
//| |   / ____ \   | || |   '.___`-.   | || |  | |         | || |      | |     | || |      | |     | || |   |______|   | || |   / ____ \   | || |   |  __ /    | || |     | |      | || |   |______|   | || |   | |    | | | || |   |  _|  _   | || |   '.___`-.   | || |      | |     | || | | |    ____  | || |  | |\ \| |   | |

var art=0;
//| | _/ /    \ \_ | || |  |`\____) |  | || |  \ `.___.'\  | || |     _| |_    | || |     _| |_    | || |              | || | _/ /    \ \_ | || |  _| |  \ \_  | || |    _| |_     | || |              | || |  _| |___.' / | || |  _| |___/ |  | || |  |`\____) |  | || |     _| |_    | || | \ `.___]  _| | || | _| |_\   |_  | |


var ng="Not FLAG!";
//| ||____|  |____|| || |  |_______.'  | || |   `._____.'  | || |    |_____|   | || |    |_____|   | || |              | || ||____|  |____|| || | |____| |___| | || |   |_____|    | || |              | || | |________.'  | || | |_________|  | || |  |_______.'  | || |    |_____|   | || |  `._____.'   | || ||_____|\____| | |
var answer;
//| |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | |

if (bool){answer=flag;}else{answer=ng;}
//| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |

return answer;
}

// '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'

```
...get.jsのコメントアウトがたくさん書かれていますが、これでは何を書いているかわかりません。
コメントアウトのみを表示してみます。

```javascript
// .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .-----------------.
//| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
//| |      __      | || |    _______   | || |     ______   | || |     _____    | || |     _____    | || |              | || |      __      | || |  _______     | || |  _________   | || |              | || |  ________    | || |  _________   | || |    _______   | || |     _____    | || |    ______    | || | ____  _____  | |
//| |     /  \     | || |   /  ___  |  | || |   .' ___  |  | || |    |_   _|   | || |    |_   _|   | || |              | || |     /  \     | || | |_   __ \    | || | |  _   _  |  | || |              | || | |_   ___ `.  | || | |_   ___  |  | || |   /  ___  |  | || |    |_   _|   | || |  .' ___  |   | || ||_   \|_   _| | |
//| |    / /\ \    | || |  |  (__ \_|  | || |  / .'   \_|  | || |      | |     | || |      | |     | || |    ______    | || |    / /\ \    | || |   | |__) |   | || | |_/ | | \_|  | || |    ______    | || |   | |   `. \ | || |   | |_  \_|  | || |  |  (__ \_|  | || |      | |     | || | / .'   \_|   | || |  |   \ | |   | |
//| |   / ____ \   | || |   '.___`-.   | || |  | |         | || |      | |     | || |      | |     | || |   |______|   | || |   / ____ \   | || |   |  __ /    | || |     | |      | || |   |______|   | || |   | |    | | | || |   |  _|  _   | || |   '.___`-.   | || |      | |     | || | | |    ____  | || |  | |\ \| |   | |
//| | _/ /    \ \_ | || |  |`\____) |  | || |  \ `.___.'\  | || |     _| |_    | || |     _| |_    | || |              | || | _/ /    \ \_ | || |  _| |  \ \_  | || |    _| |_     | || |              | || |  _| |___.' / | || |  _| |___/ |  | || |  |`\____) |  | || |     _| |_    | || | \ `.___]  _| | || | _| |_\   |_  | |
//| ||____|  |____|| || |  |_______.'  | || |   `._____.'  | || |    |_____|   | || |    |_____|   | || |              | || ||____|  |____|| || | |____| |___| | || |   |_____|    | || |              | || | |________.'  | || | |_________|  | || |  |_______.'  | || |    |_____|   | || |  `._____.'   | || ||_____|\____| | |
//| |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | || |              | |
//| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
// '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'
```
文字列が出てきました。

``hscctf2024{ASCII-Art-Design}``

追記：あれ?大文字小文字大丈夫なのかこれ?

#### 別解
ワード：participant
あなたの好きな番号のチェックボックス：3、5、6、9

![secret_word_Extra.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/1ee79484-5fb6-cada-e11c-41c798df646d.png)


## Web

### A Lesson in Insecurity
```
企業に売り込むために文章を書く練習をする学生もいます。
彼らは JWT を使用して自分の権利を確認しますが、記述内容は非常に弱いため
簡単にバイパスされてしまいます。
```

アクセスするとこのような画面が出てきます。

![A_Lesson_in_Insecurity_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/445fac7b-9d9f-e8ca-ed19-9f424386bfa8.png)

Guest Pageにアクセスしてみるとこのような画面が出てきて、Adminページに行けと言われます。
開発者ツールのCookieを見るとJWTのトークンが生成されているのがわかります。

![A_Lesson_in_Insecurity_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/6ffb7be4-feb2-7e48-f420-0a946dce9579.png)

では試しにAdminページへ行ってみましょう。

![A_Lesson_in_Insecurity_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/2560353b-0efc-932a-cd91-9f887506db81.png)

Adminではないため、アクセス拒否されてしまいました。
ここでCyberChefを使ってJWTのdecodeを行います。

![A_Lesson_in_Insecurity_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/39f5f476-7397-b810-e1de-682be8e7ccc5.png)

ここからroleがguestなのでadminに変えたらいけるのではないか?と推測します。

JWTを生成します。この時Privete/Secret Keyがなくても問題ないアルゴリズムは「none」のみです。

![A_Lesson_in_Insecurity_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/14a611d5-80ef-73e2-7201-ee179321bedf.png)

Cookieを書き換えて再読み込みを行うとflagが獲得できます。

![A_Lesson_in_Insecurity_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/f2170bf1-d7b2-fb77-6d67-bad6b448800a.png)

``hscctf2024{unverified_jwt_auth_student_project_leaves_critical_security_hole_for_easy_hack}``

JWT（JSON Web Token）は、Webアプリケーションにおける
認証・認可に広く利用されるトークン形式です。

JWTは、ヘッダー、ペイロード、署名という3つの部分で構成されています。

ヘッダー: トークンのタイプやアルゴリズムなどを記述
ペイロード: ユーザーのID、権限など、アプリケーションで必要な情報をJSON形式で記述
署名: ヘッダーとペイロードの整合性を確認するための署名

このヘッダーのアルゴリズムの部分をうまく書き換え、アルゴリズムを「none」にすると
どのようにして認証しているかわからなくても不正にアクセスできてしまう問題があります。

### Break Through the Login Wall!
```
ログインパスワードを忘れてしまった…何が何でもログインしてやる
```

アクセスするとこのようなログイン画面が出てきます。

![Break_Through_the_Login_Wall_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/8e24807c-5f76-32f8-fb4e-5c166c354dc2.png)

試しにユーザー名「admin」、パスワード「password」と入力してログインしてみましょう。

![Break_Through_the_Login_Wall_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/99dd610d-edfa-870c-0cdc-79d6246d374e.png)

ログインに失敗したようです。問題文に「何が何でもログインしてやる」と書いているので
ユーザー名とパスワードを知らない状態でもログインできる方法があるようです。
ここで試しにユーザー名を「I'm admin」のように記号を含めてログインを試みます。

![Break_Through_the_Login_Wall_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/fabd4eeb-cf63-6744-0ac2-716cb654582c.png)

エラーが出てきました。どうやらデータベースはSQLを使っているようです。
ここでSQLインジェクションができるのではないかと推測します。

ユーザ名「admin」パスワード「1' or 1 = 1;--」と入力してログインを試みます。

![Break_Through_the_Login_Wall_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/8b73966b-1b04-ad48-165b-63350f583f4d.png)

ログインに成功してflag獲得です。

``hscctf2024{SQLinjectionhuckweb}``

追記：SQLインジェクションとは、Webサイトやアプリケーションの脆弱性を悪用し
データベースを不正に操作する攻撃手法の一つです。
ユーザがSQL文の一部を入力欄に入れることでデータベース内の情報を盗み出したり
改ざんすることが可能になります。

例えばこのようなSQL文があるとします。

```sql
SELECT * FROM users WHERE username = 'admin' AND password = 'password';
```

このときusersのデータベースの中から``usernameが「admin」``かつ``passwordが「password」``が成立する
ものを探し出してほしいという命令です。
では、``usernameが「admin」``かつ``passwordが「1' or 1 = 1;--」``だとどのようになるのでしょうか?

```sql
SELECT * FROM users WHERE username = 'admin' AND password = '1' or 1 = 1;--';
```

このときusersのデータベースの中から``usernameが「admin」``かつ
``passwordが「password」``が成立するものを探し出す、
もしくは``1=1``が成り立つものを探し出してほしいという命令です。

``1 = 1``は常に成り立つのでusersのデータベースすべてに当てはまります。
したがって、今回の問題でユーザー名とパスワードがわからなくてもログインできてしまいます。

### ChatPHP4o

```
あのChatPHPが帰ってきた！　ぜひ質問してみよう！
```

アクセスするとこのような画面が出てきます。

![ChatPHP_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/c637ee32-b5da-b3e1-2498-c04e02c9dda0.png)

cheatできるの?本当に?

![ChatPHP_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/4d44ae90-d42c-ecbc-1386-cb9d58bdc29d.png)

ポチッ

![ChatPHP_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/14f05ee9-7d3a-2cb2-d517-bd3e778c9bbd.png)

~~そりゃそうだろ~~
「フラグ」では答えを教えてくれなさそうなので
「フラグ」を「flag」にしてflagが何か聞いてみましょう。

![ChatPHP_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/3aad770f-8ea2-64a9-fe13-548cf9c5446e.png)

ポチッ

![ChatPHP_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/aed5c4ed-30b6-e2f3-c636-41d8b5a6a904.png)

flag獲得です。

``hscctf2024{This_is_not_chatGPT}``

追記：ChatGPT...?

### Confusion

```
ある会社はシェル呼び出しを防ぐプログラムを作成しましたが、
そのプログラマーは技術コンペに参加する予定だったので急いで実行しようとしています。
プロのハッカーであれば、簡単に実行できてしまうかも？
```

アクセスするとこのような画面が出てきます。

![Confusion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/f070bd7e-52d9-6525-6958-63e40ac14c8e.png)

英文を見てみると
「写真をアップロードしてね。あ、でもセキュリティチェックがあるから写真でPHPコードをアップロードして脆弱性を突こうとしても意味ないよ」(雑な翻訳)
と言っているようです。

**本当かなぁ?**

怪しいですね。写真にPHPコードを入れて実行してみましょう。

ペイントでpngファイルを作った後にメモ帳で開いてこのように書き換え保存します。

![Confusion_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/0d4dc702-18c1-fa16-3b9c-cd8cdade676a.png)

アップロードするとこのような画面になります。

![Confusion_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/7e8dae9b-3b09-2ca2-84bd-d4da43a583c2.png)

今回アップロードしたファイルが``File-6768c607c53da3.15061718.png``なので、
``index.php``を``var/www/uploads/File-6768c607c53da3.15061718.png%3Foo.php``
に書き換えアクセスします。

![Confusion_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/86e2b185-cd1f-b5b4-965a-cf1dabc571fa.png)

lsコマンドが出てきていますね。明らかに怪しいファイル(``flag_I_l0_v_E.txt``)があるので
同じ手順で画像ファイルを使って開いてみましょう。今度は以下のように書き換えます。

![Confusion_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/0f4769e8-b67e-181c-3a24-d028e1e2f16f.png)

アップロードします。今回は``File-6768c92b052d48.83292610.png``としてアップロードされたので``index.php``を``var/www/uploads/File-6768c92b052d48.83292610.png%3Foo.php``
に書き換えアクセスします。

![Confusion_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/cd203aa0-1f1a-b47f-60cf-58ef72e7255f.png)

**なにこれ**

怪しいファイルの中身はこのようになっています。

``11010000111001101100011011000110111010001100110001100100011000000110 01000110100011110110110000101101101011000100011000101110100011010010 11011110110111001011111011101100111001101011111011100000111001000110 00001110100011001010110001101110100011010010110111101101110011111010 QmluYXJ5JlpfZXJvU2hpZnRSaWdodA==``

後ろに``=``があるからBase64を疑いたいところですがこれだと前半の数字を説明することができません。

バイナリで何かいじる必要があるのでしょうか?CyberChefを使ってFrom Binaryを選択してみます。

![Confusion_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/302496f6-f7b6-1c6f-174c-61e1344851f6.png)

どうやらバイナリから変換したときに明らかに大きな値が出てきてしまったようです。
ビットを右に1つシフトして値を小さくみましょう。

![Confusion_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/1617b246-ddd7-8704-1dc0-404c7439a546.png)

``hscctf2024{amb1tion_vs_pr0tection}``

追記：正直解説できているか怪しいので、詳しくはこちらをご覧ください。

https://blog.orange.tw/posts/2024-08-confusion-attacks-en/

### え？押せない？
```
え？なにこれ？押せない…
どうすればいいの？
```

アクセスするとこのような画面が出てきます。

![I_cant_push_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/d9556f95-30ab-bd14-293c-1e5dad0bb51c.png)

開発者ツールを開k.....おや?どうやらF12キーが使えないようです。
開発者ツールを別の方法で開きましょう。

![I_cant_push_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/20e36272-5048-183d-e0fc-b37b86936bce.png)

右クリックで検証を押すと開発者ツールが出てきます。

![I_cant_push_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/fcd20245-3ffe-216c-2bf7-c31b0c76fbde.png)

htmlの中身を見てみるとencryptedFlagがあるのでこれが暗号化されたflagだと推測ができます。

最後の部分に「=」があるのでBase64で暗号化されているのではないかと推測します。

![I_cant_push_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/0ae5567b-2449-2ec1-4a5f-5ea3c7b2f2f7.png)

``hscctf2024{C0ngratu1ati0ns!}``

別解：コンソールで``decoder()``を実行してしまえばもっと簡単にできます。

![I_cant_push_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/259e4523-8da1-123d-cec4-8d7272d4ca5c.png)

追記：この問題の中にこのようなものがあったと思いますがこれはAA(アスキーアート)といいます。

![I_cant_push_EX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/42f274e1-aa24-74a2-9d13-47d4ed55751c.png)

## Misc
### Elementary, my dear Watson.
```
彼でも見たことのない暗号だそうだ。でも彼は簡単に解いてしまった。
見たことはなくても手法はほぼ変わらないらしい。さすがだね。
From your faithful friend.
ちなみにすべて小文字でいいんだって。
```

![Crypto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/a4651669-8b33-2b5e-b8e6-96ba82497529.png)

問題文からシャーロックホームズが推測でき、写真にある旗から「踊る人形」に似た暗号ではないかと推測されます。したがって踊る人形の暗号の答えを利用する必要があります。

踊る人形の暗号の答えは以下のようになっています。

AM HERE ABE SLANEY
AT ELRIGES
COME ELSIE
NEVER
ELSIE PREPARE TO MEET THY GOD
COME HERE AT ONCE

旗がある場所は句読点を意味しています。暗号の4行目を見ると``AM HERE ABE SLANEY``と全く同じ
句読点の場所にあることがわかります。手法がほぼ変わらないので、4行目は``am here abe slaney``になります。問題文からすべて小文字指定されているのを忘れずに。

4行目を参考にして他の行を解読してみます。

```
?he re??rn ?? sherl??? h?lmes
elemen?ary my ?ear ?a?s?n
???e re?e??es le??er
am here abe slaney
?ey ?s els?e\_?e?\_rea?y\_??\_mee?\_y??r\_???
```

問題文より2行目は``elementary my dear watson``であることが推測されます。

2行目を参考にしてほかの行を解読してみます。

```
the ret?rn o? sherlo?? holmes
elementary my dear watson
w??e re?e??es letter
am here abe slaney
?ey ?s els?e\_?et\_ready\_to\_meet\_yo?r\_?od
```

ここからは単語を推測して文章を完成させます。1行目は
``the return of sherlock holmes``より

```
the return of sherlock holmes
elementary my dear watson
w??e rece??es letter
am here abe slaney
key ?s els?e\_?et\_ready\_to\_meet\_your\_?od
```

4行目は``ELSIE PREPARE TO MEET THY GOD``から

```
the return of sherlock holmes
elementary my dear watson
wi?e recei?es letter
am here abe slaney
key is elsie\_get\_ready\_to\_meet\_your\_god
```

これでflagの完成です。

``hscctf2024{elsie_get_ready_to_meet_your_god}``

追記：暗号化前の文章(推測)

```
the return of sherlock holmes
elementary my dear watson
wife receives letter
am here abe slaney
key is elsie\_get\_ready\_to\_meet\_your\_god
```

### Goorugle
```
ぐるぐる渦巻くフラッグ、果たして君は戻せる？
```

画像が渦巻いてしまっています。どうにかして戻したい・・・

![guruguru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/3115f8ca-274d-2ca4-af01-f6d7844779c8.png)

``画像　渦巻補正``と検索すると以下のようなサイトが出てきます。

https://www.bannerkoubou.com/photoeditor/whirlpool/

ここで元に戻してみましょう。元に戻すには左右反転する必要があります。

左右反転はペイントでできます。

![guruguru_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/f0a37cb0-91da-34a2-040b-ce0890b705c8.png)

左右反転できたのであとは渦巻補正を行います。

![guruguru_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/14133784-c7e0-12eb-47d8-99fb138f7f8e.png)

設定で強さを変更できるので読めるようになるまで強さを調節します。
10がおすすめです。

![guruguru_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/0b63340c-d149-04f1-bf20-22a7049a9aae.png)

読めるようになりましたが左右反転してしまってます。ペイントでもう一度左右反転しましょう。

![guruguru_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/c5dbf1b5-9f70-64c9-b883-09554abe773b.png)

flagの文字が読めるようになりました。

``hscctf2024{6uru6ruu_m4w4ru}``

### where is here ?
```
最近アニメの聖地巡礼であるところに行ったときに撮った写真だよ。
どこか分かるかな？施設名で答えてね。
```

とりあえずpdfが怪しいですが開きま....

![Where_is_here_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/a4f59152-e5cd-1c53-990f-0c5482c08edb.png)

開けませんでした。この問題は写真の場所を特定するOSINTの問題ではなく、
壊れたpdfの写真をどうにかしてみる方法はないか、という問題です。

ファイルの形式をどうにかして特定しましょう。こちらのサイトで特定が可能です。

https://develop.tools/file-info/

![Where_is_here_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/7335228b-2058-cc90-7d86-581661b35e9c.png)

zip形式だとわかったのでzip形式にして中身を開きます。

![Where_is_here_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/2804d22a-0cf0-bc89-7466-d2d4fc279d51.png)

フォルダの中にpptフォルダがあります。pptはパワーポイントの拡張子なのでは?と推測し、
zip形式をppt形式に変更後、開きます。

![Where_is_here_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/67c43dc3-c0c2-cb84-d271-f2adc943c134.png)

なぜか写真の後ろが黒いですが開くことができました。パワーポイントでは編集権限を持っていれば写真の編集ができるので試しに写真を取り除いてみます。

![Where_is_here_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/101bff6e-b811-c203-1b73-aa93087a7f9e.png)

``hscctf2024{ふもとっぱらキャンプ場}``

追記：ふもとっぱらキャンプ場はアニメ「ゆるキャン△」の聖地として知られています。

別解：Linuxのfileコマンドを使うと・・・

![Where_is_here_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/09bdda47-872d-1b19-6e7f-67f32e7c142e.png)

### あなたは猫が欲しくなる！

```
可愛い猫の動画を撮影しました。(cat_240.mp4)
しかし、怪しい何か（フラグ）が紛れ込んでしまいました。
皆さんは見つける事が出来るかなぁ？
```

一瞬だけflagが見えますがコマ送りしないとflagを特定することができません。
このサイトを使ってコマ送りにし、flagを特定します。

https://whythetrick.io/ja/fbf-player-ja/

![you_want_cats_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/09ce6657-a7c1-6494-26dd-82ecfa3c4114.png)

``hscctf2024{cat_file}``

別解：動体視力でflagを特定する

別解2：反射神経でflagが出ているときに一時停止する(私はこっちでやりました。)

### ちぎれた写真

```
大事な写真が３つにちぎれてしまいました。
何とか修復出来ないでしょうか？
皆さんなら必ず出来ると信じています。「やれば出来る！」
```

flagのファイルが3つに分裂してしまっているようです。

修復ということはつなげる必要がありそうです。Linuxではcat、Windowsではcopyコマンドでできます。

#### 解法1：Linux
```
cat head body tail > flag.jpg
```

#### 解法2：Windows
```
copy /b head.jpg + body + tail flag.jpg
```

つなげるのに成功するとこのような画像が出てきます。

![three_divided_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/2155ea0f-e7c8-2549-62a5-88e04c7540b6.jpeg)

``hscctf2024{tree-divide}``

### フラグRPG

```
この世界には、「世界で一番美しいフラグ」というものがあります。
このフラグは長年、国王が厳重に管理していましたが、
魔王がセキュリティの脆弱性を突いてフラグを盗んでいってしまいました。
勇者であるあなたは、国王から「魔王を倒してあの美しいフラグを取り戻してほしい」と頼まれました。
魔王を倒して世界で一番美しいフラグを取り戻そう！
```

![Flag_RPG_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/0bca648d-45cf-da35-4e03-2a4e4a90fd07.png)

~~フラグ盗まれただけで国が滅ぶほど貧弱な国なのか?~~

少し攻略すると途中でヒントのようなものがあります。

![Flag_RPG_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/583ed560-02fd-1318-1dd8-1aa00fbab64b.png)

なるほど。どうやらこのゲームはハッシュ値を使って
セーブデータを確認しているのではないかと推測されます。

セーブデータの場所は``C:\Users\(ユーザー名)\AppData\Roaming\FlagRpg``にあるので開くと
いかにもセーブデータっぽい``save``ファイルと``save.json``ファイルを開きます。

![Flag_RPG_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/29d6179f-7b9b-6ed6-c17e-3094266d3957.png)

``save``ファイルはハッシュ値ではないかと推測されます。
CyberChefで調べると``SHA-256``で処理されていることがわかります。

![Flag_RPG_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/a7d184be-cb73-19c0-0e42-868b312d6155.png)

ここで値を改ざんしてSHA-256の部分を``save``ファイル、原文を``save.json``ファイルに保存します。
その後、セーブデータをロードするとこのように値の改ざんに成功します。

![Flag_RPG_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/2373339b-f086-9acd-c930-cbdc758b3661.png)

ラスボス戦です。

![Flag_RPG_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/51bf7d93-5be0-2d42-d0d1-799ae248ce1e.png)

~~普通にラスボスのHP高いな・・・・~~

![Flag_RPG_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/6ba64cf7-800b-fa37-4636-d787364f2f2d.png)

~~公式CDのシャトルランは247回までしかないようです。いったい何者なんだこの魔王・・・~~

ラスボスを攻略すると``フラグを確認する``が新しく追加されているので確認します。

![Flag_RPG_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/e30f37e9-3eef-12ad-ebf3-70ddbbf94d2c.png)

flag獲得です。

![Flag_RPG_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/3802b200-b8b3-82a2-3e4c-75c362c6a846.png)

``hscctf2024{the_m0st_b3autifu1_fIag_in_th3_w0rld}``

別解：Cheat Engineを使って攻撃力と防御力を改ざんすると・・・?

### わかるかなセキュリティ用語2024

```
この前いただいたflagは大事にロッカーの中にしまっておいたよ。
ロッカーの鍵を開けるときには画像のクロスワードを解いて、
①～⑦の数字に当てはまる文字を下記のように並べ替えてみてね。
hscctf2024{①④③⑤①②②⑦⑥}
なお、縦横それぞれのかぎに入る文字はすべてアルファベット大文字が入るよ。
分からない用語はインターネットで調べてもOKだよ！
```

![security_word_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/0eb8c6cd-6ac4-048f-7437-a44b51ff4d71.png)

答え

縦のカギ

1. VPN
Virtual Private Networkの略。 NordVPNが一例として挙げられますが、
中にはセキュリティソフトの中にVPNが含まれているものもあります。

2. FIREWALL

3. GDPR
こちらのサイトに詳しい解説が載っています。

https://www.hitachi-solutions.co.jp/hibun/sp/column/leakage/03.html

横のカギ

1. PHISHING
魚釣りの``fishing``と手口が洗練されているという意味の``sophisticated``を組み合わせて作られた単語です。

2. MALWARE
``malware``は``mal``と``ware``を組み合わせた単語です。
``mal``は``malicious``(悪意のある)という意味であり、``ware``は``software``という意味です。
同じような組み合わせに``adware``があり、``adware``の``ad``は``advertising``(広告)という意味で、``ware``は同様に``software``という意味です。

3. TLS
Transport Layer Securityの略。

``hscctf2024{IAMWINNER}``

追記：縦のカギ3と横のカギ3は知らなくても解くことができます。

### 怪盗からの予告状

```
怪盗からの予告状が届き、画像ファイルが添付されていた。
この画像ファイルに次に盗むものが書かれているらしいが我々にはどうもわからない。
そこで君たちの手を借りたい。この画像ファイルから守るべきものが何か探してほしい。
```

プロパティを開くとflagを見ることができます。

![Notice_letter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/0373e0c6-52e1-e625-9892-e4e85f282ef6.png)

``hscctf2024{pure gold crown}``

追記：写真の中から盗まれそうなもの(パソコンetc.)を書いている人がいました。
問題文が少し悪かっただろうか・・・?

## 感想

### 問題の感想

問題の難易度の範囲はちょうどよかったかなと思います。
しかし、フラグ形式を``hscctf2024{xxxxxx}``に指定していましたが
``hsctf2024{xxxxxx}``があったりと参加者に混乱を招いたり
正解なのにもかかわらず指定されたフラグ形式になっていないが故に
不正解になってしまっているもったいないケースもありました。
問題のレビューが少し甘かったかなと思っています。

### サーバ運営の感想

一昨年、去年の問題点を今年で何とか見直すことができ、改善できたと思います。
ただ、まだ問題点として問題をスコアサーバに入れる操作などスコアサーバ関連の
操作のタスクがうまく割り振れず偏ってしまったため改善していきたいと思います。

### まとめ

Writeupも作業分担させとくべきでした。1人だときつい。