首页
社区
课程
招聘
如下反汇编代码该如何用高级语言来描述呢?
发表于: 2010-5-7 23:15 4775

如下反汇编代码该如何用高级语言来描述呢?

2010-5-7 23:15
4775
00401389  |.  E8 AAFFFFFF   call Crackme.00401338                    ;  取用户名长度
0040138E  |.  89C1          mov ecx,eax
00401390  |.  4B            dec ebx                                  ;  执行后,ebx指向用户名的前一个字节
00401391  |.  31D2          xor edx,edx
00401393  |>  8A140B        /mov dl,byte ptr ds:[ebx+ecx]            ;  用户名最后一位
00401396  |.  0FAFD1        |imul edx,ecx
00401399  |.  01D0          |add eax,edx
0040139B  |.  49            |dec ecx
0040139C  |.^ 75 F5         \jnz short Crackme.00401393


希望大家教教我,最好用C、JAVA语言来实现。关键在00401393  这行 取出用户名一个字节来置换edx的低8位该如何用高级语言来描述呢?

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
有难度。。。
2010-5-7 23:42
0
雪    币: 358
活跃值: (662)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
nLen = GetNameLen(szUserName) ;
for(i = nLen; i; --i)
{
        nLen += szUserName[i - 1] * i ;
}

release版会将while, for,全都优化成do while的形式,所以翻译成while for都无所谓的。
if这些是将反操作的!
我觉得要结合上下文来看,一小段看不出啥来,很难译的!
2010-5-8 00:27
0
雪    币: 360
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rol
4
nLen=GetNameLen(szUserName);
for(int i=nLen;i>0;i--)
{
     nLen=szUserName[i-1]*i+nLen;
}
2010-5-8 00:42
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我觉得楼上2位的代码不正确,如下一句,在循环中edx只是低8位被用户名的一个字节置换了,高位并没有变,所以执行imul edx,ecx时,edx并不仅仅是用户名的一个字节
00401393  |>  8A140B        /mov dl,byte ptr ds:[ebx+ecx]            ;  用户名最后一位
2010-5-8 09:06
0
雪    币: 1981
活跃值: (771)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=olxdf;803900]我觉得楼上2位的代码不正确,如下一句,在循环中edx只是低8位被用户名的一个字节置换了,高位并没有变,所以执行imul edx,ecx时,edx并不仅仅是用户名的一个字节
00401393  |>  8A140B        /mov dl,byte ptr ds:[ebx+ecx]   ...[/QUOTE]

直接内嵌汇编
2010-5-8 09:44
0
雪    币: 358
活跃值: (662)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=olxdf;803900]我觉得楼上2位的代码不正确,如下一句,在循环中edx只是低8位被用户名的一个字节置换了,高位并没有变,所以执行imul edx,ecx时,edx并不仅仅是用户名的一个字节
00401393  |>  8A140B        /mov dl,byte ptr ds:[ebx+ecx]   ...[/QUOTE]

xor edx,edx


如果我没有记错的话,这个是将edx清零吧,高位也是0吧!
2010-5-8 12:12
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
诶,没人能够帮助我,再等下,没有就结贴了
2010-5-17 09:29
0
雪    币: 1946
活跃值: (243)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
9
int len = strlen(name);
int result = len;
for(int i = 0; i < len; i++)
{
    result += name[len-i-1] * (len - i);
}

这个应该是delphi写的,用pascal语法描述:
var
i,len,Result: Integer;
begin
    len := length(name);
    result := len;
    for i := 0 to pred(nlen) do
    begin
        inc(result,name[len-i-1] * (len - i));
    end;
end;
2010-5-17 09:51
0
雪    币: 249
活跃值: (25)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
大概的意思就是2L和9L翻译的,作用就是这样
2010-5-17 10:43
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
00401393  |>  8A140B        /mov dl,byte ptr ds:[ebx+ecx]            ;  用户名最后一位
00401396  |.  0FAFD1        |imul edx,ecx
00401399  |.  01D0          |add eax,edx
0040139B  |.  49            |dec ecx
0040139C  |.^ 75 F5         \jnz short Crackme.00401393
我的理解是edx与ecx相乘后,高24位不一定为0,循环中将低8位置换成用户名的一个字符,而高24位并不为0,所以感觉imul edx,ecx这句不应该单纯的翻译成name[len-i-1] * (len - i);不知道是不是我理解错了,希望大家指正。
2010-5-17 11:02
0
雪    币: 1946
活跃值: (243)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
12
建议LZ问问题之前先将自己杯子里的水倒空,楼上已经有人非常明白无误的回答了你这个问题了
2010-5-17 11:22
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
楼主的想法有道理,但还是可以表达的吧。如下如何?
int nLen = GetNameLen(szUserName) ;
union{
         int iEDX;
         char iDL;
};
iEDX=0;
for(int i = nLen; i; i--)
{
        iDL=szUserName[i-1];
        iEDX = iEDX*i;
        nLen+=iEDX;
}
2010-5-17 20:02
0
雪    币: 324
活跃值: (113)
能力值: ( LV15,RANK:280 )
在线值:
发帖
回帖
粉丝
14
int len = strlen(user);  //len相当于eax
int i = len;             //i相当于ecx用于控制循环次数
int d =0;                //d相当于edx,保存运算的中间结果
while(i>0)
{
	d = d&0x00;              //此2句,相当于是对edx的低8位,dl赋值
	d = d|user[i];
	d = d*i;                 //imul edx,ecx
	len +=d;                 //计算结果累加到len(eax)中
	i--;
}
2010-5-18 13:41
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
这个给个比对的方法。你可以用VC6调试模式,之后反汇编对比着看。
2010-5-18 13:53
0
游客
登录 | 注册 方可回帖
返回
//