トリコロールな猫/セキュリティ

思いついたことをぼちぼち書いてます。

OllyDbgを使ってx86アセンブラとデバッガの基礎の基礎を学ぼう

note.muで、表題のシリーズを書き始めました。目次からどうぞ。
書こうと思ったきっかけはこのエントリの最後に書いてあります。
誰かの役に立つことを願って。

目的

OllyDbgを使ってx86アセンブラ(32ビット)とデバッガの基礎の基礎を学ぶこと。

目次(随時更新)

第零話:まずは動かしてみる 〜ブレイクポイントとステップ実行〜
第一話:ステップイン・ステップオーバー・ステップアウト
第二話:メモリマップから見るコードとスタックの場所
第三話:ASLRの意味をデバッガで見てみる
第四話:CALL命令で起こること
第五話:スタックとLIFO、だから何?(怒)
第六話:EBPとESP、スタック領域の使われ方
第七話:CALL命令で起こること・再
最終話:古き良きバッファオーバーフロー攻撃の仕組み
以下未定
# 書いていくうちに変更するかも。
# 完結したらAmazonの電子書籍として出してみようかと思っています。

必要な前提知識

このC言語のソースを見て何をやっているか分かること

#include
int sub(int i, int j)
{
     int x = 0;
     x = i + j;
     return x;
}
main()
{
     int a = 0, b = 0, ans = 0;
     a = 10;
     b = a + 100;
     ans = sub(a, b);
     printf("%d\n",ans);
}

これをコンパイルしたexeファイルを題材に、解説を進めていく予定です。
main()関数から始まってーsub()関数呼び出してーその結果をprintf()関数で書き出してーというのが全く分からないと多分つらいです。

16進数・2進数を理解していること

・・は、ググって出てきたものを読めば事足ります。

環境

筆者の環境は以下のとおりです。

OS Windows 7 SP1 32ビット版(ASLR無効化済)
デバッガ OllyDbg v2.01
コンパイラ Visual Studio Express 2012 for Windows Desktopに同梱されているもの

# 筆者の環境は32ビットですが、学ぶのに32ビット版Windowsが必要なわけではありません。

OllyDbg

読み方は「オリデバッグ」、略して「オリ」と呼ばれるフリーのデバッガです。

公式サイトから最新版をダウンロードしてインストールしてください。

今回使うのはバージョン2ですが、1の方は日本語化するプラグインも出ています。このシリーズに関しては1系でも2系でも大丈夫だと思います。

Visual Studio Express 2012 for Windows Desktop

サンプルのexeファイルもアップするつもりなので必要ないんですが、うまく動かない場合もあると思うので一応コンパイラについての情報も。

Visual StudioはMicrosoftが提供している総合開発環境で、そのフリー版がExpressとして公開されています。

コンパイルしたい場合には、公式サイトから自分の環境にあったものをダウンロードしてインストールしてください。結構時間がかかります。

インストール後、スタートメニューから「Visual Studio ツール」の中の「VS2013 x86 Native Tools コマンド プロンプト」というのを起動し、clコマンドを実行するとコンパイルすることができます。

例えばmain_sub.cというCのファイルをコンパイルするとこんな感じ。

>cl main_sub.c
Microsoft(R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main_sub.c
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main_sub.exe
main_sub.obj

このシリーズを書く上で参考にした本

はじめて読む8086―16ビット・コンピュータをやさしく語る (アスキーブックス)

はじめて読む8086―16ビット・コンピュータをやさしく語る (アスキーブックス)

  • 作者:蒲地 輝尚
  • 出版社/メーカー: アスキー
  • 発売日: 1987/03
  • メディア: 単行本

初版発行1987年というふっるい本ですが、コンピュータがexeファイルを実行するときに起こることがよく分かる本です。本シリーズが32ビットの話なのに対し、この本はその前身の16ビットの話なのでレジスタの名前とか命令が若干違います。でもCPUやメモリの基礎知識はこれで身に付けるといいかなあと。最初は読んでもよく分からないかもしれませんが、この本に書かれていることを知っているか否かで、本シリーズの理解度はかなり変わると思います。

・・・と思ったらこれも絶版?本屋さんでは見かけますがAmazonでは古本しか売ってないですね。後続の486ならKindle版がありますが。

32ビットコンピュータをやさしく語る はじめて読む486 (アスキー書籍)

32ビットコンピュータをやさしく語る はじめて読む486 (アスキー書籍)

  • 作者:蒲地輝尚
  • 出版社/メーカー: 角川アスキー総合研究所
  • 発売日: 2014/10/21
  • メディア: Kindle版

こちらは32ビットなので、まさにx86アセンブラの話が書いてあります。古本いやーという方はこっちでもいいかも。
・・が、CPUやメモリの使われ方を学ぶという意味では、8086の方が詳しいと思います。

Panic!―UNIXシステムクラッシュの追求と対策 (サンソフトプレスシリーズ)

Panic!―UNIXシステムクラッシュの追求と対策 (サンソフトプレスシリーズ)

これも1996年発行とかなり年期入ってます。だって昔は全然この手の本なかったんだもの。
もはや絶版のようで、一時期は中古本で3万円くらいの高値が付いていたんですがだいぶ下がってますね。

SPARCアセンブラを書くために買ったものなので本シリーズには全く必要ないです。x86アセンブラって美しくないなぁと思った方は読んでみると感動するかもしれません。
一応、アセンブラやレジスタについての基本的なことは載っています・・がx86ではないので本シリーズで初めてアセンブラを学ぶという人は混乱するかもしれません。

熱血!アセンブラ入門

熱血!アセンブラ入門

  • 作者:坂井 弘亮
  • 出版社/メーカー: 秀和システム
  • 発売日: 2014/09/30
  • メディア: 単行本

こちらは打って変わってものすごく新しい本です。2014年9月発行。
圧倒的な情報量なので本格的にアセンブラを学びたい人には必携だと思われますが、アセンブラ自体の解説はPowerPCのアセンブラを使って行われており、こちらも本シリーズで初めてアセンブラを学ぶという人は混乱するかもしれません。

このシリーズを書こうと思ったきっかけ

(雑談なので読みたい方だけどうぞ。)
そもそも今年度の密かな目標として、自分の持っている知識を形にして公開するというのがありました。私は昔はネットワーク寄りのセキュリティ屋さんで、パケット解析やったりシェルコード書いたりしていました。Slammerのコードは全部読みました。懐かしいネー。

ただバリバリとやっていたのは6年前までで知識が古くなっているし(つーかもう覚えてないし)、当時の守秘義務もあるので、何をどう公開するのがいいのかよく分からず、どうしようかなぁと思っていました。

というところに、CTF for GIRLSというセキュリティのイベントのお手伝いすることになり、参加者のアンケートを見ていくうちに、「セキュリティに興味がある・仕事で関わるけど何をしていいのかわからない」という人が非常にたくさんいることが分かり、ネットで探せば出てくるような基本的なことでも、系統だてて書いてみたら意外と役に立ちそうだと思い、書いてみることにした次第です。私がセキュリティの仕事を始めた当時、「こういうコンテンツがあったらちょー嬉しかったのになぁ」と思えるようなものにするつもりです。

たまたま2014年7月に開業届を出し、めでたく「フリーライター」という肩書を手に入れたので、様子を見て読みたいという人が多そうなら、有料コンテンツを売るという形でやってみたいと思います。

今はもう64ビットが主流で、メモリの使われ方もだいぶ変わってしまったので、この知識が直接何かの役に立つことはないかもしれませんが、歴史と基本を学ぶことは技術屋にとっては得るものが多いと信じています。

関連記事

pwnの簡単な問題をLinuxでのデバッガ(gdb)を使って解いた記事です。
security.nekotricolor.com

アセンブリコードを書くことに特化した問題のwrite-upです。
security.nekotricolor.com