C を学習しているときに、初期化されていない文字配列の要素をいくつか間違えて出力してしまいました。
配列のサイズを非常に大きく、たとえば 100 万要素のサイズに拡張して内容を出力すると、出力される内容は常にユーザーが読み取れないわけではありませんが、ランタイム情報が含まれているように見えます。
次のコードを検討してください。
#include <stdio.h>
main() {
char s[1000000];
int c, i;
printf("Enter input string:\n");
for (i = 0; ( c = getchar()) != '\n'; i++) {
s[i] = c;
}
printf("Contents of input string:\n");
for (i = 0; i < 999999; i++) {
putchar(s[i]);
}
printf("\n");
return 0;
}
出力をスクロールするだけで、次のようなことがわかります。
?? ?l?? ??????_dyldVersionNumber_dyldVersionString_dyld_all_image_infos_dyld_fatal_error_dyld_shared_cache_ranges_error_string__mh_dylinker_header_stub_binding_helper_dyld_func_lookup_offset_to_dyld_all_image_infos__dyld_start__ZN13dyldbootstrapL30randomizeExecutableLoadAddressEPK12macho_headerPPKcPm__ZN13dyldbootstrap5startEPK12macho_headeriPPKcl__ZN4dyldL17setNewProgramVarsERK11ProgramVars__ZN4dyld17getExecutablePathEv__ZN4dyld22mainExecutablePreboundEv__ZN4dyld14mainExecutableEv__ZN4dyld21findImageByMachHeaderEPK11mach_header__ZN4dyld26findImageContainingAddressEPKv
また、
Apple Inc.1&0$U ?0?*?H??ot CA0?"0ple Certification Authority10U ?䑩 ??GP??^y?-?6?WLU????Kl??"0?>?P ? A??????f?$kУ????z ?G?[?73??M?i??r?]?_???d5#KY?????P??XPg? ?ˬ, op??0??C??=?+I(??ε??^??=?:??? ?b??q?GSU?/A????p??LE~ LkP?A??tb
?!.t?< ?A?3???0X?Z2?h???es?g^e?I?v?3e?w??-??z0?v0U?0U ?0?0U+?iG?v ??k?.@??GM^0U#0?+?iG?v ??k?.@??GM^0?U 0?0 ??H??cd0? ?0+ https: //www.apple.com/appleca/0?+0????いずれかの当事者によるこの証明書への依存は、その時点で適用される標準的な使用条件、証明書 poli?\6?Lx への同意を前提としています。 ?팛??w??v?w0O??=G7?@?,ω??s???d?yO4?>?x?k??}9??S ?8ı??O 01 ? H??[d?c3w?:,V??!ںsO??6?U٧??2B???q?~?R??B$*??M?^c?K?P???? ????7?uu!0?0??0
私の$PATH
環境変数が出力されたことさえあると思います。
初期化されていない変数の内容がセキュリティ リスクを引き起こす可能性はありますか?
更新 1
更新 2
したがって、これが実際にセキュリティ上のリスクであることは、回答から明らかです。これは私を驚かせます。
OSがそのメモリを初期化したプログラム以外のプログラムへのアクセスを制限できるように、プログラムがそのメモリ内容を保護されていると宣言する方法はありませんか?