Writeupはじめに今日サイバーセキュリティ系LT会というのに参加したのですが、そこでhamaさんが発表されていたgoの処理系がunsafeな話が面白かったので、解説されていた問題を解こうと思います。raceが存在し、任意のgoコードが実行出来る場合は(importが限られていても)シェルを取れますよという話です。これ系の話は何も分からんのですが、hamaさんとしふくろさんにexploitの流れを教えて貰ったので何とかなるやろ的に頑張ります。raceに関する)PoCが上がっています。今回はこれを使って電卓を立ち上げます。問題概要go製ブラウザもどきのソースコードが渡されます。fileが対応しており、fileを使ってHTMLっぽいのを渡せます。HTMLっぽいのというのは、タグはほぼ無視されてinnerHTMLがそのまま出力されるという雑な処理が書かれているからです。scriptとして"goscript"が対応しており、中ではfmtパッケージをimportできます。}</script>こんな出力になります。exploitアドレスリーク何事もアドレスが無いと始まらないのでアドレスリークします。今回はfmtが許可されているのでSprintfで変数のアドレスを取ります。addr}gdbで確認します。capの3つから成るので、正しそうです。ポインタには入れた整数値が入っていました。raceとりあえずPoCと同じものを書いて試します。raceに失敗します。pc=0xffffffffffffffff]登壇者のhamaさんのPoCでは、これを使ってAAR/AAWを実現していましたが、今日はもう眠いので直接ROPします。Gadgetsgoコードはもちろんコンパイルされて機械語になるので、実行可能領域に置かれます。gadgetやshellcodeとして使えます。gadgetを書きます。execveの引数をこんな感じで用意します。これxcalc立ち上げるためには環境変数DISPLAYを用意しないとダメなんですね。displayって言われた。gadgetを書いておきます。s)}goはスタックに引数を詰むのでいい感じにpopしてくれます。addrof(&args[6]))実行します。gomiumのgoscriptから実行してもちゃんと電卓が立ち上がりました。全体像こんなんになりました。Writeup月別アーカイブはてなブログをはじめよう!ptr-yudaiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。