お願い
基本的に自分用のまとめですが、なにか間違っている点があれば教えていただけるとありがたいです。
解放を含むので、解き終わっていない人はブラウザバック推奨。
Q7.[Reversing] Can you execute ?
題名からして、実行すれば終わりでしょうが、その調べ方を学ぶ必要があります。
とりあえずfileコマンドで確認。
$ file exec_me
exec_me: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550, not stripped
これだけでLinux環境で実行すればいいのだとわかりますが、きちんと中を確認します。
ELF 64-bit LSB executable:64bitのELFバイナリの実行可能なファイル。エンディアンはリトル。
x86-64:アーキテクチャがx86-64
version 1 (SYSV):SysVinitを示している?検索してもわからず
dynamically linked:動的リンク
interpreter /lib64/ld-linux-x86-64.so.2:動的リンク用のインタプリタパス
for GNU/Linux 2.6.24:Linuxカーネルバージョン2.6.24がtarget
BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550:ID。SHA-1形式で復号を試みたけどできなかった
not stripped:デバック情報が残っている
それはさておき、実行権を付与して実行したら出てきた内容を回答して完了。
Q11.[Network]pcap
pcapファイルを開いて中身を見ればいい。
業務上pcapはあまり触れないが、Wiresharkで見ればいいのは知っているので確認。
2つのデバイス間での通信ログが入っていました。
パケットデータのASCII文字列部分を確認すると、cpaw{}が確認できたので、回答して完了。
車載やっているとASCIIでも表せること自体を知らないので、これはいい学びでした。
Q14.[PPC]並べ替えろ!
並び替えればいいだけだったので、バブルソートを組みました。
#include<iostream>
int main(){
int num[] = {15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207};
int num_box = 0;
int i = 0;
int j = 0;
for(j = 0; j < ((sizeof(num)/sizeof(num[0])) -2); j++){
for(i = 0; i < ((sizeof(num)/sizeof(num[0])) -1); i++){
num_box = num[i];
if(num[i] < num[i+1]){
num[i] = num[i+1];
num[i+1] = num_box;
} else {
/*何もしない*/
}
}
}
for(i = 0; i < ((sizeof(num)/sizeof(num[0]))); i++){
printf("%d",num[i]);
}
}
qsortを使う方法もありますが、下記のようにだいぶ複雑です。
https://monozukuri-c.com/langc-funclist-qsort/
C++なら普通にsortを使ったほうが簡単です。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// テスト配列
vector<int> A = {15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207};
// ソート
sort(A.rbegin(), A.rend());
// 出力
for (auto a : A) cout << a;
cout << endl;
}
Q13.[Stego]隠されたフラグ
画像には端に点が書かれていました。
モールス信号のようなので、変換します。
はじめは和文で変換してしまい、訳の分からないものでしたが英文変換をしたら出てきました。
CPAW...で出てきたので、cpaw{cpaw...}と入れてしまい、何度か通らなくて困りました。
Q15.[Web] Redirect
アクセスすると、http://q9.ctf.cpaw.site/ に飛ばされました。
リダイレクトはLocationヘッダーに記載されているURLの読み込みを行います。
F12でツールを起動して確認を行いました。
起動していないと読み込まないらしいので、起動した状態でURLを入力。
ネットワークの応答ヘッダーのX-Flagsに記載がありました。
Q16.[Network+Forensic]HTTP Traffic
パケットキャプチャからページを復元するという問題。
WireSharkで中を見ていたのですが、よくわからない。
なにか通信しているのはわかる。
機能からオブジェクトをエクスポートできることを確認。
なにそれすごい。
今回はHTTPプロトコルの復元をしたいので、HTTPを選択。
わからないのはエクスポートできるファイルの容量。
元のpcapの容量超えているんだが、圧縮して保存されていたということ?
エクスポートしたファイルはとりあえず全部同じ階層に保存される。
元の階層は考慮されていないようなので、所定の位置に格納してあげないといけない。
Q18.[Forensic]leaf in forest
とりあえずfileで確認したところ、cpapファイルとして認識している。
ただ、wiresharkでは読めなかったので、catで中を覗いてみることに。
ラブライバーであることしかわからなかった。
題名的に、中になにか文字列が紛れていると考えたので、vimで開いてloveとlive!を置換して削除してみる。
なんかそれっぽいものを確認。
3文字の大文字であるので、多分これだろう。
正規ルートではないと思うので、これで出てきたmgrepを使った方法を探索。
Q19.[Misc]Image!
zipがダウンロードできたので、とりあえず展開。
中にはxmlファイルがたくさんとpngファイル。
pngを見るとFlagが書かれていたが肝心な部分は見えない。
それぞれファイルを見てみると、mimetypeというファイルに「application/vnd.oasis.opendocument.graphics」という記述を確認。
mimetype自体は拡張子のようなもので、データ形式を表している。
調べると.odgファイルという拡張子に対応するとのこと。
つまり、zipではなくodgファイルであるということ?
確かにexcelとかもzipに変換することで添付ファイルを取り出しやすかったりするので、そう変更されたのだと判断して、odgに変更。
png画像のまま開けて、色々触れるようになっていた。
黒塗りをどかしたら出てきたflagを取り出して完了。