C++とブラックコードの出会い
2022-02-26 11:06:34
私が普段見ているオープンソースのコードの中には、いくつかのハッキングに出くわしたものがあります。要約すると
1. 数字を文字列に圧縮する
例えば、intの最大値が2^31倍と数字が多いので、文字列で書きたいのですが、どうすればいいですか?無意識のうちにそのように書いてしまうのですが、最初の4バイトだけで書く方法はないのでしょうか?もちろんありますよ。
string s;
s = to_string(INT_MAX);
次のコードでは、s2のビットに値が書き込まれ、4バイトしか使っていないことがよくわかります。強変換char*で彼のアドレスを取得します。
int num = INT32_MAX; // windows under INT_MAX also works
string s2((char*)&num,4);
cout << s2.size() << endl;
int ans = 0;
s2.copy((char*)&ans,4,0);
cout << ans << endl;
<イグ
2、関数がint32のパラメータしか受け付けないとき、私はどのようにint64値を渡したいですか?
64ビット変数を2つに分割する。Cloudwindの並列ライブラリのペアを書いています。下位32ビットをptr。上位32ビットをptr>>32とします。
uintptr_t ptr = (uintptr_t)sdu.get();// sdu is a smart pointer.
makecontext(&co->ctx,(void (*)(void))&Fiber::mainfunc,2,
(uint32_t)ptr, (uint32_t)(ptr>>32));
どのようにマージするのですか?各ビットに対してwith演算を行うだけです
void Fiber::mainfunc(uint32_t low32, uint32_t hi32) {
uintptr_t ptr = (uintptr_t)low32 | ((uintptr_t)hi32 << 32);
struct schedule* sdu = (struct schedule *)ptr;
}
int main(){
char* stack = (char*)malloc(20);
char ptr[20] = "hello world";
char* top = ptr + 20;
char dummy = 0;
int size = top - &dummy;
memcpy(stack,&dummy + 1,size - 1);
cout << "dummy address " << (long)&dummy << endl;
cout << "bottom-of-stack address " << (long)&ptr[0] << endl;
cout << "Top of stack Address " << (long)&ptr[19] << endl;
cout << "pointer value " << stack << endl;
free(stack);
return 0;
}
3. スタックスペースの利用
int main(){
char* stack = (char*)malloc(20);
char ptr[20] = "hello world";
char* top = ptr + 20;
char dummy = 0;
int size = top - &dummy;
memcpy(stack,&dummy + 1,size - 1);
cout << "dummy address " << (long)&dummy << endl;
cout << "bottom-of-stack address " << (long)&ptr[0] << endl;
cout << "Top of stack Address " << (long)&ptr[19] << endl;
cout << "pointer value " << stack << endl;
free(stack);
return 0;
}
スタック値は何だと思いますか?まさかのハローワールドです。
dummyはスタックの一番上に相当します。最後のビットの値はptr[0]なので、次のように書くことができます。
関連
-
戦闘機ゲームのC++実装(ソースコード)
-
C/C++共通エラーの概要
-
C++ - 文字列クラス超詳細紹介
-
ソースファイルをコンパイルするとDev C++のランタイムエラーが発生し、コンパイルできない
-
エラー: "***"の前にイニシャライザーがあります。
-
c++ experience summary(1):linux c compile with warning: assign makes pointer from integer without cast reason.
-
一意でないテーブル/エイリアス
-
C/C++ におけるランダム関数 rand() および srand() の使用法
-
C++共通ライブラリ関数一覧
-
ベクター使用時、ベクター添え字が範囲外、その他類似のエラーが発生する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
c++ プログラミング プロンプトの関数定義はここでは許可されません。
-
C++ std::string は NULL で初期化できない、基本的な使い方
-
vs2015 はソースファイル stdio.h を見つけることができない 解決策
-
コンパイルエラー: 制御が非ボイド関数の末尾に達する可能性がある
-
警告を表示します。ISO C++は文字列定数を'char*'に変換することを禁じています[-Write-strings]。
-
munmap_chunk():不正なポインタとSegmentation faultのバグを解決。
-
C++テンプレートテンプレート使用法まとめ
-
[エラー]'cout' はこのスコープで宣言されていません。
-
std::allocator<char>::~allocator()' への未定義の参照
-
デバッグエラー Assertion Failed 問題について