首页
社区
课程
招聘
[旧帖] [求助]这个如何计算得到正确的密码 0.00雪花
发表于: 2008-8-6 10:45 4683

[旧帖] [求助]这个如何计算得到正确的密码 0.00雪花

2008-8-6 10:45
4683
0040106A  |$  55            PUSH EBP
0040106B  |.  8BEC          MOV EBP,ESP
0040106D  |.  83C4 F8       ADD ESP,-8
00401070  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; /String
00401073  |.  E8 94010000   CALL <JMP.&kernel32.lstrlenA>            ; \lstrlenA
00401078  |.  8BC8          MOV ECX,EAX
0040107A  |.  83F9 06       CMP ECX,6
0040107D  |.  75 7E         JNZ SHORT Butland'.004010FD
0040107F  |.  FF75 0C       PUSH DWORD PTR SS:[EBP+C]                ; /String
00401082  |.  E8 85010000   CALL <JMP.&kernel32.lstrlenA>            ; \lstrlenA
00401087  |.  8BC8          MOV ECX,EAX
00401089  |.  83F9 06       CMP ECX,6
0040108C  |.  75 6F         JNZ SHORT Butland'.004010FD
0040108E  |.  8B75 08       MOV ESI,DWORD PTR SS:[EBP+8]             ;  ESI指向用户名
00401091  |.  B9 04000000   MOV ECX,4
00401096  |.  33FF          XOR EDI,EDI
00401098  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]
0040109A  |.  8A5E 01       |MOV BL,BYTE PTR DS:[ESI+1]
0040109D  |.  32C3          |XOR AL,BL
0040109F  |.  3E:88443D F8  |MOV BYTE PTR DS:[EBP+EDI-8],AL
004010A4  |.  83C6 02       |ADD ESI,2
004010A7  |.  47            |INC EDI
004010A8  |.^ E2 EE         \LOOPD SHORT Butland'.00401098
004010AA  |.  8B75 0C       MOV ESI,DWORD PTR SS:[EBP+C]             ;  ESI指向口令
004010AD  |.  B9 04000000   MOV ECX,4
004010B2  |.  33FF          XOR EDI,EDI
004010B4  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]
004010B6  |.  8A5E 01       |MOV BL,BYTE PTR DS:[ESI+1]
004010B9  |.  32C3          |XOR AL,BL
004010BB  |.  3E:88443D FC  |MOV BYTE PTR DS:[EBP+EDI-4],AL
004010C0  |.  83C6 02       |ADD ESI,2
004010C3  |.  47            |INC EDI
004010C4  |.^ E2 EE         \LOOPD SHORT Butland'.004010B4
004010C6  |.  B9 03000000   MOV ECX,3
004010CB  |.  33FF          XOR EDI,EDI
004010CD  |>  36:8A442F F8  /MOV AL,BYTE PTR SS:[EDI+EBP-8]
004010D2  |.  36:8A5C2F FC  |MOV BL,BYTE PTR SS:[EDI+EBP-4]
004010D7  |.  32C3          |XOR AL,BL
004010D9  |.  88442F F8     |MOV BYTE PTR DS:[EDI+EBP-8],AL
004010DD  |.  47            |INC EDI
004010DE  |.^ E2 ED         \LOOPD SHORT Butland'.004010CD
004010E0  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
004010E3  |.  2D 0E151C00   SUB EAX,1C150E                           ;  1C150E是XOR后的值
004010E8      75 13         JNZ SHORT Butland'.004010FD              ;  不相等就跳走
004010EA  |.  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
004010EC  |.  68 15304000   PUSH Butland'.00403015                   ; |Title = "祝贺你!"
004010F1  |.  68 15304000   PUSH Butland'.00403015                   ; |Text = "祝贺你!"
004010F6  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
004010F8  |.  E8 27010000   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
004010FD  |>  C9            LEAVE
004010FE  \.  C2 0800       RETN 8

这个CrackMe的流程到是挺简单的,但是我不知道怎么能算出正确的密码。把输入的用户进行XOR后,在跟1C150E进行XOR能得到密码XOR后的值,那么怎么能得到正确的密码?

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
找到算法做个注册机就行
2008-8-6 12:38
0
雪    币: 239
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
呵 ̄看你和我一樣,都是初學,注冊機你試看看寫一下,我給你分析一下

0040106A  |$  55            PUSH EBP
0040106B  |.  8BEC          MOV EBP,ESP
0040106D  |.  83C4 F8       ADD ESP,-8
00401070  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; /String  ;取用户名长度
00401073  |.  E8 94010000   CALL <JMP.&kernel32.lstrlenA>            ; \lstrlenA
00401078  |.  8BC8          MOV ECX,EAX
0040107A  |.  83F9 06       CMP ECX,6              ;用户长度不为6玩完
0040107D  |.  75 7E         JNZ SHORT Butland'.004010FD
0040107F  |.  FF75 0C       PUSH DWORD PTR SS:[EBP+C]                ; /String  
00401082  |.  E8 85010000   CALL <JMP.&kernel32.lstrlenA>            ; \lstrlenA  ;取密码长度
00401087  |.  8BC8          MOV ECX,EAX
00401089  |.  83F9 06       CMP ECX,6              ;密码长度不为6同样over
0040108C  |.  75 6F         JNZ SHORT Butland'.004010FD

循环处理用户名中的每个字符

0040108E  |.  8B75 08       MOV ESI,DWORD PTR SS:[EBP+8]             ;  ESI指向用户名
00401091  |.  B9 04000000   MOV ECX,4             ;
循环四次,
00401096  |.  33FF          XOR EDI,EDI              ;清空EDI寄存器
00401098  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]      依次访问的用户名位数是:0,2,4,6
0040109A  |.  8A5E 01       |MOV BL,BYTE PTR DS:[ESI+1]    依次访问与用户名的:1,3,5,6
0040109D  |.  32C3          |XOR AL,BL              0,2,4,6 依次 1,3,5,6位进行异或
0040109F  |.  3E:88443D F8  |MOV BYTE PTR DS:[EBP+EDI-8],AL  异或后的内容依次放入指定的内存区,由于EDI是用累加1的,所以该内存区是连续的4个内存单元
004010A4  |.  83C6 02       |ADD ESI,2
004010A7  |.  47            |INC EDI
004010A8  |.^ E2 EE         \LOOPD SHORT Butland'.00401098

004010AA  |.  8B75 0C       MOV ESI,DWORD PTR SS:[EBP+C]             ;  ESI指向口令
004010AD  |.  B9 04000000   MOV ECX,4             ;又来循环四次
004010B2  |.  33FF          XOR EDI,EDI                  ;清空EDI寄存器  
004010B4  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]           ;算法和处理用户名一样
004010B6  |.  8A5E 01       |MOV BL,BYTE PTR DS:[ESI+1]
004010B9  |.  32C3          |XOR AL,BL
004010BB  |.  3E:88443D FC  |MOV BYTE PTR DS:[EBP+EDI-4],AL
004010C0  |.  83C6 02       |ADD ESI,2
004010C3  |.  47            |INC EDI
004010C4  |.^ E2 EE         \LOOPD SHORT Butland'.004010B4

到此[EBP-8]至[EBP-11]放着用户名异或后的结果
[EBP-4]至[EBP-7]放着密码异或后的结果

又是一个循环,将[EBP-8]至[EBP-11]依次与[EBP-4]至[EBP-7]的内存进行异或,异或后将值再放回去
004010C6  |.  B9 03000000   MOV ECX,3
004010CB  |.  33FF          XOR EDI,EDI
004010CD  |>  36:8A442F F8  /MOV AL,BYTE PTR SS:[EDI+EBP-8]
004010D2  |.  36:8A5C2F FC  |MOV BL,BYTE PTR SS:[EDI+EBP-4]
004010D7  |.  32C3          |XOR AL,BL
004010D9  |.  88442F F8     |MOV BYTE PTR DS:[EDI+EBP-8],AL
004010DD  |.  47            |INC EDI
004010DE  |.^ E2 ED         \LOOPD SHORT Butland'.004010CD

最后DWORD [EBP-8]的值必须是1C150E                           

004010E0  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
004010E3  |.  2D 0E151C00   SUB EAX,1C150E                           ;  1C150E是XOR后的值
004010E8      75 13         JNZ SHORT Butland'.004010FD              ;  不相等就跳走
004010EA  |.  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
004010EC  |.  68 15304000   PUSH Butland'.00403015                   ; |Title = "祝?你!"
004010F1  |.  68 15304000   PUSH Butland'.00403015                   ; |Text = "祝?你!"
004010F6  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
004010F8  |.  E8 27010000   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
004010FD  |>  C9            LEAVE
004010FE  \.  C2 0800       RETN 8
2008-8-6 12:46
0
雪    币: 151
活跃值: (29)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
代码我能看懂~!就是不知道怎么写注册机啊~!

我的关键问题是这里:把输入的用户进行XOR后,在跟1C150E进行XOR能得到密码XOR后的值,那么怎么能得到正确的密码?
2008-8-6 13:06
0
雪    币: 239
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
把軟件傳上來一起玩玩
2008-8-6 14:50
0
雪    币: 151
活跃值: (29)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
发了,我是想知道怎么可以告个注册机。
请帮忙,谢谢。
2008-8-6 14:56
0
雪    币: 239
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
原來我搞過這個,難怪這麼眼熟,晚上再弄
2008-8-6 14:59
0
雪    币: 151
活跃值: (29)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
弄好记得指点小弟1、2
2008-8-6 16:30
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
做补丁行不行啊,行我发给你,我也很差劲
2008-8-6 18:22
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个就是啦,呵呵
上传的附件:
2008-8-6 18:28
0
雪    币: 151
活跃值: (29)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
hahuhu,你只是修改了跳转指令,这样做没有进步啊~!~!我想要个注册机的制作方法啊~!
2008-8-6 19:01
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
12

算法啊.大大们现在都要算法了
2008-8-6 19:17
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
无聊,看看,算法不是都在你贴的地方吗?????、
上传的附件:
2008-8-6 21:37
0
雪    币: 151
活跃值: (29)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
我要的是注册机,算法我能看懂.
2008-8-6 21:51
0
雪    币: 228
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
随机给出用户名,用上面的算法生成最后要与密码异或的那个数值A,用A与 1C150E异或得到B。随机生成密码的 0、2、4、6位(004010B4地址处的这个),与B的对应字节异或,得到密码的1、3、5、7位。

有个问题,这里输入是6位用户名和密码,处理的时候变成8位,中间应该还有一段转换吧。用8位密码转换成6位应该就好了。
2008-8-7 13:34
0
雪    币: 239
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
小弟做了個注冊機,實在難以見人啊,該段代碼有可能造成死循環,在於無法在條件內找到字符組合,本想讓所有生成的用戶及密碼都是字母或數字,但實在是想不出法子,最後只能稍放棄一下,改用別的方法,有路過的請指教一下

  
#include<stdio.h>
#include<math.h>
#include<ctime>
#include<windows.h>
int main ()
{
    unsigned int nresult,nuserxor,npwdxor;
        

    srand(time(0));
     

    //隨機產生一個整數,高8位設為空
    nuserxor=rand();
    nuserxor^=0xFF000000;
    
    nresult=0x001C150E;
  
    //得到密碼的異或值
    npwdxor=nresult^nuserxor;
    
  
    //定義用戶名,密碼字符串
    unsigned char user[7]="\0",password[7]="\0";
    
  
    

    //取得用戶名,假設用戶名0,2,4是已知的
    int n,k;
    for(n=0,k=0;n<=4;n+=2,k++)
    {
    
      
      unsigned char bytexor=(unsigned char)(nuserxor>>(k*8));
      do 
      {
        //隨機產生
        user[n]=32+rand()%255;
        user[n+1]=bytexor^user[n];
      }
      while(user[n]==bytexor || user[n] <=13 || user[n]> 200|| user[n+1]==bytexor || user[n+1]>200 || user[n+1]<=13); 

    
    }
  
    printf("the user is {%s}!\n",user);
    
 

    //取得密碼
    for(n=0,k=0;n<=4;n+=2,k++)
    {
      unsigned char bytexor=(unsigned char)(npwdxor>>(k*8));
      
      do 
      {
        password[n]=1+rand()%255;
        password[n+1]=bytexor^password[n];  
      }
      while(password[n]==bytexor  || password[n]>200  || password[n]<=13 ||   password[n+1]>200 || password[n+1]<=13);
          
    } 

    printf("the password is {%s}!\n",password);
  
    return 0;    
}
2008-8-7 15:06
0
游客
登录 | 注册 方可回帖
返回
//