91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ctf.#第二屆,逆向部分writeup——第四題

發布時間:2020-07-05 09:00:18 來源:網絡 閱讀:1210 作者:strawdog 欄目:安全技術

題目:見附件


這題開始有些小復雜了。

ctf.#第二屆,逆向部分writeup——第四題運行程序,可以看見界面如下

ctf.#第二屆,逆向部分writeup——第四題

注意看“隱藏信息完畢!”字符串的位置

ctf.#第二屆,逆向部分writeup——第四題

直接搜索push 40405c,找到代碼位置401a48。

網上翻找到代碼塊的入口地址4017a0。很顯然這是一個非常長的函數,使用IDA進行靜態分析。

  v2 = CreateFileA(*((LPCSTR *)v1 + 24), 0x80000000u, 1u, 0, 3u, 0x80u, 0);
  if ( v2 == (HANDLE)-1 )
  {
    result = CWnd::MessageBoxA(v1, &unk_4040D4, 0, 0);
  }
  else
  {
    v4 = CreateFileA(*((LPCSTR *)v1 + 26), 0x80000000u, 1u, 0, 3u, 0x80u, 0);
    hObject = v4;
    if ( v4 == (HANDLE)-1 )
    {
      result = CWnd::MessageBoxA(v1, &unk_4040BC, 0, 0);
    }
    else
    {
      v33 = CreateFileA(*((LPCSTR *)v1 + 25), 0x40000000u, 1u, 0, 2u, 0x80u, 0);
      if ( v33 == (HANDLE)-1 )
      {
        result = CWnd::MessageBoxA(v1, &unk_40409C, 0, 0);
      }
      else
      {
        SetFilePointer(v2, 2, 0, 0);
        ReadFile(v2, &Buffer, 4u, &NumberOfBytesWritten, 0);
        SetFilePointer(v2, 4, 0, 1u);
        ReadFile(v2, &v35, 4u, &NumberOfBytesWritten, 0);
        SetFilePointer(v2, 0, 0, 0);
        v5 = operator new(Buffer);
        lpBuffer = v5;
        ReadFile(v2, (LPVOID)v5, Buffer, &NumberOfBytesWritten, 0);
        v6 = (int)((char *)v5 + v35);
        v7 = GetFileSize(v4, 0);
        v31 = v7;
        v28 = operator new(v7);
        ReadFile(hObject, v28, v7, &NumberOfBytesWritten, 0);
        v8 = Buffer - v35 - 32;
        if ( 8 * v7 <= v8 )
        {
          v24 = v7;
          v9 = 16;
          do
          {
            LOWORD(v8) = *(_BYTE *)v6 & 1;
            v10 = v24 & 1;
            v8 ^= v10;
            if ( (_WORD)v8 )
            {
              v11 = (rand() & 1) == 0;
              v12 = *(_BYTE *)v6;
              if ( v11 )
                v13 = v12 - 1;
              else
                v13 = v12 + 1;
              *(_BYTE *)v6 = v13;
            }
            v24 >>= 1;
            ++v6;
            --v9;
          }
          while ( v9 );
          v14 = 16;
          v25 = v7 >> 16;
          do
          {
            LOWORD(v10) = *(_BYTE *)v6 & 1;
            v10 ^= v25 & 1;
            if ( (_WORD)v10 )
            {
              v11 = (rand() & 1) == 0;
              v15 = *(_BYTE *)v6;
              if ( v11 )
                v16 = v15 - 1;
              else
                v16 = v15 + 1;
              *(_BYTE *)v6 = v16;
            }
            LOWORD(v25) = (unsigned __int16)v25 >> 1;
            ++v6;
            --v14;
          }
          while ( v14 );
          v17 = 0;
          v26 = 0;
          if ( v7 )
          {
            do
            {
              v18 = 8;
              v19 = *((_BYTE *)v28 + v17);
              do
              {
                if ( (v19 ^ *(_BYTE *)v6) & 1 )
                {
                  v11 = (rand() & 1) == 0;
                  v20 = *(_BYTE *)v6;
                  if ( v11 )
                    v21 = v20 - 1;
                  else
                    v21 = v20 + 1;
                  *(_BYTE *)v6 = v21;
                }
                v19 >>= 1;
                ++v6;
                --v18;
              }
              while ( v18 );
              v17 = v26++ + 1;
            }
            while ( v26 < v31 );
          }
          v22 = lpBuffer;
          v23 = v33;
          WriteFile(v33, lpBuffer, Buffer, &NumberOfBytesWritten, 0);
          operator delete((void *)v22);
          operator delete(v28);
          CloseHandle(v2);
          CloseHandle(hObject);
          CloseHandle(v23);
          result = CWnd::MessageBoxA(v30, &unk_40405C, 0, 0);
        }
        else
        {
          result = CWnd::MessageBoxA(v30, &unk_40406C, "Caption", 0);
        }
      }
    }
  }
  return result;

要理解代碼,首先要了解bmp文件的格式,可以參考http://www.cnblogs.com/kingmoon/archive/2011/04/18/2020097.html。

實際上,題目的算法是跳過bmp文件頭和最前面的32字節的像素,然后每8個字節編碼一個所要加密的明文字節。其中用每一個像素字節的最后一位來表示要加密的明文字節的響應位。

代碼中+1、-1實際上就是當像素字節的最后一位與明文字節對應位不一致時,修正到相同。


所以知道了算法就知道如何解密:取出藏有密文的字節的最后一位,拼出相應的明文。

提取源代碼就不貼了。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

锦州市| 花垣县| 大理市| 荆州市| 临海市| 西城区| 明溪县| 益阳市| 镇远县| 浦城县| 色达县| 盐源县| 南江县| 彰化市| 涞水县| 剑川县| 渝北区| 孟津县| 台南县| 开封县| 应用必备| 乃东县| 连江县| 玉环县| 昌宁县| 盐亭县| 黎城县| 长沙县| 呼伦贝尔市| 宜丰县| 牟定县| 交口县| 同江市| 泰和县| 平潭县| 临澧县| 长垣县| 通河县| 上饶市| 抚松县| 宁河县|