1. ホーム
  2. C++

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]なので、次のように書くことができます。