HOME»情報処理安全確保支援士掲示板»H30 春 午後1 問1 設問2 アドレスについて
投稿する
文字の長さが7文字迄
文字列は最後に¥0
文字列としては7文字+区切1つなのでデータとしては8文字分となるかと。
文字列のはずか¥0を見つけられずバッファオーバーランですね。
早速のご教示ありがとうございます。
まだ少し理解できていないのですが、C++では一般的に
%7sと定義した場合は、その後に1文字の入力が許容されるというルールがある、
という理解で間違いないでしょうか?
問われていることは、文字列ではなくて(文字列を格納するメモリ領域への)アドレスかと。
H30 春 午後1 問1 設問2 アドレスについて [1854]
tonumaさん(No.1)
攻撃者の指定したアドレスを0x12345678、改行コードを0x0aとした場合について、入力値の具体的なバイト列を答えよ。
という問題に対して、「%7s」という7文字の指定が入っているにも関わらず、「78563412」という8文字の値が何故許容されるのかわかりません。
基礎的な内容かもしれませんが、何度ググってもわからなかったので、教えていただけないでしょうか。
という問題に対して、「%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行目の標準関数でどのように参照されるかとなります。
図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」はここで許容されているということなのでしょうか。
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さんのご質問はバッファ領域のお話ではないでしょうか。
そこで私は「バッファオーバーラン」となる例を投稿しました。
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だと思います。
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文字を読み込み、その後改行コードを読み込むことで、入力データの終端と認識されると理解しました。
マーシュさん(No.9) 様、
来春再合格対策中さん(No.10) 様
ありがとうございます。16進数の基本がわかっていないことがわかりました。
16進数では0x78が1文字カウントで、この場合は最初の4文字を読み込み、その後改行コードを読み込むことで、入力データの終端と認識されると理解しました。
2025.03.15 17:57