TA的每日心情![](source/plugin/dsu_paulsign/img/emot/nu.gif) | 怒 2021-1-19 10:45 |
---|
签到天数: 172 天 [LV.7]常住居民III
|
![](template/comiis_lssy/comiis_pic/ico_lz.png)
楼主 |
发表于 2008-5-22 17:20:38
|
显示全部楼层
两个研究方向
1.关键CALL->004601A0
2.可疑的赋值
首先研究关键CALL
;====================================================================|
;在地址0045BE18处跟进关键CALL->004601A0
;--------------------------------------------------------------------|
004601A0 /$ 53 push ebx ;
OD下方显示:本地调用来自 00428B46, 00429225, 0044BB64, 0045120C, 00455368, 0045BE18, 0045E824
004601A1 |. 55 push ebp
注意:从这里我们可疑看到,程序有多处代码调用了CALL=>004601A0
这也验证了为了程序只修改0014BE22处的关键跳转不能达到完全爆破的目的
;--------------------------------------------------------------------|
004601A2 |. 8B6C24 0C mov ebp, dword ptr [esp+C] ;
EBP = [esp+C] = 用户名
004601A6 |. 56 push esi
004601A7 |. 57 push edi
004601A8 |. BE 84014A00 mov esi, 004A0184 ; ESI = 4A0184
004601AD |. 8BC5 mov eax, ebp ; EAX = 用户名
004601AF |> 8A10 /mov dl, byte ptr [eax] ; 用户名的第1个字符
004601B1 |. 8A1E |mov bl, byte ptr [esi]
004601B3 |. 8ACA |mov cl, dl
004601B5 |. 3AD3 |cmp dl, bl
004601B7 |. 75 1E |jnz short 004601D7 ;
跳转实现//跳出循环体(跳至EAX置零)
;----------------------------
004601B9 |. 84C9 |test cl, cl
004601BB |. 74 16 |je short 004601D3 ;
004601BD |. 8A50 01 |mov dl, byte ptr [eax+1]
004601C0 |. 8A5E 01 |mov bl, byte ptr [esi+1]
004601C3 |. 8ACA |mov cl, dl
004601C5 |. 3AD3 |cmp dl, bl
004601C7 |. 75 0E |jnz short 004601D7
004601C9 |. 83C0 02 |add eax, 2
004601CC |. 83C6 02 |add esi, 2
004601CF |. 84C9 |test cl, cl
004601D1 |.^ 75 DC \jnz short 004601AF ; //循环
004601D3 |> 33C0 xor eax, eax ;
004601D5 |. EB 05 jmp short 004601DC ;
程序跳出了循环体,条件是用户名不为空
我们可以看看如果程序从004601D5这跳会怎样
首先跳至004601DC
因为EAX = 0,所以又跳至00460242
接着EAX置零后返回
而我们的主程序在EAX=0的时候是注册失败的
;----------------------------
004601D7 |> 1BC0 sbb eax, eax ;
004601D9 |. 83D8 FF sbb eax, -1 ;
004601DC |> 85C0 test eax, eax
004601DE |. 74 62 je short 00460242 ;
EAX=1,跳转未实现
综上,我们可疑得出,上段代码是检查用户名是否为空
;--------------------------------------------------------------------|
004601E0 |. 8B7C24 18 mov edi, dword ptr [esp+18] ;
EDI = [esp+18] = 序列号
004601E4 |. BE 84014A00 mov esi, 004A0184 ; ESI = 4A0184
004601E9 |. 8BC7 mov eax, edi ;
004601EB |> 8A10 /mov dl, byte ptr [eax] ; 序列号的第i个字符
004601ED |. 8A1E |mov bl, byte ptr [esi]
004601EF |. 8ACA |mov cl, dl
004601F1 |. 3AD3 |cmp dl, bl
004601F3 |. 75 1E |jnz short 00460213 ;
跳转实现//跳出循环体(跳至EAX置零)
004601F5 |. 84C9 |test cl, cl
004601F7 |. 74 16 |je short 0046020F ;
004601F9 |. 8A50 01 |mov dl, byte ptr [eax+1]
004601FC |. 8A5E 01 |mov bl, byte ptr [esi+1]
004601FF |. 8ACA |mov cl, dl
00460201 |. 3AD3 |cmp dl, bl
00460203 |. 75 0E |jnz short 00460213
00460205 |. 83C0 02 |add eax, 2
00460208 |. 83C6 02 |add esi, 2
0046020B |. 84C9 |test cl, cl
0046020D |.^ 75 DC \jnz short 004601EB ; //循环
0046020F |> 33C0 xor eax, eax ;
00460211 |. EB 05 jmp short 00460218 ;
程序跳出了循环体,条件是序列号不为空
我们可以看看如果程序从00460211这跳会怎样
首先跳至00460218
因为EAX = 0,所以又跳至00460242
接着EAX置零后返回
而我们的主程序在EAX=0的时候是注册失败的
00460213 |> 1BC0 sbb eax, eax ;
00460215 |. 83D8 FF sbb eax, -1 ;
00460218 |> 85C0 test eax, eax ;
0046021A |. 74 26 je short 00460242 ;
EAX=1,跳转未实现
综上,我们可疑得出,上段代码是检查序列号是否为空
;--------------------------------------------------------------------|
0046021C |. 57 push edi ;
0046021D |. 55 push ebp ;
0046021E |. E8 6DF9FFFF call 0045FB90 ;
00460223 |. 83C4 08 add esp, 8
00460226 |. 85C0 test eax, eax ;
00460228 |. 75 0E jnz short 00460238 ;
EDI保存序列号
EBP保存用户名
EAX = 0
跳转未实现,继续
有一个CALL->0045FB90 ,下次跟入
假设跳转实现,程序跳至00460238
EAX = 1,返回-》注册成功
;--------------------------------------------------------------------|
0046022A |. 57 push edi ;
0046022B |. 55 push ebp ;
0046022C |. E8 8FFBFFFF call 0045FDC0 ;
00460231 |. 83C4 08 add esp, 8
00460234 |. 85C0 test eax, eax ;
00460236 |. 74 0A je short 00460242 ;
EDI保存序列号
EBP保存用户名
EAX = 0
跳转实现
EAX = 0,返回,注册失败 |
|