日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

2016腾讯安全挑战赛第一轮-PC游戏方向

發(fā)布時(shí)間:2023/12/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2016腾讯安全挑战赛第一轮-PC游戏方向 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0x00 查殼


無(wú)殼的VC程序

0x01 測(cè)試


沒(méi)有消息彈窗,嘗試對(duì)函數(shù)下斷點(diǎn)。

OD載入后,Ctrl+N查找函數(shù),找到GetDlgItem

程序運(yùn)行起來(lái),等輸入完后點(diǎn)擊確定后程序斷下。一路F8就來(lái)到這里

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 ; 這里是填好顯示的內(nèi)容,注冊(cè)失敗,注冊(cè)成功 00401F7A . C68424 84000000 A6 mov byte ptr ss:[esp+0x84],0xA6

這里是將顯示內(nèi)容存起來(lái),等下計(jì)算完后使用。
函數(shù)在401E60位置,IDA打開(kāi)程序后查看代碼

if ( (unsigned int)(v4 - 6) > 0xE ) // 用戶(hù)名長(zhǎng)度要求goto LABEL_24; // 注冊(cè)失敗···do{ // 將用戶(hù)名進(jìn)行運(yùn)算v6 = v5 % v4;v7 = &v44[v5++];*v7 += v4 * ((_DWORD)v7 + 20160126 - (_DWORD)v44) * lParam[v6];} ···sub_401960((int)&v17, v9, (int)&v32); //計(jì)算輸入的serial···if ( v19 - (_DWORD)v18 != 20 ) //這里是由上面的401960算出來(lái)的,不滿(mǎn)足就注冊(cè)失敗{v52 = -1;sub_4022C0(&v17); LABEL_24:v14 = 0;goto LABEL_25;}···do{v12 = *(_DWORD *)&v44[v11] / 10; // 這里是將上面的用戶(hù)名運(yùn)算結(jié)果看作是有符號(hào)數(shù),然后除以10v13 = v19 - (_DWORD)v10;*(int *)((char *)&v21 + v11) = v12;if ( v11 >= v13 ){_invalid_parameter_noinfo(v12);v10 = (char *)v18;}*(int *)((char *)&v26 + v11) = *(_DWORD *)&v10[v11]; //這里是serial算出來(lái)的值v11 += 4;}while ( v11 < 20 );if ( v30 + v21 != v28 || v28 + v22 != 2 * v30 || v29 + v23 != v26 || v26 + v24 != 2 * v29 || v25 + v27 != 3 * v23 )// 這里比較是否滿(mǎn)足條件,滿(mǎn)足條件就成功

這樣大致可以看出程序的流程了。

Created with Rapha?l 2.2.0開(kāi)始輸入用戶(hù)名長(zhǎng)度是否小于21且大于6?對(duì)用戶(hù)名進(jìn)行運(yùn)算調(diào)用sub_401960比較計(jì)算serial結(jié)果長(zhǎng)度是否等于20?計(jì)算出來(lái)的serial結(jié)果是否滿(mǎn)足條件顯示注冊(cè)成功結(jié)束顯示注冊(cè)錯(cuò)誤yesnoyesnoyesno

具體流程得出后,可以逐一分析了。

0x02分析

1 對(duì)用戶(hù)名進(jìn)行運(yùn)算

do{ // 將用戶(hù)名進(jìn)行運(yùn)算v6 = v5 % v4; //v4是用戶(hù)名長(zhǎng)度v7 = &v44[v5++];*v7 += v4 * ((_DWORD)v7 + 20160126 - (_DWORD)v44) * lParam[v6];}while ( v5 < 16 );

這個(gè)v7的地址-v44的地址等于v5,故可以轉(zhuǎn)化為

*v7 += v4*(20160126+v5)*lParam[v6];

2 調(diào)用sub_401960

··· //省略v8 = v14 + 1;v32 = v15 + 1;v31 = v8;if ( v15 == 3 ) //意味著每4個(gè)字符就在進(jìn)入這個(gè)判斷里進(jìn)行運(yùn)算{v16 = 0;do{v26 = *((_BYTE *)&v30 + v16);*((_BYTE *)&v30 + v16++) = sub_402420(&v26);// 計(jì)算字符在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; ···//省略 //如果說(shuō)輸入的serial長(zhǎng)度不為4的倍數(shù),那就到這里來(lái)繼續(xù)進(jìn)行運(yùn)算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;

這個(gè)也很好理解
看到v27,v28,v29就可以看出這里的運(yùn)算時(shí)將輸入的serial每4個(gè)字符轉(zhuǎn)成3個(gè)值。

3 比較serial長(zhǎng)度
剛剛說(shuō)到是將serial的每4個(gè)字符轉(zhuǎn)為3個(gè)值,所以說(shuō)當(dāng)轉(zhuǎn)化的值的個(gè)數(shù)為20個(gè)時(shí)才允許繼續(xù)往下,測(cè)試幾次就知道是只有當(dāng)輸入的serial長(zhǎng)度為27時(shí),轉(zhuǎn)化得到的個(gè)數(shù)才為20

4 滿(mǎn)足條件比較
注意到輸入的用戶(hù)名需要進(jìn)行兩次運(yùn)算,第一是計(jì)算出值。第二次是將這些值除以10
這里假設(shè)對(duì)用戶(hù)名進(jìn)行兩次運(yùn)算后儲(chǔ)存在U中,而對(duì)serial計(jì)算的結(jié)果儲(chǔ)存在K中,當(dāng)滿(mǎn)足下面條件時(shí)才能注冊(cè)成功

  • U1U_1U1? + K5K_5K5? == K3K_3K3?
  • U2U_2U2? + K3K_3K3? == 2K52K_52K5?
  • K4K_4K4? + U3U_3U3? == K1K_1K1?
  • U4U_4U4? + K1K_1K1? == 2K42K_42K4?
  • U5U_5U5? + K2K_2K2? == 3U43U_43U4?
  • 變換一下位置,就能通過(guò)U來(lái)計(jì)算出K了,然后可以枚舉一下所有可能,也就是0-63,就能找出滿(mǎn)足K的字符串

    總結(jié)

    以上是生活随笔為你收集整理的2016腾讯安全挑战赛第一轮-PC游戏方向的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。