Skip to content

Instantly share code, notes, and snippets.

@RKX1209
RKX1209 / llvm-internal.md
Created November 5, 2017 06:23
LLVM source code internal

LLVMのなかみ (LLVM internals)

基本的にLLVMContextがthread context情報を持っていてModuleが各モジュールを表す。 IR生成時は例えばグローバル変数の生成のような各モジュールに関連付ける必要のある操作ではModuleを渡して操作。またIR生成は最初にllvm::BasicBlockを作ってbuilder.SetInsertPointでBasicBlockを設定する事で、指定されたBasicBlockから命令挿入が始まる。 このようなBasicBlockはコンテキストLLVMContextを指定して生成、関連付け。

#0 ディレクトリ構成 lib/

  • CodeGen: IR->マシン非依存データ郡(MachineInstr...)への変換
  • Target/X86: ネイティブへの変換(アーキテクチャ依存部)
@RKX1209
RKX1209 / panda-internal.md
Created November 5, 2017 06:21
PANDA source code internal

Pandaのなかみ

tainted_instrプラグイン: 指定されたテイントデータにアクセスした命令をダンプするプラグイン。 テイント解析用のtaint2,コールスタック復元用のcallstack_isntrを使っている。

(tainted_instr.cpp)

|c| bool init_plugin(void self) { panda_require("taint2"); []

@RKX1209
RKX1209 / decaf-internal.md
Created November 5, 2017 06:21
DECAF source code internal

TL;DR BasicBlockを実行する度にゲストOS判定を行う。 init_taskのアドレスなどからshared/kernelinfo/procinfo_generic/procinfo.iniデータベースを使ってOSの種類、バージョンを特定しProcInfoに格納。init_taskのアドレスによって特定している(これでディストリビューション,バージョン分けきれるのか?) また.ini内のts_xxxなどはtask_struct構造体のxxxメンバのオフセットを表している。 また、OSのバージョン名.initをkernelinfo/old_stuff/lib_confから検索し、glibcの関数,RVAの組み合わせを読み込む。 ゲストOSの判定が完了したらTLBが実行される度に

APIフック_bynameでは指定された関数名を、上記の方法で取得したfunc,RVAの組み合わせよりアドレスを得てフックをセットする。

APIフック情報はload/saveによる一時的な保存が可能。(いわゆるrecord and replayだと思われる)

@RKX1209
RKX1209 / bitvisor-internal.md
Created November 5, 2017 06:19
bitvisor source code internal

BitVisorのなかみ(BitVisor internal) 1.ビルド 各ディレクトリごとにoutput.oを生成して、トップディレクトリのoutput.oにリンク。 このoutput.oからbitvisor.elfを生成。 makeするとbuild-allルールで$(CONFIG),defconfigターゲットのルール実行。 これによりmake -f Makefile.config update-configが実行。update-configは.configを読み込んで.configに書き込む(?) .configはmake configすると、./config.shからwhiptailを使ってコンフィグ画面が起動。これで.configに書き込み。 その後make -f Makefile.buildでmake build-targetされる。 Makefile.buildでは$(DIR)$(target)(i.e. dir/$(outo))がビルドされる。これはdefoutoのエイリアス。

  1. ブート
@RKX1209
RKX1209 / dd-internal.md
Created November 5, 2017 06:17
dd command source code internal

ddコマンドソースコード・リーディング

(dd.c)

|c| int main (int argc, char **argv) { int i; int exit_status; off_t offset;

@RKX1209
RKX1209 / r2-internal.md
Created November 3, 2017 14:51
radare2 source code note

radare2のなかみ(radare2 internal)

Timeless Debuging

r2でもTimeless Debugingしたい。(GSoC2017) mid-termまでにrrやqiraのログを読んでTDできるように。finalでデバッガのプラグインとしてレコーダも開発。

疑問

  • dsb(debugger step back)を作れとの事だが、これは1ステップバックコマンド。で、ステップ"オーバー"するべきなの? 関数呼び出した後、後ろに戻ったら関数内のretに戻るべき?
  • qiraとかrrのtracing sessionはどうやって読み込む? r2実行時コマンドオプションで渡す? 読み込むタイミングは?
  • dsbの実装案、RDebugがその時のデバッギの状態っぽい。これを前の状態に戻す。dsoの場合r_debug_step_overからptrace(SINGLE_STEP)でデバッギの状態を更新 じゃあdsbやろうと思うと、PC含めレジスタの書き換えができるのでptraceで制御を1命令戻すとかは可能。なので必要なのは、デバッグログ。このログを読んでいってptrace で状態を前に戻していけば良さそう。
let GetX = 0;
let GetY = 0;
let frame = 0;
let angleBase = 90;
let YELLOW01 = 1;
let WHITE01 = 10;
function script_enemy_main() {
let imgBoss = "script\img\ExRumia.png";
let frame = 0;
let res = frame * 3 + angleBase / 2;
@RKX1209
RKX1209 / DnlangAST.lisp
Created March 26, 2016 17:11
Dnlang: Parse syntax and translate to AST
function script_enemy_main() {
let imgBoss = "script\img\ExRumia.png";
let frame = 0;
let angleBase = 90;
return;
}
function Initialize() {
SetX(GetCenterX);
SetY(GetClipMinY + 120);
SetLife(2000);
@RKX1209
RKX1209 / JokeLinux.patch
Created December 6, 2015 08:24
When apply this patch to linux kernel 3.13, you can choose config option 'NO_SIGSEGV', that disable SIGSEGV. In other words, when SEGV happen, new elf section corresponding segv address will allocated.
--- arch/x86/Kconfig
+++ arch/x86/Kconfig
@@ -263,6 +263,24 @@ config ARCH_SUPPORTS_UPROBES
source "init/Kconfig"
source "kernel/Kconfig.freezer"
+menu "Joke setup"
+
+config NO_SIGSEGV
+ bool "SIGSEGV must not happen"