HOME»情報処理安全確保支援士掲示板»H30 春  午後1  問1  設問2  アドレスについて
投稿する

H30 春  午後1  問1  設問2  アドレスについて [1854]

 tonumaさん(No.1) 
攻撃者の指定したアドレスを0x12345678、改行コードを0x0aとした場合について、入力値の具体的なバイト列を答えよ。

という問題に対して、「%7s」という7文字の指定が入っているにも関わらず、「78563412」という8文字の値が何故許容されるのかわかりません。

基礎的な内容かもしれませんが、何度ググってもわからなかったので、教えていただけないでしょうか。
2025.03.09 01:00
来春再合格対策中さん(No.2) 
>%7s
文字の長さが7文字迄
文字列は最後に¥0
文字列としては7文字+区切1つなのでデータとしては8文字分となるかと。

文字列のはずか¥0を見つけられずバッファオーバーランですね。
2025.03.09 06:35
 tonumaさん(No.3) 
>来春再合格対策中 さま
早速のご教示ありがとうございます。

まだ少し理解できていないのですが、C++では一般的に
%7sと定義した場合は、その後に1文字の入力が許容されるというルールがある、
という理解で間違いないでしょうか?
2025.03.09 15:33
来春再合格対策中さん(No.4) 
いいえ。

図1 脆弱性が存在するC++ソースコード
19行目
name = new char[8]

22行目
scanf(

図4 ライブラリ関数の呼び出し時の動き
19行目で確保したメモリ領域が 22行目の標準関数でどのように参照されるかとなります。
2025.03.09 16:50
来春再合格対策中さん(No.5) 
>「78563412」という8文字
問われていることは、文字列ではなくて(文字列を格納するメモリ領域への)アドレスかと。
2025.03.09 17:23
 tonumaさん(No.6) 
ご教示ありがとうございます。すみません、まだよくわかっていません。

scanf("%7s%*[^\n]%*c", m_note->name);
と定義されている以上、
785634120a と入力したとして、
7856341 までしか読み込まれないのでは?と思いました。

もしくは、
scanf("%7s%  *  [^\n]%*c",...
とここにワイルドカードがあるため、最後の1文字「2」はここで許容されているということなのでしょうか。
2025.03.09 18:01
来春再合格対策中さん(No.7) 
mote->name に格納されているポインタ
mote->name が指すバッファ領域(9バイト)

過去問で問われているのはポインタですが
 tonumaさんのご質問はバッファ領域のお話ではないでしょうか。
そこで私は「バッファオーバーラン」となる例を投稿しました。
2025.03.10 06:13
通りすがりのおじさんさん(No.8) 
問題文て16進数とあるので785634120aはリトルエンディアンですので、入力値は12 34 56 78 0a。5文字かと
2025.03.10 06:36
マーシュさん(No.9) 
通りすがりのおじさん(No.8)さんがおっしゃっているように、
0x78 0x56 0x34 0x12 0x0aに該当する5文字を入力して攻撃アドレスを埋め込んでいる認識です。

文字'7'(0x37)'8'(0x38)を入力しているわけではありません。
scanfで読み込む文字としては5文字となるので"%7s"ではすべて読み取ってしまいます。

下線②の攻撃はBOFではなく、User-After-Freeだと思います。
2025.03.10 15:38
来春再合格対策中さん(No.10) 
UAF
ご指摘いただきありがとうございます。
2025.03.10 18:07
 tonumaさん(No.11) 
通りすがりのおじさんさん(No.8) 様、
マーシュさん(No.9) 様、
来春再合格対策中さん(No.10) 様

ありがとうございます。16進数の基本がわかっていないことがわかりました。
16進数では0x78が1文字カウントで、この場合は最初の4文字を読み込み、その後改行コードを読み込むことで、入力データの終端と認識されると理解しました。
2025.03.15 17:57
返信投稿用フォームスパム防止のためにスレッド作成日から40日経過したスレッドへの投稿はできません。
© 2014- 情報処理安全確保支援士ドットコム All Rights Reserved.

Pagetop