Windows 2000 で DsGetDcOpen を実行するときの注意
Windows 2000 で DsGetDcOpenW を実現するために 一旦データを格納してWideChar をMultiByte に展開から 関数を呼んで 格納したデータを解放したところ…。
続く DsGetDcNext で
Erro 0x103(ERROR_NO_MORE_ITEMS) や 0x57 (ERROR_INVALID_PARAMETER) が出て困った
NetApiBufferFree を呼ぶのをやめたところ…正常に動作するようになったのだけど、Windows 2000 の場合 渡したドメイン情報のアドレスを渡した後、データの中身 をそのまま保持する必要があるようだ(; ˘ω˘)
何という酷い実装だ。
実証コード書いてみた
char pppp[256]="test.mof.or.jp"; HANDLE p; xx=DsGetDcOpen(pppp,2,0,0,0,0x40,&p); memset(pppp,0,256); yy=DsGetDcNext(p,&co,&soc,ppx); printf("DsGetDcOpen:%d %x\n",xx,p); printf("DsGetDcNext:%d %d %d %d\n",yy,co,soc); DsGetDcClose(p); |
実行結果
DsGetDcOpen:0 133080 DsGetDcNext:259 0 0 0 |
ちなみに memset を削除するとちゃんと動く。
Windows XP や Windows 10 だと memset があっても問題ない
試しに Windows XP の netapi32.dll をコピーして動作させたところ動くのが確認できた(; ˘ω˘)
そのまま保持する必要があるだけじゃなくて、
書き換わるとそっちにアクセスしちゃう脆弱性があったり……しない?
どのようにしてdllファイルにアクセスして変更できますか?
どのように脆弱性を見つけますか?
>>3
意味が良く分かりません。
何がしたいのでしょうか?
コードASMをコードC ++に変換したい