tips
ELFバイナリが実行できない
以下のようなエラーメッセージが表示される.
/bin/bash: ./hoge: そのようなファイルやディレクトリはありません
32bitのバイナリを64bitのUbuntu上で実行しようとしていたのが原因だった.
以下の手順で32bit用のライブラリをインストールすれば解決する.
# dpkg --add-architecture i386
# apt update
# apt install libc6:i386 libncurses5:i386 libstdc++6:i386
参考:bash: コマンドが確かに存在するのに "-bash: COMMAND: No such file or directory" と言われる
CpawCTF
Q23.[Reversing]またやらかした!
ELFバイナリが与えられる.
実行しても何も起きないので,デバッグする必要がある.
デバッグの知識が皆無だったので,おとなしくwrite-upを見た.
解く手順としては以下のような感じだと思う.
1. 逆アセンブル結果を見ると,文字列を格納している部分と,ループを回している部分があることがわかる.
2. ヒントとして暗号を解くプログラムであることがわかっているので,ループの回数分暗号処理をしていると推測できる.
3. 格納し終わった時点にブレークポイントを指定してそこまで実行し,文字列が格納されている付近のメモリの値を見るが,まだ暗号化前なので意味を持っていない.
4. ループ処理が終わった時点まで実行してメモリを見ると,フラグらしき文字列が確認できる.
Q24.[Web]Baby's SQLi - Stage 2-
Stage1を解くと,next stage url
というカラムに本問のURLが書いてある.
URLを開くと,パスワードを入力するように言われるが,適当な値を入力すると,画面上部にphpのエラーメッセージが出る.
ここから先がわからなかったので,write-upを参考にした.
SQL injectionを利用すればいいらしい.
Q26.[PPC]Remainder theorem
剰余定理を解く.
x \equiv a \pmod{b}\\
x \equiv c \pmod{d}
のとき,
(b \times n + a) \bmod d = c
となるようなnを見つければ良い.
調べた知識
バーナム暗号
あるビット列に対して,同じ長さのビット列を用意して共通鍵とし,XORをとって暗号文とする.
復元する際はもう一度共通鍵でXORをとれば良い.
以下のサイトの説明がすごくわかりやすくまとまっていた.
参考:最強の暗号?バーナム暗号
gdbのコマンド
上記のwrite-upで使用していたもの.
- break *[アドレス]
- アドレスの位置にブレークポイントを張る.
- info registers
- レジスタの状態を表示する.
- x/[表示する数][メモリサイズ(b,h,w,g)][表示フォーマット(s,i,x)] [先頭メモリアドレス]
- メモリの状態を表示する.
- メモリサイズはb(バイト),h(半ワード,2バイト), w(ワード,4バイト),g(Giantワード,8バイト))の指定が可能.
- 表示フォーマットはs(文字列),i(命令),x(16進数)の指定が可能.