asm

Homebrewで入るNASMは古すぎて、aptで入るNASMとは挙動が違う

自作CPUエミュの動作確認をしているときに、Homebrewで入るNASMとaptで入るNASMの挙動が違うことに気がついた。 挙動の違いを見る 簡単なコードをアセンブルして違いを見る。 BITS 32 org 0x7c00 sub esp, 16 aptで入るNASM Ubuntuにaptで入るNASMを使って、…

gccでlibc抜きでコンパイルを通す

Hello from a libc-free world! (Part 1) (Ksplice Blog) がおもしろかったのでやっていく。 libcありのとき コード よくあるhello worldのコード $ cat hello_with_libc.c # include <stdio.h> int main() { printf("Hello World\n"); return 0; } コンパイル $ gcc </stdio.h>…

asmでスマートに文字列の長さを算出する

asm

文字列の長さを算出 以下のasmコード(x64)で、文字列の長さを取得することができる。 mov eax, 0x0 mov rcx, 0xffffffffffffffff repnz scas al, BYTE PTR es:[rdi] not rcx lea rcx, [rcx - 1] // dec rcxでも可x86がいい人は適宜読みかえて欲しい。 解説 r…

VMの検知について

マルウェアを解析する際にはVMで解析を行うことが多いので、VMを検知してアンチデバッキングするマルウェアが存在する。それらが用いる手法についてまとめた。 1. TSCを用いる TSC(IA32_TIME_STAMP_COUNTER_MSR: TSC_MSR)とは、CPUクロックごとに加算される6…