Skip to content

Instantly share code, notes, and snippets.

@riywo
Last active May 12, 2021
Embed
What would you like to do?
gdbとかassemblyのアンチョコ

2進数

  • 0xXX
    • 1 byte = 16進数2桁 = 8 bit
  • 0xXXXXXXXX
    • 4 byte = 16進数8桁 = 32 bit
    • int
  • 0xYYYYYYYYXXXXXXXX
    • 8 byte = 16進数16桁 = 64 bit
    • long int

gdbコマンド

  • run [arg1 arg2...]
    • コマンドライン引数渡して実行
    • セッション内なら2回目以降はrunだけで同じ引数渡してくれる
  • step
    • 関数レベルでステップ実行
  • stepi
    • アセンブラの1命令単位でステップ実行
  • nexti
    • stepiと同じだが、関数呼び出しは1ステップにしてくれる
  • break
    • ブレークポイント
    • シンボルや直接アドレス(*0x0000000000000みたいな)を指定
  • disassemble
    • アセンブラのコードで読める
    • 引数にシンボル渡せる
  • list
    • デバッグシンボル付きでビルドしてあれば、ソースコードが読める
  • info register
    • レジスタ一覧
  • print
    • 色々出力できる
    • print 0x11
    • print $rdx
  • x
    • 評価?して出力
    • x $rdi
    • x/16x $rdi
      • $rdiの位置から4byte毎に16個 (64byte分)
    • x/16g $rid
      • $rdiの位置から8byte毎に16個 (128byte分)

assembly読み方

  • cmp %a, %b
    • jl => %a > %b
    • jg => %a < %b
  • test %a, %a
    • je => %a == 0
    • jne => %a != 0
    • js => %a < 0
    • jns => %a > 0
  • メモリ計算
    • 0xXX(%a, %b, %c)
      • (%a + %b * %c + 0xXX)が持ってる値をアドレスとして、そのアドレスが対象
      • mov (%a), %b
        • b = *a
      • mov %b, 0x8(%a)
        • *(a+0x8) = b
        • 構造体のフィールド代入とか
  • x86_64の関数の引数渡しはレジスタから
    • %rdi, %rsi, %rdx, %rcx, %r8, %r9
    • 返り値は%rax(%eax)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment