2016腾讯安全挑战赛第一轮-PC游戏方向
生活随笔
收集整理的這篇文章主要介紹了
2016腾讯安全挑战赛第一轮-PC游戏方向
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
0x00 查殼
無殼的VC程序
0x01 測試
沒有消息彈窗,嘗試對函數下斷點。
OD載入后,Ctrl+N查找函數,找到GetDlgItem
程序運行起來,等輸入完后點擊確定后程序斷下。一路F8就來到這里
00401EED . E8 6A5B0000 call Tencent2.00407A5C 00401EF2 . 8B40 20 mov eax,dword ptr ds:[eax+0x20] ; | 00401EF5 . 8B3D 24334200 mov edi,dword ptr ds:[<&USER32.SendMessa>; |USER32.SendMessageA 00401EFB . 50 push eax ; |hWnd 00401EFC . FFD7 call edi ; \SendMessageA 00401EFE . 8D8C24 A0010000 lea ecx,dword ptr ss:[esp+0x1A0] 00401F05 . 51 push ecx 00401F06 . 6A 40 push 0x40 00401F08 . 6A 0D push 0xD 00401F0A . 68 E9030000 push 0x3E9 00401F0F . 8BCE mov ecx,esi 00401F11 . E8 465B0000 call Tencent2.00407A5C 00401F16 . 8B50 20 mov edx,dword ptr ds:[eax+0x20] 00401F19 . 52 push edx 00401F1A . FFD7 call edi 00401F1C . 8D8424 9C000000 lea eax,dword ptr ss:[esp+0x9C] 00401F23 . C64424 74 D7 mov byte ptr ss:[esp+0x74],0xD7 00401F28 . C64424 75 A2 mov byte ptr ss:[esp+0x75],0xA2 00401F2D . C64424 76 B2 mov byte ptr ss:[esp+0x76],0xB2 00401F32 . C64424 77 E1 mov byte ptr ss:[esp+0x77],0xE1 00401F37 . 885C24 78 mov byte ptr ss:[esp+0x78],bl 00401F3B . 885C24 79 mov byte ptr ss:[esp+0x79],bl 00401F3F . 885C24 7A mov byte ptr ss:[esp+0x7A],bl 00401F43 . 885C24 7B mov byte ptr ss:[esp+0x7B],bl 00401F47 . 885C24 7C mov byte ptr ss:[esp+0x7C],bl 00401F4B . C64424 7D CA mov byte ptr ss:[esp+0x7D],0xCA 00401F50 . C64424 7E A7 mov byte ptr ss:[esp+0x7E],0xA7 00401F55 . C64424 7F B0 mov byte ptr ss:[esp+0x7F],0xB0 00401F5A . C68424 80000000 DC mov byte ptr ss:[esp+0x80],0xDC 00401F62 . C68424 81000000 B3 mov byte ptr ss:[esp+0x81],0xB3 00401F6A . C68424 82000000 C9 mov byte ptr ss:[esp+0x82],0xC9 00401F72 . C68424 83000000 B9 mov byte ptr ss:[esp+0x83],0xB9 ; 這里是填好顯示的內容,注冊失敗,注冊成功 00401F7A . C68424 84000000 A6 mov byte ptr ss:[esp+0x84],0xA6這里是將顯示內容存起來,等下計算完后使用。
函數在401E60位置,IDA打開程序后查看代碼
這樣大致可以看出程序的流程了。
Created with Rapha?l 2.2.0開始輸入用戶名長度是否小于21且大于6?對用戶名進行運算調用sub_401960比較計算serial結果長度是否等于20?計算出來的serial結果是否滿足條件顯示注冊成功結束顯示注冊錯誤yesnoyesnoyesno具體流程得出后,可以逐一分析了。
0x02分析
1 對用戶名進行運算
do{ // 將用戶名進行運算v6 = v5 % v4; //v4是用戶名長度v7 = &v44[v5++];*v7 += v4 * ((_DWORD)v7 + 20160126 - (_DWORD)v44) * lParam[v6];}while ( v5 < 16 );這個v7的地址-v44的地址等于v5,故可以轉化為
*v7 += v4*(20160126+v5)*lParam[v6];2 調用sub_401960
··· //省略v8 = v14 + 1;v32 = v15 + 1;v31 = v8;if ( v15 == 3 ) //意味著每4個字符就在進入這個判斷里進行運算{v16 = 0;do{v26 = *((_BYTE *)&v30 + v16);*((_BYTE *)&v30 + v16++) = sub_402420(&v26);// 計算字符在42E040表中的位置}while ( v16 < 4 );v27 = 4 * v30 + ((BYTE1(v30) >> 4) & 3);v17 = BYTE2(v30) << 6;v28 = 16 * BYTE1(v30) ^ HIBYTE(v17) & 0xF;v29 = BYTE3(v30) + v17;v18 = 0; ···//省略 //如果說輸入的serial長度不為4的倍數,那就到這里來繼續進行運算do{v26 = *((_BYTE *)&v30 + v21);*((_BYTE *)&v30 + v21++) = sub_402420(&v26);}while ( v21 < 4 );v27 = 4 * v30 + ((BYTE1(v30) >> 4) & 3);v29 = BYTE3(v30) + (BYTE2(v30) << 6);result = v32 - 1;v22 = 0;v28 = 16 * BYTE1(v30) ^ (BYTE2(v30) >> 2) & 0xF;這個也很好理解
看到v27,v28,v29就可以看出這里的運算時將輸入的serial每4個字符轉成3個值。
3 比較serial長度
剛剛說到是將serial的每4個字符轉為3個值,所以說當轉化的值的個數為20個時才允許繼續往下,測試幾次就知道是只有當輸入的serial長度為27時,轉化得到的個數才為20
4 滿足條件比較
注意到輸入的用戶名需要進行兩次運算,第一是計算出值。第二次是將這些值除以10
這里假設對用戶名進行兩次運算后儲存在U中,而對serial計算的結果儲存在K中,當滿足下面條件時才能注冊成功
變換一下位置,就能通過U來計算出K了,然后可以枚舉一下所有可能,也就是0-63,就能找出滿足K的字符串
總結
以上是生活随笔為你收集整理的2016腾讯安全挑战赛第一轮-PC游戏方向的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大理房价多少钱一平米啊?
- 下一篇: “惟见独飞鸟”下一句是什么