こんにちは!
こんにちはー
課題はどうでしたか?
多少は進みましたが苦戦してる感じです
どういった点でしょうか
param2の型がまだ特定できてなかったり
GetKeyboardDllNameのparam2ですか?
はい ただ関数の引数情報入れたのでそこそこローカル変数の型がわかったりはしてきました
まず、param2をwcstoulに渡していることからUnicode文字列へのポインタであることはわかりますね。
wcstoulの第三引数が0x10であるからこれは16進数表示ですね。
あれれ 私のほうで何か間違えたかな...?
そしてparam2は読み込みのみなのでLPCWSTRであることは確定しますね。
呼び出し規約が間違っていると正しい結果は得られません。
それはあるかもしれません
解析する関数とその関数が呼び出しているすべての関数についてです。
どうやらfastcallになってしまっていたのが原因だったようです
では授業を開始します。
よろしくお願いします
今日は攻撃者になったつもりで行きます。
アセンブリには方言がある。nasm, masm, gas, yasm, fasm, ... 命令を機械語に直すだけじゃなくて、マクロが使えるものも多い。 C/C++ソースで使えるインラインアセンブラというのもあるが、これはコンパイラによって書き方が異なる。
システムの脆弱性を証明するプログラムのことをexploitといい、コードによって脆弱性を証明することをPoC(概念実証)という。 PoCを示すのに、shellcodeがよく使われてる。例えば、無害なものであれば勝手に電卓(calc.exe)を起動するshellcodeなどがある。 https://github.com/peterferrie/win-exec-calc-shellcode (※危険)
shellcodeはそのまま実行可能な連続したバイト列。そのうち、ヌルバイトが含まれていないものをnull-freeという。 攻撃者はshellcodeをスタックやプロセスメモリーなどに配置して実行させようとする。 バッファオーバーフローはC/C++でよくある脆弱性。C/C++のようなOSで直接実行されるような言語のことをUnmanagedという。 Unmanagedなコードは脆弱性が多い。未修正の脆弱性を利用して行われる攻撃をゼロデイ攻撃という。 残念ながら、日本国内では興味本位でshellcodeを公開することはいろいろな意味で危険らしい。
shellcodeの書き方については英語で読むのが一番だ。 https://idafchev.github.io/exploit/2017/09/26/writing_windows_shellcode.html
危険なshellcodeを公開すると日本国内ではいろいろまずい。 どうしてもやりたいなら、匿名かつ英語でやるか、由緒正しいセキュリティエンジニアになるか。 脆弱性を公開する場合は守るべきルールがある。 発見された脆弱性にはユニークな共通脆弱性識別子(CVE)が付けられる。 脆弱性の状況によっては逮捕もあり得るし、大金が動くこともあるし、世界中のシステムに影響することもある。最近ではSpectre、Meltdown、Log4Shellが世界的に問題になった。賞金狙いのバグハンターや国家に雇われた悪いハッカーが有名なソフトウェアの脆弱性を日々見つけようとしている。
念のために忠告しておくが、ウイルスを作製して逃げ切れるとは考えない方がいい。コンパイル・ビルドするときにファイルに指紋が残る。ウイルスを配布したときにネットにログが残る。他にも、君の知らない監視網がある。真のハッカーはWindowsを使わずにWindowsの開発ができる。
さて、shellcodeを実行する方法について。shellcodeが関数形式なら、関数ポインタに変更してそのまま関数呼び出しで実行。 バッファオーバーフローを狙うなら、shellcodeをスタックに配置して戻り先アドレスを改変する。 スレッドで実行するならCreateRemoteThread、QueueUserAPC関数などを使う。これはDLLインジェクションと組み合わせることが多い。
DLLインジェクションは、LoadLibrary関数とCreateRemoteThread/QueueUserAPCなどを組み合わせて、プロセスにDLLを読み込んでそのプロセス内部でコードを実行する手法である。DLLインジェクションの例は katahiromz/InjectDLL ( https://github.com/katahiromz/InjectDLL ) を参照。
CreateRemoteThread/QueueUserAPCは、よく悪用される関数だが、良いことにも使うことができる。例えば
katahiromz/AppStartByLang https://github.com/katahiromz/AppStartByLang を使うと、コマンドライン「AppStartByLang.exe 0x0409 notepad」でGUIの言語を英語に変えてメモ帳を起動できる。 これはQueueUserAPC関数でSetThreadLocale/SetThreadUILanguageをターゲットのスレッドに注入することで、スレッドの言語を変えることができる。 (ただし、インストールされている言語のみ)
今日はここまで。
ありがとうございました
日本でいつかウイルスを送ったか何かで誤逮捕された事件がありましたね
そういえば
その時もファイルに残った指紋からどのエディタを使ったか特定できたみたいな話があった気がします