memcachedの開放ポート(11211/tcp, 11211/udp)をサクっと確認する
昨日(2018/02/27)に、JPCERTからmemcached のアクセス制御に関する注意喚起が出ていました。
ということでmemcachedのポート(11211/tcp, 11211/udp)が開放されていないかの確認方法についてメモしておきます。
memcached開放により起きる問題
はじめに、memcachedのポートを外部から接続可能にしてしまうと何が問題か整理しましょう。
内部情報の漏洩
1つはすぐに思い付くことですが、内部情報の漏洩です。memcachedは認証の無いプロトコルであるため(正確にはあるけど、誰も(?)使ってない)、外部から接続できれば即キャッシュ上の値を取得することができます。
たとえばphp.iniで以下のように設定していれば、
session.save_handler = memcached session.save_path = "localhost:11211”
セッション情報を外部から取得可能となってしまいます。その他、キャッシュに乗っている値を根こそぎ取得できてしまいます。
UDP Reflection Attackの踏み台となる
2018年2月現在は、情報漏洩よりもこちらの被害が問題視されています。
UDPはコネクションレスであり送信元偽装が容易なため、リクエストに対してレスポンスが大きいプロトコルは、偽装した送信元(=攻撃先)への「跳ね返り」によりDDoS攻撃に利用できます。
たとえば数年前には、ntpのmonlist機能でこのようなDDoSが指摘され、攻撃者に利用されてしまいました。(参考:ntpd の monlist 機能を使った DDoS 攻撃に関する注意喚起)
memcachedで「リクエストに対してレスポンスが大きい」ことですぐ思いつくのは、状態表示をおこなうstatsコマンドでしょう。
# printf "stats\r\n" | nc 192.168.2.67 11211 STAT pid 10330 STAT uptime 5559 STAT time 1519825560 STAT version 1.4.15 STAT libevent 2.0.21-stable STAT pointer_size 64 STAT rusage_user 0.055732 STAT rusage_system 0.057469 STAT curr_connections 10 STAT total_connections 37 STAT connection_structures 11 STAT reserved_fds 20 STAT cmd_get 11 STAT cmd_set 6 ...(略)... END
上記の例のように、statsというコマンドだけで大量のレスポンスが得られます。なおmemcachedはCRLFを改行とみなすので、この例は律儀にprintfで"\r\n"を付けてます。
さらに、(詳しい操作は念のため伏せますが)外部からmemcachedが操作可能ならば、適当なkeyにとても長い値をsetして、送信元を偽装したUDP通信でgetするだけで、大きいレスポンスを偽装先へ送りつけることができます。このため memcachedのUDPポートを外部に開放していると、UDP Reflection AttackによるDDoSへ踏み台として荷担してしまうことになります。
memchacedでUDPをoffにするには、「-U 0」というオプションを付加します。CentOS 7のパッケージならば、以下のように /etc/sysconfig/memcached ファイルの「OPTIONS」に記述します。
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-U 0"
この「-U」は本来はUDPの待ち受けポートを指定するオプションなのですが、manに記載の通り、ゼロを指定するとUDPのLISTEN自体をOFFにします。
ポート開放の確認
memcachedは、TCP・UDPともに11211ポートがデフォルトで利用されます。通常はTCPしか使われないため、UDPは明示的に意識しない限り使うことはないでしょう。
しかしmemcachedデフォルトではTCPだけでなくUDPも開放されるため(memcached 1.5.6からはUDPはデフォルトでは無効らしい)、特にUDPのフィルタは見落としがちです。
ここからは、外部へ本当にポート開放していないかを確認する方法を記述します。なおこちらに書いた手法はポートスキャンに当たるため、必ず自らが管理するホストのみに行い、第三者のホスト・ネットワークをスキャンすることの無いようにしてください。
nmapを利用
ポート確認ならば、まず思いつくのはnmapでしょう。
TCPポートがopenしているか確認するだけならば、SYNスキャン(-sS)するだけで十分です。出力は-oNオプションでテキストに落としておくと良いでしょう。ここでは192.168.2.0/24をスキャンし、オプションには-nを付けて逆引きしないようにしています。
# nmap -n -sS -p11211 -oN output.txt 192.168.2.0/24
出力にはclosedやfilteredのものも混じるので、openを検索します。
...(略)... Nmap scan report for 192.168.2.65 Host is up (0.000091s latency). PORT STATE SERVICE 11211/tcp filtered memcache MAC Address: E0:3F:49:XX:XX:XX (Asustek Computer) Nmap scan report for 192.168.2.67 Host is up (0.00014s latency). PORT STATE SERVICE 11211/tcp open memcache MAC Address: 00:0C:29:CC:C7:B0 (VMware) Nmap scan report for 192.168.2.99 Host is up (0.00022s latency). ...(略)...
TCPを1ポートだけのポートスキャンならば、相当広いネットワーク帯であっても数秒〜数分で終わるでしょう。
さて11211/tcpの開放チェックは簡単ですが、UDPとなると少々やっかいです。周知の通り、UDPのポートスキャンは往々にして不正確で、nmapのUDPスキャンオプションである-sUしただけでは次のように「open|filtered」となり見逃してしまいます。
# nmap -n -sU -p11211 192.168.2.67 Starting Nmap 7.60 ( https://nmap.org ) at 2018-02-28 22:58 JST Nmap scan report for 192.168.2.67 Host is up (0.00018s latency). PORT STATE SERVICE 11211/udp open|filtered memcache MAC Address: 00:0C:29:CC:C7:B0 (VMware) Nmap done: 1 IP address (1 host up) scanned in 0.24 seconds
このためnmapによるUDPスキャンの場合は、少々応答時間が増えますが、-sVでバージョン検出を付加すると正しくOpenを判断してくれます。
# nmap -n -sU -sV -p11211 192.168.2.67 Starting Nmap 7.60 ( https://nmap.org ) at 2018-02-28 23:01 JST Nmap scan report for 192.168.2.67 Host is up (0.00018s latency). PORT STATE SERVICE VERSION 11211/udp open memcached Memcached 1.4.15 MAC Address: 00:0C:29:CC:C7:B0 (VMware) Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 0.48 seconds
この際、パケットキャプチャしてみると、以下のようにUDP上で「stats」コマンドを打っていることが分かります。
なお、UDPスキャンはとても遅いスキャンです。特に対象UDPポートから応答が無い場合、上記のオプションのままではタイムアウト待ちとなり1分以上かかるのが普通です。現場では次のように、-Pn(ICMPなどによるhost discoveryを行わない)、--host-timeout(何秒であきらめるか)を同時に指定して高速化を図ると良いでしょう。
# nmap -n -Pn --host-timeout 3 -sU -sV -p11211 192.168.2.67
日本語のmanではhost-timeoutの引数は「ミリ秒」と書かれていますが、この記述は古く、現在の単位は「秒」です。3秒というのはアグレッシブすぎる気もしますが、元々memcachedは高速応答しないと意味がないプロトコルのため、こんなもんでしょう。異論は認める。
ちなみにnmapでもっと詳細情報を得たい場合、memcached-infoというnseスクリプトが利用できます。
# nmap -p11211 --script memcached-info 192.168.2.67 Starting Nmap 7.60 ( https://nmap.org ) at 2018-02-28 23:12 JST Nmap scan report for 192.168.2.67 Host is up (0.00020s latency). PORT STATE SERVICE 11211/tcp open memcache | memcached-info: | Process ID 10330 | Uptime 7147 seconds | Server time 2018-02-28T14:12:28 | Architecture 64 bit | Used CPU (user) 0.077393 | Used CPU (system) 0.066839 | Current connections 10 | Total connections 42 | Maximum connections 1024 | TCP Port 11211 | UDP Port 11211 |_ Authentication no MAC Address: 00:0C:29:CC:C7:B0 (VMware) Nmap done: 1 IP address (1 host up) scanned in 1.19 seconds
nc(netcat)を利用
本当にちょこっと確認したいだけならば、nc(netcat)が便利です。以下のように11211に接続できるかどうかで、ポート開放を判断できます。
$ nc 192.168.2.67 11211 stats ← コマンドを打つ STAT pid 10330 ← 結果が返る STAT uptime 7382 STAT time 1519827383 STAT version 1.4.15 STAT libevent 2.0.21-stable ...(略)...
なおnc(netcat)にはUDPモードもありますが、コマンドラインからUDPで接続してTCP同様に手でコマンドを打っても正しく動作しません。次のようにstatsコマンドを組み立てる必要があります。
# echo -en "\x00\x00\x00\x00\x00\x01\x00\x00stats\r\n" | nc -u 192.168.2.67 11211
※上記コマンドはCloudflareのブログ記事、Memcrashed - Major amplification attacks from UDP port 11211を参考にさせて頂きました。
その他のツール類
memcached-toolを利用
memcached-toolは、Perlで書かれたmemcached操作ツールです。
単独のスクリプトなので、このファイル1つをダウンロードしてPerlで実行するだけで気軽に試せます。ただし、接続はTCPのみサポートしているため、UDPの確認はできません。
引数なしで実行するとヘルプが出ます。
# perl memcached-tool Usage: memcached-tool <host[:port] | /path/to/socket> [mode] memcached-tool 10.0.0.5:11211 display # shows slabs memcached-tool 10.0.0.5:11211 # same. (default is display) memcached-tool 10.0.0.5:11211 stats # shows general stats memcached-tool 10.0.0.5:11211 settings # shows settings stats memcached-tool 10.0.0.5:11211 sizes # shows sizes stats memcached-tool 10.0.0.5:11211 dump # dumps keys and values ...(略)...
便利なのは、dumpコマンドです。これを実行すると現在キャッシュされている全てのkeyと値を出力してくれます。
# perl memcached-tool 192.168.2.67:11211 dump Dumping memcache contents Number of buckets: 3 Number of items : 3 Dumping bucket 1 - 1 total items add key1 0 1519820001 3 100 Dumping bucket 12 - 1 total items add key3 0 1519820001 1000 012345678901234567890...(省略)...0123456789012345678901234567890123456789012345678901234567890123456789 Dumping bucket 4 - 1 total items add key2 0 1519820001 100 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 root@kali:~#
shodan
個別のホスト探索にはあまり適しませんが、世界中のホストがどの程度11211/tcpを開放しているかは、shodanで確認できます。
「port:11211」というクエリで検索できます。なおこのクエリはログインしていないと利用できませんが、アカウント作成自体は無料です。
参考文献・リンク
- Memcrashed - Major amplification attacks from UDP port 11211
- memcached のアクセス制御に関する注意喚起
- Nmapの真実
- Software Design 2016年5月号「フリーで始めるセキュリティチェック【前編】 Nmapによるポートスキャン」
Realtek NIC利用時のESXi 6.5インストール方法メモ
先日、Windows7にVMware Workstation Proを入れていた自宅のデスクトップ機のWindowsを潰して、ESXi 6.5を導入しました。この際にNICがRealtekであったため少々手こずったため、そのメモです。
なお同様に困っている人は多くいますので、そんなに目新しい記事ではありません……作業の際は、以下の雑木林さんの記事を参考にさせて頂きました。
ちなみにESXiというのはVMware vSphere Hypervisorに含まれるコンポーネントのひとつでしかない(らしい)ので、本来は「VMware vSphere Hypervisor(ESXi)」と書くのが正しいようです。が、いちいち書くと長いので、以下単に「ESXi」と書きます。
環境
- マザーボード:ASUS B85M-E
- NIC:Realtek 8111F
全体の流れ
基本的に、VMware PowerCLIを使ってRealtekのドライバ入りISOファイルを作る。という流れになります。
- BIOS設定でIntel VT-xを有効にする
- vmwareアカウントを作成し、ライセンスキーをメモっておく。
- PowerShellをアップデートし、PowerShellの設定を変更する
- VMware PowerCLI 6.5をダウンロードし、インストールする。
- インストール後、PATHの設定をおこなう
- ESXi-Customizer-PSでISOファイルを作成する
- 作成したISOファイルをCD-Rに焼いて、ブートする
まずはじめに、BIOSでIntel Virtualization Technologyを「Enabled」に設定しておきましょう。
vmwareアカウントの作成とライセンスキーの入手
ESXiの利用は周知のとおり無償ですが、ダウンロードにはVMwareアカウントを登録する必要があります。またESXiは無償とはいえライセンスキーを登録する必要があるため、こちらのキーの入手が必要です。
2017年11月現在ではESXi6.5は以下のリンクでしたが、コロコロとリンク先は変わるようなので、「vSphere Hypervisor download」などで検索してたどり着くとよいでしょう。
PowerShellのアップデートと設定変更
バージョンにもよりますが、Windows7ではPowerShell 2.0がデフォルトとなっています。これをPowerShell 4.0以上へとアップデートします。
PowerShellのバージョンは、$PSVersionTable と入力して表示される「PSVersion」で確認できます。これはWindows10なので、PowerShellは5.1です。
PowerShellをアップデートする場合、Windows Management Framework 4.0をインストールします。
PowerShellの設定変更
PowerShellはデフォルトでは安全側に倒されており、任意の.ps1ファイルが実行できないRestrictedモードになっています。
PS C:\Users\ozuma> Get-ExecutionPolicy Restricted
これを一時的にUnrestrictedモードへ変更します。この作業には管理者権限が必要なため、PowerShellは右クリックして「管理者として実行」した上で作業します。
> Set-ExecutionPolicy Unrestricted
この設定は危険を伴うため、作業が終わったら最後にRestrictedに戻しておくようにしてください。
> Set-ExecutionPolicy Restricted
VMware PowerCLI 6.5のインストール
VMwareの各種PowerShellツール、PowerCLIをダウンロードします。こちらのダウンロードもvmwareアカウントが必要です。
上記のリンクも変わる可能性があるため、PowerCLIで検索してたどり着くと良いでしょう。
インストール自体は簡単で、ダウンロードしたインストーラを実行するだけです。
PATHの設定
PowerCLIのインストール後に指示されますが、PATHを通す設定が必要です。私の場合は以下となりました。
> $p = [Environment]::GetEnvironmentVariable("PSModulePath") > $p += ";C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Modules\" > [Environment]::SetEnvironmentVariable("PSModulePath",$p)
参考:https://blogs.vmware.com/PowerCLI/2015/03/powercli-6-0-introducing-powercli-modules.html
ESXi-Customizer-PSのインストール
続いて、実際にRealtekドライバを取り込んでESXiのインストールディスクISOファイルを作成する、ESXi-Customizer-PSをインストールします。
こちらの「Download latest version」よりダウンロードします。こちらは物自体はps1スクリプトひとつだけですので、インストールは不要です。適当な作業ディレクトリに置けばよいです。
ISOファイルの作成
先ほどのESXi-Customizer-PSで、Realtekドライバ入りのISOファイルを作成します。まずVMware PowerCLIを起動し、先ほどESXi-Customizer-PSのps1ファイルを置いた場所へと移動します。
続いて以下のコマンドを実行します。
PowerCLI C:\Users\ozuma\local\vmware> .\ESXi-Customizer-PS-v2.5.1.ps1 -v65 -vft -load net55-r8168
- -v65:ESXi 6.5のISOを作成
- -vft:詳細よく分からない。ESXi-Customizer-PS利用で依存関係をうまくやってくれる設定らしい(?)
- -load:組み込むドライバを指定
- net55-r8168:Realtek 811Fはこのドライバに入っているため、これを指定します
これを実行すると、少々時間がかかりますがISOファイルが作成されます。あとはこのISOファイルをCD-Rに焼いてブートし、通常通りESXiのインストールをおこなうだけです。
macOS High Sierraのrootログイン脆弱性
2017/11/30更新:セキュリティアップデートがリリースされました。
このアップデートを当てると、rootユーザを有効にした状態でも強制的に無効にされます。また、改めてrootユーザを有効にしようとすると、新しいパスワードを求められます。
このため本記事に記載した、「パスワードが空のrootユーザ」がいる状態の問題も、自動的に解決されます。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
本日話題になった、いとも簡単にmacOS High Sierraでrootが取れるという件について、色々落とし穴が多いのでまとめてみました。
対象
High Sierra 10.13.1(2017/11/29現在の最新)
予備知識
通常、High Sierraではrootユーザは無効となっています。これは次のように、「ディレクトリユーティリティ」を使うと「ルートユーザを有効にする」という選択ができることからも分かります。
ただしこの場合でも、sudo suコマンドを使うことで、現ログインユーザのパスワードを知っている者はrootでシェルを取ることができます。
このためmacで言う「ルートユーザが無効」とは、「rootでログインは、”普通は"できない」くらいに捉えておくとよいでしょう。psコマンドでも、rootユーザ権限で動いているプロセスは大量にあることが確認できます。
脆弱性の作用について
再現手順については、各所に報告されていることからここでは解説しません。実際に脆弱性を利用すると、次のように「ディレクトリユーティリティ」で「ルートユーザを無効にする」という選択肢が出ていることから、ルートユーザが有効となったことが分かります。
この際注意しないといけないのは、同時にルートユーザのパスワードが空っぽ(空文字列)になるということです。このため、いったんログアウトして「その他のユーザ」から、ユーザ名を「root」、パスワードを空にするとGUIでログインできます。
rootでログインした様子がこちらです。
当然のことながらrootユーザですから、この状態でシステム権限を完全に掌握したことになります。
なおこの際、コンソール(loginコマンド)やsshでは空文字列でログインできませんでした。
この部分は何か別の制御がされているようです。(sshは、デフォルトではPermitRootLoginはprohibit-passwordですしね)
事後対応
攻撃を受けた場合のみならず、遊び半分でこの脆弱性を試した際も十分注意しないといけないのは、本脆弱性が発動した後は「rootユーザが有効化されており、そのパスワードが空文字列である」ということです。そこで対策として、rootユーザにパスワードを設定しなくてはいけません。なお後述しますが、rootユーザの無効化は不要です。
rootユーザのパスワードの変更は、一般ユーザが、ターミナルよりsudoでpasswdコマンドを実行することで可能です。
sudoですので、はじめに現ユーザのパスワード、続いてrootユーザの新規パスワードを2回入力します。ここでは、十分に長く複雑なパスワードを付与しましょう。
これにより、既知の攻撃手法を用いても、既にrootにはパスワードが付加されているため、rootユーザのパスワードを知らないと攻撃ができません。
また、当然のことながらログイン画面からのrootによるGUIログインも不可となります。
なお注意しないといけないのは、最後に「やれやれ」とrootユーザの無効化をしてはいけないということです。(実は今日やってしまい、会社の先輩からそれはダメだと教えてもらいました)。
rootユーザを「ディレクトリユーティリティ」から再び無効化してしまうと、たとえrootにパスワードを設定していても本脆弱性は発動し、再び「パスワードが空文字列のrootユーザ」の状態へと戻ってしまいます。
そのため、rootユーザは現時点では有効化しておく方が安全です。
「はじめて読むPentium マシン語入門編」をVisual Studio 2017で学習する
最近はじめてCTF(Capture The Flag)にチャレンジしたので、アセンブラやバイナリに興味が湧いてきてしまいました。ということで、初心者向けとして非常に良書だと思っている、「はじめて読むPentium マシン語入門編」を再読していました。
- 作者: 蒲地輝尚,水越康博
- 出版社/メーカー: アスキー
- 発売日: 2004/07/01
- メディア: 単行本
- 購入: 21人 クリック: 2,328回
- この商品を含むブログ (26件) を見る
ではこの学習環境を今は作れないのかというと……2017年現在は、無償で利用できるVisual Studio 2017 Community Editionがあります。これでほぼ同書内と同じ学習環境が構築できるので、その方法を紹介しておこうと思います。(というか、忘れないように自分用のメモという意味合いが強かったり。)
前置きが長くなりましたが、この記事は、「マシン語やアセンブラにちょっと触れてみたい/学習を始めてみたいけど、何をどうしたらいいかさっぱり分からない……」という人向けです。
Visual Studio 2017のインストール
2017年現在、無償で利用できるVisual Stduioで、マシン語の学習に利用できるモノとしては、「Visual Studio Community 2017」があります。
なお企業でCommunity Editionを使う際にはいくつかライセンスの問題がありますが、個人が学習用に使うならば何も問題ありません。具体的なダウンロード手順等は省略します。MSのサイトに行けば普通に見つかりますね。
ただし、インストールの際に、インストールするオプションに注意が必要なので以下で説明します。
マシン語学習のための初期インストール
Community Editionでは、マシン語学習用の環境であるWin32コンソールアプリケーションを作るモジュール(CLIサポート)がデフォルトではインストールされません。このため、インストール時にオプションを選択する必要があります。
具体的には、Visual Studioのインストーラを起動すると、下図のインストールするコンポーネントの選択画面に移ります。
ここでまず、「C++によるデスクトップ開発」のチェックが外れているので、クリックして選択します。
さらに上図で、右側の「C++/CLIサポート」にもチェックを入れておきます。これをチェックしておかないと、Win32コンソールアプリケーションが作成できません。
これで「インストール」を押せば、必要なモジュールが入った状態でインストールできます。なおインストールには6GBちょっと必要と、なんとまぁ富豪的なマシン語の学習環境です(笑。
インストール完了後に、「ファイル」→「新規作成」→「プロジェクト」で、Visual C++で「Win32 コンソール アプリケーション」が選べるようになっていることを確認してください。
「はじめて読むPentium」の学習環境は、これでひとまずインストール完了です。
「はじめて読むPentium」のサンプルコードの書き方と実行
ここでは、93ページからのリスト5-1「プロジェクト名findzero」の例を、現在のVisual Studio 2017で追うやり方を紹介します。なお、「はじめて読むPentium マシン語入門編」を持っていることを前提としているので、持っていない人はまず買ってください。
ソースコードの書き方
リスト5-1は、以下のようなコードです。これを実際にVisual C++で書いてみましょう。なお、Visual C++はIntel記法を用いるため、mov等の引数は「mov dst src」です。
データ: char Title[] = "Hello World!"; プログラム: mov ecx, 100h mov edi, offset Title Loop1: cmp [edi], 0 je end inc edi loop Loop1 end: (引用:「はじめて読むPentium マシン語入門編」リスト5-1)
まずデータ部は、グローバル変数となるためmain関数の外で定義します。実際のプログラム(アセンブリ言語)は、Visual C++のインラインアセンブラの機能を利用して記述します。具体的には、main関数の中に、以下のように __asm{} というブロックを作ります。
__asm { (ここにアセンブリ言語を書く) }
インラインアセンブラでリスト5-1を記述してみたのが以下の図です。本の指示通りにブレークポイントも設定してあります。
なおブレークポイントやステップイン実行は、Visual C++ 2003の頃から操作に変わりは無いので、本の通りに設定できます。
デバッグウィンドウ
メニューの「デバッグ」→「デバッグの開始」後、「デバッグ」→「ウィンドウ」→「レジスタ」(Ctrl+Alt+G)でレジスタの内容が確認できます。なおレジスタの子ウィンドウは自由に移動できるので、タイトルバーをクリックして掴んで、しっくりくる場所に移動してください。
上の図は、「はじめて読むPentium」 の通りに、「自動変数」のウィンドウに入れた例です。
メモリの内容も確認してみましょう。下図のとおり、今、変数Title(Hello, World!)のアドレスは0x00a79000です。
ここで、「デバッグ」→「ウィンドウ」→「メモリ」→「メモリ1」を選択し、0x00a79000を確認してみると、下の図のとおり該当のアドレスには確かに「Hello World!」が格納されています。
ここで、「!」のASCIIコードは0x21であることを思い出してください。アドレス0x00a79000から12バイトめの「21」の後ろは0x00となっており、文字列が終端されていることが分かります。(この例では、他のアドレスも0x00が多いのでちょっと分かりにくいけど)。
混合モードと逆アセンブル
「はじめて読むPentium」 の本の中では、「混合モード」でマシン語を確認しようと書かれています。しかしこれは古い呼び名で、現在のVisual Studio 2017では「逆アセンブル」で確認することができます。
ここでは、以下のようなシンプルなC言語のソースを書きます。
#include "stdafx.h" int main() { char ch = 'A'; printf("ch=%c\n", ch); return 0; }
ブレークポイントを設定してデバッグを開始したら、「デバッグ」→「ウィンドウ」→「逆アセンブル」(Ctrl+Alt+D)としてみてください。すると下図のように、C言語のソースがアセンブラ言語に展開された混合モードで表示されます。
さらにこの状態で、逆アセンブルウィンドウで右クリックして「コードバイトの表示(Y)」を選択すると、次のように各行のニーモニックに対応するマシン語が表示されます。
まとめ
「はじめて読むPentium マシン語入門編」を、現在のVisual Studio 2017(Visual C++ 2017)で学習する環境について解説しました。ひとまず操作がこれだけ分かっていれば、同書を読み進めることができる(はず)です。
なお「はじめて読む」シリーズは、実は「はじめて読む486―32ビットコンピュータをやさしく語る」が、もっとも内容が濃く優れた良書、という評判が多いです。
- 作者: 蒲地輝尚
- 出版社/メーカー: アスキー
- 発売日: 1994/09
- メディア: 単行本
- 購入: 20人 クリック: 165回
- この商品を含むブログ (83件) を見る
しかし、マシン語に全くの初心者ならば、これよりもまずは「はじめて読むPentium マシン語入門編」がいいかなというのが私の意見です。同書はタイトル通りまさに「マシン語入門」であって、「Pentium入門」ではありません。そのため中級者以上からは「内容が簡単すぎる」とあまり評判がよろしく無いようですが、逆に初心者向けとしては非常にシンプルで分かりやすい本です。
また本記事で解説したとおり、2017年現在でも、無償でVisual Studio 2017で手を動かして色々試すことができますから、マシン語への入り口へはぴったりだと私は思います。