451 :
デフォルトの名無しさん:03/09/26 22:07
危険だなこれ。
Delphi は Borland の提供する Windows アプリケーションの統合開発環境です。
Delphi に付属するクラスライブラリ VCL に含まれる
TComboBox (コンボボックスを抽象化したクラス)
TListBox (リストボックスを抽象化したクラス)
TToolBar (ツールバーを抽象化したクラス)
TListView (リストビューを抽象化したクラス)
の各クラスにはバッファオーバーフローを引き起こすバグがあることがわかり
ました。
このバッファオーバーフローにより Delphi によって作成されたアプリケーシ
ョンには、任意のコードが実行可能なセキュリティホールが存在し得ます。
ヘジたんが書いたコードかこれ?
じゃC#や.NETもやばいかも。
>>453 これを利用してアタックできるぐらいなら、
直にアタックできるんじゃねー?
どういう状況を想定してるの?
ネットワークから取得したデータを直にリストボックスの文字列に流し込んでる
奴とかかな?
サーバーのサービスプロセスとかじゃリストボックス使うなんてありえねえし。
WindowsAPIで今回のCB_GETLBTEXTメッセージみたいに
バッファサイズの指定が無いのはヤバイっつー事だな。
しかし、今回の件で色々勉強したよ。 これはC#じゃ経験出来ない勉強だね。 Delphiマンセー
C# にもあるんだが。
>>459 C# というより .NET Framework だよ。WinForm の先はいつもの GDI。そこはオーバーフローチェックのない世界。
>>455 ヴビ厨のコピペなんだから,理解してない彼らに聞いても無駄だよ
でもパッチ出して欲しい…
なんでパッチが必要なの?
Personal だから?
謎の急浮上!
パッチは要らないだろう。
ようするにコントロールのItemには行数制限をしてから設定するようにすればいいだけ。
465 :
デフォルトの名無しさん:03/09/28 10:13
今日は バッファオーバーフロー のお勉強だ。
Delphiでこういうスタイルのコードを書く人はあまりいないだろうがCでは 文字列ではなく
ポインタを使って文字をやりとりする事が多い。
procedure hoge(p:PChar);
var buf:array [0..3] of char;
var i:Integer;
begin
i:=0;
while p^<>#0 do begin buf[i]:=p^;inc(p);inc(i);end;
end;
良くないコードだが、必ず4文字以下の文字しか渡さないという条件ならでなら悪くはない。
シンプルだし、高速に動く。さて、このコードがどうコンパイルされるか見てみよう。
1: PUSH ECX ;これで buf の4byteの領域を確保している
2: XOR EDX,EDX
3: JMP +5; (7行目に分岐)
4: MOV BYTE PTR [ESP+EDX{i}],CL ;buf[i]:=p^
5: INC EAX{p}
6: INC EDX{i}
7: MOV CL,BYTE PTR [EAX{p}] p^
8: TEST CL,CL p^<>#0
9: JNE -11; (4行目に分岐)
10: POP EDX ;これで buf の4byteの領域を開放
11: RET NEAR ;呼び出し元へ帰る
466 :
デフォルトの名無しさん:03/09/28 10:17
解放(^_^;)
467 :
デフォルトの名無しさん:03/09/28 10:22
ここで、ローカル変数のうち buf はスタック上に、i はレジスタに割り当てられている。
スタック上は結局
sp buf[0..3]
sp+4 帰り番地
が構成されている。
ここで、もし hoge('1234ABCD'); と、この関数が呼ばれたらどうなるだろうか?
このコードには、bufのサイズを考慮していないため、
sp+0 '1'
sp+1 '2'
sp+2 '3'
sp+3 '4'
sp+4 'A' #$41
sp+5 'B' #$42
sp+6 'C' #$43
sp+7 'D' #$44
となる。 sp+4~sp+7は帰り番地であるため、アセンブラのRET命令を実行すると
RET命令により44434241番地に分岐する事になる。 ここはたぶんメモリを確保していない
領域だろうから、メモリ保護例外が出る事になる。
468 :
デフォルトの名無しさん:03/09/28 10:44
さて、保護例外が出るだけなら、そう大ききな問題ではない。
好きな番地に分岐させられたとしても、その分岐先が意味のないコードなら、やはりそう大きな問題ではない。
これを使って外部のパソコンから任意のプログラムが実行されてしまうとなると、これは大ききな問題だ。
どうして、任意のプログラムが実行されてしまうのだろうか?
まず、実行ファイルは 指定された場所が空いていれば常にそのアドレスにロードされる。
そのアドレスは プロジェクト->オプション->リンカタブ->メモリサイズ枠->イメージアドレス で指定される。
そして、スタックポインタも常に同じ場所からスタートする。
だから、この手続きが呼ばれる時のアドレス関係はは他のパソコンでも同じという事になる。
プログラムを解析されれば、絶対番地はどのパソコンでも通用する情報となってしまうという事だ。
さらに、Windowsはフラットメモリモデルを採用している。 だから、メモリ空間が読み取り可能であるならどこで
も実行出来てしまう。 それはデータ領域でも、スタック領域でもだ。
この結果、好きな番地に分岐させられるなら、文字列にコードを埋め込むなりして、任意のプログラムが実行
出来てしまうわけだ。
469 :
デフォルトの名無しさん:03/09/28 23:55
わけだ
470 :
デフォルトの名無しさん:03/09/30 15:31
>>468 うぷぷ。長文ご苦労様。
でも全然理解してないのバレバレだよ(w
471 :
デフォルトの名無しさん:03/10/03 23:27
バッファオーバーフローマンセー
type TSavePos1=record
Rect:TRect; //位置情報
obj :TControl;//コンポーネントへの参照
end;
type TSaveControls=record
FormRect:TRect;//フォームのサイズ
Saves :array of TSavePos1;
end;
function SaveControlPos(form:TWinControl):TSaveControls;
var i:Integer;
begin
Result.FormRect:=form.ClientRect;
SetLength(Result.Saves,form.ControlCount);
for i:=0 to form.ControlCount-1 do with Result.Saves[i] do begin
obj :=form.Controls[i]; Rect :=obj.BoundsRect ;
end;
end;
procedure SaveControlRePos(form:TWinControl;const datas:TSaveControls);
var i:Integer; var ax,ay:double;
begin
with datas.FormRect do begin
ax:= form.Width / ( Right -Left ) ; ay:= form.Height / ( Bottom-Top ) ;
end;
for i:=0 to form.ControlCount-1 do
with datas.Saves[i] do
if obj.Parent=form then begin
obj.Left :=round(ax* Rect.Left);
obj.Width :=round(ax*(Rect.Right-Rect.Left) );
obj.Top :=round(ax*(Rect.Top ));
obj.Height:=round(ax*(Rect.Bottom-Rect.Top));
end;
end;
>>472の使い方
var SaveControls:TSaveControls; //これはフォームのメンバーにおいて
procedure TForm1.FormCreate(Sender: TObject);
begin
SaveControls:=SaveControlPos(Self);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
SaveControlRePos(Self, SaveControls);
end;
あ、何をするものか書くの忘れた。
>>472-473 はフォームのりサイズに応じて自動的に再配置します
フォントのリサイズとかは自分で追加して下さい。
Mac、逆・マンセー。
477 :
デフォルトの名無しさん:03/11/04 10:45
ひょっとして、Delphi8って.NETのコードしか吐けなくなるんですか?
478 :
デフォルトの名無しさん:03/11/04 16:51
>>475 おお、MacOS版Delphiでるんかい。
これでやっと、Macのソフト作る気になる。
>>477 いまのところ知られている情報ではそのとおり。
>>478 これは、「MacOS版Delphiが出る」のではなく、「Borlandに『出してくれ』
とお願いするための署名運動」だよ。
petitionの意味は、陳情、嘆願するという意味。
いまのところ出そうな雰囲気はない。
出るとしたら、MacOSX用の.NET Frameworkが開発されるか、Qt-CLXを
Delphi用にコンバートしたときになると思う。後者の可能性はBorland社
幹部が数年前に言及したことがあるので、もしかするとあり得るのかも知れないけど
MacOSXのシェアとか、JBuilder for MaxOSXの現在の売れ行きを考えると
よほどのことがない限り作られないだろうし、仮に出たとしても1年以上あと
になるだろうね。
MacOSもVBのようなRAD環境がほとんどなかったことがWindowsの後塵を拝した
ひとつの原因だったと思うのだが(RBは話にならない)。
>>479 >JBuilder for MaxOSXの現在の売れ行きを考えると
ま た 社 員 か
>VBのようなRAD環境
HyperCard .....
>>479 >これは、「MacOS版Delphiが出る」のではなく、「Borlandに『出してくれ』
>とお願いするための署名運動」だよ。
そうだったのか、残念。
Macがんばれ!!
なんでマカーは自分でつくろうとは思わんのだ
マカーはバカーだから。
484 :
Macは糞も同感ですが:03/11/14 00:18
「マンセー」??バカじゃないの?あんた。
485 :
Macは糞も同感ですがの詳細:03/11/14 00:28
お断り。このコメントは
>>483さんに対する物では有りません。
マンセー?何処の言葉?信じられない。Delphiはもっと包容力のある言語なはずなのに
なんで?変。
>>1。
2ch で、そんなにマジれすするなよ...
もっと有意義な時間の使い方を考えなさいな。
おまえがな
オレがな←
MacOSXへのリプレースが進めば何の問題も無いだろ。
CBuilderXでwxWindowsが使えるんなら、
wx用のダイアログエディターはあるんだし、
WideStudioも動作するそうだ。
Macの9以前は癌細胞だな。
問題は頑固な9や8のユーザーをすんなりXに移行させることだろうけど。
Macは何もかもゴミ。
ドウモ~~~ッ!!お~o(´・∀・`)oは~♪ハジメマシテ~~~ッ☆☆(´・∀・`)
私は??歳の胴無ししてるのぉ~~~っ♪(´・∀・`)ウフフフ
うーんとー、私胴無し仲間がすっごくすっごく欲しくってー、\(´・∀・`)/
探してたら(´・∀・`)なんσ(´・∀・`)とっ!☆彡(ノ´・∀・`)ノ☆彡ヘ(´・∀・`ヘ)☆彡(ノ´・∀・`)ノ☆彡
素敵∑(´・∀・`ハウッ!な胴有り♪を発見!!!!(´・∀・`)//""" パチパチパチ
肉袋∑(´・∀・`ハウッ!とか…{{ (´・∀・`) }} ブルブルすごい数の内臓がありますけど、
これ全部1つの胴に収まって \(´・∀・`)/ いるんですか?(´・∀・`)ひどすぎ …
てなわけで、ついついσ(´・∀・`)蹴っちゃったC= C= C= C=┌(´・∀・`)┘ のらー(´・∀・`) エヘヘφ(´・∀・`)φキックキック♪
胴無しに、なってσ(´・∀・`)くれるよねっ。(´・∀・`) お ね が い♪(´・3・`)ちゅ♪ッ
え?くれないのぉ~?(´・∀・`))そんなのいやい♪(´・∀・`)キャハ や~~、ガ━━━(´・∀・`)━━━ン
なってくれなかったら、(´・∀)_乂(∀・`) 勝負! \(´・∀・`)/
☆⊂(´・∀・`) きーっく、☆(~~~~~~(⊂(´・∀・`) バ シ ュ ウ ウ ウ ウ ウ ウ!!♪(´・∀・`)キャハ(´・∀・`)⊃)~~~~~~)・;'キーック
(´・∀・`) いてっ!ダメ!! ゛o(´・∀・`)oo(´・∀・`)o″ダメ!! ~~~~~~
(´・∀・`)きゃ~~(´・∀・`)失敗した~~(゜∀。) ドテッ ガ━━(´・∀・`;)━━ン!
(´・∀・`) 反省中。。。。・゚゚・o(´・∀・`)o・゚゚・。うぇぇん <(´・∀・`;)>ノォオオオオオ!! ∑(´・∀・`;ハウッ!
なあんて(´・∀・`)こんな♪(´・∀・`)ウフフフ 私っ!σ(´・∀・`)だけど、(´・∀・`)
胴無しσ(´・∀・`)になってm(´・∀・`)mくださいませませ♪(´・∀・`)フフ ドガ━━━Σ(´・∀・`)━━━━━ン
ということで。(´・∀・`)vじゃあね~~~♪(´・∀・`)/~~ ほんじゃo´・∀・`ヽ)(/´・∀・`)o レッツゴー♪
それでは、今から他の胴有り∑(´・∀・`;ハウッ!の家も色々見てきまーすC= C= C= C=┌(´・∀・`)┘
(´・∀・`)ノ~~マタネー☆'.・*.・:★'.・*.・:☆'.・*.・:★
492 :
デフォルトの名無しさん:03/12/15 23:52
氏ね
殺せ
496 :
デフォルトの名無しさん:04/01/25 13:25
ま、うんせー
643 :デフォルトの名無しさん :04/01/25 13:24
Delphi最高~~~~~~~~~~~
イェーイ~~~~~~~~~~~~~~~
496 :デフォルトの名無しさん :04/01/25 13:25
ま、うんせー
283 :デフォルトの名無しさん :04/01/25 13:26
Delphiはもうとっくに死んでいる。
日曜日だとすることも無いのか?
499 :
VB.NET使い(勝ち組):04/02/29 17:12
何か哀れで叩くこともできないな・・・。> Delphi
互角に争ってた頃が懐かしい。
500ゲト