May -> Proof

雑記帳です

sedのデリミタは/でなくてもよかった

あるシェルスクリプト hage.sh に含まれるテンプレート文字列 {#TEMPLATE#} を、環境変数で注入するファイルパスに置換したい事例があって、sedで置換しようとしたけどうまくいかなかった。パスの /sedのデリミタの / が競合してしまってたのが原因。

env PATH_FOO=/foo/bar/baz
cat hage.sh | sed -e s/{#TEMPLATE#}/${PATH_FOO}/g

リファレンス読んだらデリミタは / でなくともよかった。(リファレンスはちゃんと読もうな!!!)

This also matches the regular expression regexp, but allows one to use a different delimiter than /. This is particularly useful if the regexp itself contains a lot of slashes, since it avoids the tedious escaping of every /. If regexp itself includes any delimiter characters, each must be escaped by a backslash (\).

シェルりょく が 1 あがった!

www.gnu.org

Golang で S3 からダウンロードしたファイルをオンメモリで扱う

S3 からダウンロードしたものをファイルに保存する記事はよく見かけるけど、オンメモリで扱う方法はあまり見かけなかったので備忘録代わりに書き残しておく。 var file *os.File でファイルのポインタを宣言しても上手くいかなかったので、 aws.WriteAtBuffer{} を使って解決したという話。

// s3managerを作る
sess := session.Must(session.NewSession())
downloader := s3manager.NewDownloader(sess)

file := &aws.WriteAtBuffer{}

// ここでダウンロードが実行される
n, err := downloader.Download(file, &s3.GetObjectInput{
    Bucket: aws.String(myBucket),
    Key:    aws.String(filename),
})
if err != nil {
    return fmt.Errorf("failed to download file, %v", err)
}
fmt.Printf("file downloaded, %d bytes\n", n)

// 任意の処理
// ここではbase64エンコーディングしてみる
base64Data := base64.StdEncoding.EncodeToString(file.Bytes())

バイト列は、 file.Bytes() で取り出せる。

参考

s3 - Amazon Web Services - Go SDK

go - golang s3 download to buffer using s3manager.downloader - Stack Overflow

SECCON 2017 Writeup

SECCON2017の予選、RiST(@realRiST)というチームで参加しました。 結果は1200点で177位でした。チームを結成して初めて出場したSECCON2016では200点だったので、成長率は500%です。 圧倒的成長卍

f:id:myr523:20171214104349p:plain

チームで解いた問題は

  • Vigenere3d
  • Run me!
  • putchar music
  • Qubic Rube
  • SHA-1 is dead
  • Powerful Shell
  • Log search
  • Thank you for playing!(解いたと言ってもいいのだろうか)

です。自分はPowerful Shellを解きました。ではWriteup書きます。

Powerful_Shell

ファイルの中身を見ると、

$ECCON="";
$ECCON+=[char](3783/291);
$ECCON+=[char](6690/669);
$ECCON+=[char](776-740);
$ECCON+=[char](381-312);
$ECCON+=[char](403-289);
$ECCON+=[char](-301+415);
:
:
If(Test-Path variable:global:psISE){"D`eb`u`g`g`in`g is `pr`o`h`ib`it`e`d";Exit}
:
:
If($host."na`m`e" -ne "C`on`s`o`l`e`H`o`st"){"D`eb`u`g`g`in`g is `pr`o`h`ib`it`e`d";Exit}
:
:

とあったので、デバッグを阻止している部分をコメントアウト。次いでファイルの末尾に

"$ECCON" > file.ps1

を追記してファイルに落とし込む。

実行してもThis host is too flesh! と出てプログラムが落ちる。「SECCON」の文字を出力しているであろう箇所の下の Checking Host を削除。 次いでピアノ。

$secret=@(440,440,493,440,440,493,440,493,523,493,440,493,440,349)

とあるので、これに一致するように奏でれば次に進めるっぽい。

"$k " + [math]::floor($keytone[$k])

を挿入してキーと数値の対応を調べて、 $secret の値に合う楽譜()を作ると

hhjhhjhjkjhjhf

となった。次のステージへ。

ここでも難読化されてるので、

[System.Text.Encoding]::ASCII.GetString($plain) > ans.ps1

としてファイルに書き出す。「また」難読化されたファイルが出て来るので、PowerShell ISEに食わせてステップイン実行する。

f:id:myr523:20171214114409p:plain

flag: SECCON{P0wEr$H311}