windbg と gdb に関係した基本操作メモ。


毎回調べている気がするのでメモ。
(たぶんころころ書き加えていきます

 

作業内容 windbg gdb
実行 g r
ブレークポイント bp b
ブレークポイント
一覧
bl i b
(info breakpoint)
ブレークポイント
削除
bc d
ステップ実行
(Step over)
p n
ステップ実行
(Step Into)
t s
メモリ内容表示 d
d(a,b,c,d…)
d
x/(o,x,u,t,8xb..)
変数内容表示 dv (変数名) print (変数名)

p *0×000  みたいなのも可
レジスタの値 (レジスタウィンドウを見る)

dd eax..
i r

i r eax..
逆アセンブル結果 (Disassemble ウィンドウをみる) disas (関数名)
ソースコード (ウィンドウを見る) list (関数名)

 

・・とりあえず、良く忘れるので(

 

あといくつかメモ:

 

gcc でビルド時にデバッグ情報を入れる:
→ gcc –g でビルドしてやる

objdump で Intel 記法で眺められるようにする:
→ objdump –M intel  で眺める。
ex)  objdump –M intel –D a.out   .. のように。

VC コンパイラでデバッグ情報を入れる:
→ cl /Zi でビルドする。

VC コンパイラ環境で objdump っぽいことをする:
→ dumpbin a.exe /disasm  とかやると良い感じ。

RtlUnicodeString.. 系の一部のAPI は 32767 文字以上を設定できないみたいです。


どうも、みむらです。

ちょっとカーネルモードドライバを書いていまして、
RtlUnicodeStringPrintf 関数で文字列を設定する時に、
変数のサイズを 32767 文字以上に設定すると
STATUS_INVALID_PARAMETER になって動かないことがありました。

まさかと思って 32766 にすると動く。

コードとしてはこんな感じ:

UNICODE_STRING text = {0};

text.MaximumLength = 32767;
text.Buffer = ExAllocatePoolWithTag(PagedPool, text.MaximumLength, 0x3939);
text.Length = 0;

// STATUS_INVALID_PARAMETER で失敗する。
RtlUnicodeStringPrintf(&text,L"HELLO");


// STATUS_SUCCESS になって text に "HELLO" が代入される。
text.MaximumLength = 32766;
RtlUnicodeStringPrintf(&text,L"HELLO");

ExFreePoolWithTag(text.Buffer,0x3939);

でもって、同じ文字列操作系の命令でも
RtlUnicodeStringCat は動く。

 

もちろん、 UNICODE_STRING は

typedef struct _UNICODE_STRING {
  USHORT Length;
  USHORT MaximumLength;
  PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

こんな感じで定義されてる。 ( http://msdn.microsoft.com/ja-jp/library/ff564879(v=vs.85).aspx )

 

謎い。

 

ってことで MSDN の説明を注意深く読んでみました。

・・・そうしましたら、双方の “DestinationString” の説明に差を見つけました。

 

RtlUnicodeStringPrintf:

DestinationString [out]
A pointer to a UNICODE_STRING structure that receives a formatted string. RtlUnicodeStringPrintf creates this string from the formatting string that pszFormat specifies and the function’s argument list. The maximum number of characters in the string is NTSTRSAFE_UNICODE_STRING_MAX_CCH.

RtlUnicodeStringCat:

DestinationString [in, out]
A pointer to a UNICODE_STRING structure. This structure includes a buffer that, on input, contains a destination string to which the source string will be concatenated. On output, this buffer is the destination buffer that contains the entire resultant string. The source string is added to the end of the destination string. The maximum number of bytes in the structure’s string buffer is NTSTRSAFE_UNICODE_STRING_MAX_CCH * sizeof(WCHAR).

 

・・・なんと。。。

 

でもって ntstrsafe.h に定義されている NTSTRSAFE_UNICODE_STRING_MAX_CCH を見てみますと、

#define NTSTRSAFE_UNICODE_STRING_MAX_CCH    (0xffff / sizeof(wchar_t)) 

こんな感じで書いてあるんですね。

 

何で双方に違いがあるのかはよく分かりませんが・・。
でも、0xffff 文字書き込めるものと 0x7fff までしか書き込めないものとがある、
ということで。。

もし文字列操作系で、バッファサイズは足りているのに格納できない場合
NTSTRSAFE_UNICODE_STRING_MAX_CCH をオーバーしていないか確認してみると良いかもしれません。

SECCON CTF 2014 Web 予選に参加してみた!


どうもみむらです。

久しぶりの SECCON CTF ということでチーム一同ノリノリではしゃぎながら参加してきました。
・・チームは “wasamusume” です。 なんだかんだで今年も旗、振ってます。

 

とりあえず私が解いたのは、

*x86アセンブラを読もう (100)
*捏造された契約書を暴け (300)
*箱庭XSSリターンズ(300)
*箱庭SQLiチャレンジ(100)
*879,394bytes (100)

の5つ。

いくつか勘で解いてしまったところがあるので、
ちゃんと説明出来る所のみを。


*x86アセンブラを読もう

-----
01361000 >   55                 PUSH EBP
01361001     8BEC               MOV EBP,ESP
01361003     83EC 08            SUB ESP,8
01361006     C745 FC 00000000   MOV DWORD PTR SS:[EBP-4],0
0136100D     C745 F8 01000000   MOV DWORD PTR SS:[EBP-8],1
01361014     EB 09              JMP SHORT test.0136101F
01361016     8B45 F8            MOV EAX,DWORD PTR SS:[EBP-8]
01361019     83C0 01            ADD EAX,1
0136101C     8945 F8            MOV DWORD PTR SS:[EBP-8],EAX
0136101F >   8B4D F8            MOV ECX,DWORD PTR SS:[EBP-8]
01361022     3B4D 08            CMP ECX,DWORD PTR SS:[EBP+8]
01361025     7F 0B              JG SHORT test.01361032
01361027     8B55 FC            MOV EDX,DWORD PTR SS:[EBP-4]
0136102A     0355 F8            ADD EDX,DWORD PTR SS:[EBP-8]
0136102D     8955 FC            MOV DWORD PTR SS:[EBP-4],EDX
01361030    ^EB E4              JMP SHORT test.01361016
01361032   . 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
01361035   . 83E8 02            SUB EAX,2
01361038   . 8BE5               MOV ESP,EBP
0136103A   . 5D                 POP EBP
0136103B   . C3                 RETN
...
01361040 > . 55                 PUSH EBP
01361041     8BEC               MOV EBP,ESP
01361043     51                 PUSH ECX
01361044     C745 FC 00000000   MOV DWORD PTR SS:[EBP-4],0
0136104B     6A FF              PUSH FF
0136104D     E8 AEFFFFFF        CALL test.01361000
01361052   . 83C4 04            ADD ESP,4
01361055   . 8945 FC            MOV DWORD PTR SS:[EBP-4],EAX
01361058   . 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
0136105B   . 50                 PUSH EAX
0136105C   . 68 F4203601        PUSH OFFSET "FLAG{%d}\n"
01361061   . FF15 A4203601      CALL DWORD PTR DS:[<&MSVCR100.printf>]
01361067   . 83C4 08            ADD ESP,8
-----

 

いきなりこれが出ると、「ウッ」とするかもしれません。私もしました。
・・某キャンプの読経か・・と。

でも冷静に見てみると結構簡単なんですね。

---
01361000 >   55                 PUSH EBP
01361001     8BEC               MOV EBP,ESP
01361003     83EC 08            SUB ESP,8
01361006     C745 FC 00000000   MOV DWORD PTR SS:[EBP-4],0
0136100D     C745 F8 01000000   MOV DWORD PTR SS:[EBP-8],1
01361014     EB 09              JMP SHORT test.0136101F
01361016     8B45 F8            MOV EAX,DWORD PTR SS:[EBP-8]
01361019     83C0 01            ADD EAX,1
0136101C     8945 F8            MOV DWORD PTR SS:[EBP-8],EAX
0136101F >   8B4D F8            MOV ECX,DWORD PTR SS:[EBP-8]
01361022     3B4D 08            CMP ECX,DWORD PTR SS:[EBP+8]
01361025     7F 0B              JG SHORT test.01361032
01361027     8B55 FC            MOV EDX,DWORD PTR SS:[EBP-4]
0136102A     0355 F8            ADD EDX,DWORD PTR SS:[EBP-8]
0136102D     8955 FC            MOV DWORD PTR SS:[EBP-4],EDX
01361030    ^EB E4              JMP SHORT test.01361016
01361032   . 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
01361035   . 83E8 02            SUB EAX,2
01361038   . 8BE5               MOV ESP,EBP
0136103A   . 5D                 POP EBP
0136103B   . C3                 RETN
---
0136104B     6A FF              PUSH FF
0136104D     E8 AEFFFFFF        CALL test.01361000
---
0136105B   . 50                 PUSH EAX
0136105C   . 68 F4203601        PUSH OFFSET "FLAG{%d}\n"
01361061   . FF15 A4203601      CALL DWORD PTR DS:[<&MSVCR100.printf>]
---

もう、この辺だけ見ておけば大丈夫。

[EBP-4] とかいろいろと書かれていますが、
ぱっと見で Intel 記法だなーと思ったら、 
右辺のものを左辺に移す(結果が左に入る)と言うことだけ考えながら見ていきます。

(AT&T 記法なら、左から右へ。)

 

・・・あとはこれをじっくり読むと、

def func(n):
	a = 0
	b = 1
	while b <=n:
		a += b
		b += 1
	a -= 2
	return a

print("FLAG{%d}" % func(0xFF))

 

こんな感じに書き直せる訳ですね。
(・・ Write-up の醍醐味が全力でスキップされている気がするのは気のせい)

でもって、実行すると  FLAG{32638} ということで。

 

・・・スキップされて分からない! って人は後で個別に連絡ください(汗

 


捏造された契約書を暴け

ディスクイメージが渡されるので、
この中のデータから捏造の証拠を出してね、というもの。

当初 MFT (Master File Table) を見ていまして、
$FILE_NAME の Create Time じゃないかと送信していましたがどうも通らず。

・・まさかーと思いながら “機密保持契約書.docx” ファイル内にあるファイルを見ていったところ、
中の jpg ファイルに Exif 情報として作成日時が乗っていまして、これが Flag.

 

・・・でも、 Exif としてファイルに書かれている情報よりも、
MFT の fnMFTModTime が “2012/5/23 04:56” になっている事の方が、
信頼性が高いと思うのですが、うーむ(

 


今回参加してみまして、結構楽しかったです。
ただ最近、片手間でCTF をする感じではマズいなーと思っていまして
(大会形式の CTF 以外はほぼやってませんし・・。)
ちょっと勉強なりを始めないとマズいかなと思ってます。

 

また、やはり思うのは

ということで、次こそはメンバー集まってワイワイやりたいですね!

(同じ大学のメンバーとは一緒にやりました。これはこれで楽しかったです。)

「勝ちに行くぞ-!」というような場合はあれですが、
基本的に SECCON は「みんなで楽しんでいこう-!」という感でやっているので
気の合う仲間と気楽にやっていきたいですね。

 

最後に、チームの他のメンバーが書いたブログへのリンクを貼り付けておきます。

あたがわさん:
http://blog.atgw.jp/archives/2865

hyt さん:
http://11haanyan24.com/seccon-2014-quals-online-japan%ef%bc%88write-up%ef%bc%89/

かーみーさん:
http://diary.carme-ln.net/2014/07/22/writeup-seccon-2014-online/

zip さん:
http://zipsan.pw/archives/305

『チームとしては正攻法ではないっぽい方法で解いたようなので』
・・ごめんなさい、私がこの問題のフラグを submit したあたりで察してください(

ではではー。

CentOS を 6 から 7 にアップグレードしてみた。


どうもみむらです。
先日まで某学会に出席していた関係で遅くなりました。

 

学会に向かう朝に Twitter を眺めていたら CentOS 7 が出た! というツイートが流れていまして

・・まじすか! もう CentOS 7 出たんか! でも時間が無い・・!
と思いながら、学会に行って、帰ってきました。

今日は普段の行いが最高に悪かった為か、
頭痛なり腹痛なり、とりあえず若者が掛かる「痛」のある程度の症状が出て
日中はダウンしていました。

日中は布団とトイレの往復を何度やって、段々と落ち着いてきたのでやろうか、と。

・・・そんなわけで今に至る訳です。

 

閑話休題

 

それではアップデートを。

良く纏まっているウェブサイトがありますので、基本的にはこちらに従う感じで。
http://abi.io/blogs/in-place-upgrade-centos-6-5-to-7-0-using-preupg.html

 

それと systemd ベースのシステムに変わるため、
十分に時間を確保できる状況になってからアップデートすることをおすすめします。

 

1. バックアップを取る

環境が壊れたとき、対応するのはやった人本人となりますので、
普通はバックアップしてから作業をすることを強くおすすめします。

 

2. 現行のシステムにおいて必要なアップデートを全部適用する

yum update
reboot

yum でアップデートして、再起動します。

 

3. Pre-Upgrade 用のツールをインストール

Windows でいうと「システム更新準備ツール」というところでしょうか。

下記URL にファイルが転がっているのでこれをインストールしていきます。
(依存しているパッケージのインストールも含め。)
http://dev.centos.org/centos/6/upg/x86_64/Packages/

 

yum -y install openscap pcre-devel libxml2-devel libxslt-devel m2crypto python-simplejson mod_wsgi

rpm -ihv http://dev.centos.org/centos/6/upg/x86_64/Packages/preupgrade-assistant-1.0.2-33.el6.x86_64.rpm
rpm -ihv http://dev.centos.org/centos/6/upg/x86_64/Packages/preupgrade-assistant-contents-0.5.13-1.el6.noarch.rpm
rpm -ihv http://dev.centos.org/centos/6/upg/x86_64/Packages/preupgrade-assistant-ui-1.0.2-33.el6.x86_64.rpm
rpm -ihv http://dev.centos.org/centos/6/upg/x86_64/Packages/python-rhsm-1.9.7-1.el6.x86_64.rpm
rpm -ihv http://dev.centos.org/centos/6/upg/x86_64/Packages/redhat-upgrade-tool-0.7.22-1.el6.noarch.rpm

4. Pre-Upgrade 用のツールを実行

root になってから preupg を実行します。
実行直後、英語で「ちゃんとバックアップとったか?」と聞かれるので
とっている場合 or システムが動かなくなってもがんばれる人 は “y” と回答して実行させます。

#su
Password: 

#preupg
Preupg tool doesn't do the actual upgrade.
Please ensure you have backed up your system and/or data in the event of a failed upgrade
 that would require a full re-install of the system from installation media.
Do you want to continue? y/n
y
....

 

5. アップグレード

redhat-upgrade-tool を実行します。
接続先は IIJ に。

redhat-upgrade-tool --network 7.0  --instrepo http://ftp.iij.ad.jp/pub/linux/centos/7/os/x86_64/ --force

–network : バージョン指定 (今回の場合は 7.0)
–instrepo : アップグレード用起動イメージの取得先 ( –instrepo=REPOID   get upgrader boot images from REPOID )

 

ヘルプを見ていて、もしかして “enablerepo” とかでも大丈夫じゃ・・とか思ったのですが

redhat-upgrade-tool --network 7.0  --enablerepo http://ftp.iij.ad.jp/pub/linux/centos/7/os/x86_64/
Usage: redhat-upgrade-tool <SOURCE> [options]

redhat-upgrade-tool: error: --instrepo is required with --network

とのことで。

処理は結構な時間がかかりますので、ニコニコ動画で好きな動画を見てくるとか、
コーヒーを煎れるとかそういうことをして暇をつぶすといいと思います。

testing upgrade transaction
rpm transaction 100% [====================================================================]
rpm install 100% [====================================================================]
setting up system for upgrade
Finished. Reboot to start upgrade.

・・ということで再起動します。

 

6. 再起動

再起動すると、5でダウンロードしたファイルを元に
アップグレード処理が始まります。

・・アップグレード用ツールが入ったブートイメージで起動して処理が行われるため、
完了するまで操作はできなくなります。

(Windows でいうところの Service Pack インストール時の起動直後にあるような、
更新しています・・ 80%.. みたいな状態になります。)

こちらも結構な時間がかかりますので、
お茶を煎れるとかで待っているといいと思います。

 

また、初回起動は結構な時間がかかります。
それも特に文字の表示が出ませんので、いろいろと不安になりますが長く待ちましょう。

2回目以降は早く起動します。(ただしこちらも文字表示等はなし)

 

7. いろいろと設定

今まで設定されていたサービスのいくつかが立ち上がっていないことに気づくかとおもいます。
でもって  ls /etc/init.d/ とかしてもすっからかん。

でもって /etc/init.d/README を読んでみると、
”systemd based の OS になったから、昔ながらの init スクリプトは ネイティブな systemd サービスファイルになったよ!”
と書かれています。

でもって、 “systemctl” コマンドを使ってくれとも書いてあります。

要は、
今まで “service named start” とやっていたのが
“systemctl start named” という感じになる
、ということで。

 

いくつか使いそうなものを書いておくと:

 

service named start (サービス開始)
→ systemctl start named

service named stop (サービス停止)
→ systemctl stop named

service named status (サービスの状況を確認する)
→ systemctl status named

chkconfig named on (サービスを自動起動設定する)
→ systemctl enable named

chkconfig named off (サービスを自動起動から外す)
→ systemctl disable named

 

こんな感じで、ちまちま設定していくと良さそうです。

 

・・また、どんなサービスがあったか忘れたよ! という場合は、

/usr/lib/systemd/system/

あたりを見ると、思い出すかもしれません。

 

また、 net-tools による制御 (ifconfig etc..) はどうも非推奨になったようなので、
yum remove net-tools を実行して、
ip addr による制御に慣れておくのもいいかもしれません。

 

8.見落としそうなところ

1. mysql は MariaDB に変わりました

MySQL が入っていた環境だと、 systemctl start mysqld をしても立ち上がらないので
不思議に思うかもしれませんがアップグレードの最中に消されるようです。

ただ、データは残っていますので、落ち着いて yum install mysql として、
MariaDB をインストールすれば大丈夫です。(自動的に移行されます)

→ yum install mariadb-server としてもインストール可能。

 

2.xinetd が止まってます。

xinetd に依存したサービスを動かしていた場合は
systemctl enable xinetd として有効にしてやる必要があります。

 

3.dovecot でメールが受信できない

Initialization failed: namespace configuration error: inbox=yes namespace missing

こんなエラーがログにたまっていて、接続はできるけれど読み出せない状況が発生します。

この場合は、
/etc/dovecot/conf.d/15-mailboxes.conf に

inbox = yes
の記述を追記
するか、

15-mailboxes.conf を削除すると動きます。

 

4. “/home/*/public_html” にコンテンツが置かれている場合に、どうもうまく Apache が動かない

/etc/httpd/conf.d/userdir.conf
に設定が記述されていますので、このあたりを編集してみるといいかと思います。

 

5.モジュールの読み込み周りで Apache が動かない

モジュールの読み込みに関しては、
/etc/httpd/conf.modules.d
で行うように変更されたようですので、そちらに。

 

6.iptables サービスが既定で Disabled になっている

これはファイアウォールの機能が “firewalld” に移ったため。
iptables をとりあえず有効にした後に、firewalld での書き方に移っていくといいかなと思います。

 

7.CentOS 6 のパッケージをきれいに消したい

rpm –qa | grep el6 | xargs rpm –e

こんなことすると幸せになれるかも。
ただ、何も考えずにこれを実行すると不幸せになるので、ちゃんと確認してから。

 

8./var/log にログファイルがない!

http://fedoraproject.org/wiki/Changes/NoDefaultSyslog

この辺にあるのですが、 “journalctl” コマンドを使用するように標準が変更されています。
もちろん、 rsyslog を入れて、サービスを有効にすれば今まで通りログが出てきますが、
”systemd journal” に管理を任せてみるのもよいのでは。

・・一応、
journalctl | grep dovecot  とかすれば、その製品だけのログを取りだしてくる事が出来ます。

 

9.postfix でメールが送れなくなった!

saslauthd による認証を行っている環境では、
saslauthd が止まっている事によってメールが送信できない事があります。

systemctl enable saslauthd
systemctl start saslauthd

で良い感じに。

 


・・あとで何か新しいことを見つけたら書き換えます・・。

とりあえず、このあたりまで・・。

Hyper-V でネットワークブリッジを作ってもパケットが出てこない場合のメモ。


ちょっと某所でやっていてハマったのでメモ。

次に書いたような設定を書いても、反対側の口から何も出てこなかった場合にチェック。

cloned_interfaces="bridge0"
ifconfig_bridge0="addm hn0 addm hn1 up"
ifconfig_hn0="up"
ifconfig_hn1="up"

チェックするところは下図で、オレンジ色で括っているところ。

image

「MAC アドレスのスプーフィングを有効にする」を ON にしているかどうかをチェック。