能力值:
( LV2,RANK:10 )
|
-
-
2 楼
大开眼界了啊
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
这样好像我的就通过不能了,很久没做过pediy,完全不会了
|
能力值:
(RANK:650 )
|
-
-
4 楼
不用泄气
上面只是我的个人理解,并不代表裁判也是这样理解的
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
O(∩_∩)O~这个好像没什么事吧,只是玩笑话,shooo莫当真
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
为了通用和规则,---扼杀了N条思路~
|
能力值:
( LV8,RANK:130 )
|
-
-
7 楼
7字节和这个貌似也没什么区别的
push _jump_jump_jump
retn
|
能力值:
( LV15,RANK:340 )
|
-
-
8 楼
原来还有这么多闻所未闻的调用方法 ,稍微加点注释:
方法1: B8 XX XX XX XX 50 FF 50 XX C3 003F10CA B8 70273F00 MOV EAX, 003F2800 003F10CF 50 PUSH EAX 003F10D0 FF50 30 CALL DWORD PTR DS:[EAX+30] 003F10D3 C3 RETN
然后假设 003F2800 这里的数据是这个样子 003F2800 65 78 70 6C 6F 72 65 72 2E 65 78 65 20 68 74 74 explorer.exe htt 003F2810 70 3A 2F 2F 62 62 73 2E 70 65 69 64 79 2E 63 6F p://bbs.peidy.co 003F2820 6D 00 m. 003F2830 4D 11 86 7C 这个是WinExec的ThunkRVA,保证 EAX+30 是指向这里就行
代码2:50 FF 50 B8 C3 50 3C 00 EB F6 003F10CA 50 PUSH EAX 003F10CB FF50 B8 CALL DWORD PTR DS:[EAX-48] 003F10CE C3 RETN 003F10CF 50 PUSH EAX 003F10D0 3C 00 CMP AL,0 003F10D2 ^ EB F6 JMP SHORT 003F10CA
这段没看懂,入口应该是 003F10CF,但是如何保证EAX的值总是想要的?不然CALL DWORD PTR DS:[EAX-48]就不知道飞到哪去了
代码3:BE XX XX XX XX 87 E6 C3 这段代码就比较流氓了,例如下面这个,实际是跳到003F2700继续执行... 而执行的参数是硬编码在文件中的(具体做法看最后)
003F10CA BE 00273F00 MOV ESI, 003F2700 003F10CF 87E6 XCHG ESI,ESP ; 修改了ESP,导致ret的返回地址为 003F2700 处的4个字节 003F10D1 C3 RETN ; 然后继续
代码4:CC 这个绝对是无敌的做法,用任何一个指令引发异常,然后在异常里实现调用。 具体看这贴: EricAzhe 的2字节pediy (实际ret都可以省掉,只用1字节 )
代码5:87 25 XX XX XX XX C3 003F10CA 8725 00273F00 XCHG DWORD PTR DS:[3F2700],ESP 003F10D0 C3 RETN
和方法3一个道理,只不过这里直接和ESP交换了。7字节
看到sessiondiy说的方法,终于明白了方法3和方法5的实现方式:
OpenUrlA:
007810CA > . 8BDC mov ebx, esp
007810CC . BC F0217800 mov esp, <&KERNEL32.WinExec> <-指向下面
007810D1 . C3 retn
007810D2 . 8BE3 mov esp, ebx
007810D4 . C3 retn
ESP设来这里(.rdata or .data):
[WinExec] [07810D2] [0783050] [5]
IAT relc修 relc修 Winexec的参数1
ret Winexec的参数0 居然在(.rdata or .data)里这样处理,WinExec的参数是硬编码在交换到位置之后的。具体方法见14楼。
|
能力值:
(RANK:650 )
|
-
-
9 楼
那7个字节,我可以保证,openurla从开始到结束,除了api系统领空外, 函数唯一经过的就那两行代码,不会跑到别的用户态代码或事先做好的代码上面去
|
能力值:
( LV8,RANK:130 )
|
-
-
10 楼
仔细回味了下 ,7字节确实太妙了.可惜不能多线程
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
来看牛人,来看牛人们的代码.......
|
能力值:
( LV15,RANK:340 )
|
-
-
12 楼
能仔细说说那个7字节的代码么?如果不需要“跑到别的用户态代码”上,实在不清楚如何实现的啊。
光赋值就用去5个字节了,剩下的2个字节我们能拿来做什么
|
能力值:
(RANK:650 )
|
-
-
13 楼
秘密就在于我们可于把很多要做的事情先在新堆栈中设计好,然后直接换进来就OK了
|
能力值:
( LV15,RANK:340 )
|
-
-
14 楼
谢谢,终于顿悟了7字节的方法!这个方法太精妙了!
例如方法3中 MOV ESI, 003F2700,此时 003F2700 的数据像这样: 003F2700 4D 11 86 7C XX XX XX XX 10 27 3F 00 05 00 00 00 M唡....'?.... 003F2710 65 78 70 6C 6F 72 65 72 2E 65 78 65 20 68 74 74 explorer.exe htt 003F2720 70 3A 2F 2F 62 62 73 2E 70 65 64 69 79 2E 63 6F p://bbs.pediy.co 003F2730 6D 00 m. 其中红色部分为WinExec的实际地址,你可以把引入表的ThunkRVA设到这里。 蓝色部分的8字节是参数1和参数2,中间紫色4个字节填函数的返回地址。
此时执行XCHG ESI,ESP后堆栈为: 003F2700 7C86114D kernel32.WinExec 003F2704 XXXXXXXX 填写返回地址 003F2708 003F2710 arg1 = ASCII 'explorer.exe http://bbs.pediy.com',0 003F270C 00000005 arg2 = 5
接着ret,用OD可以看到调用情况: 003F2704 XXXXXXXX /CALL 到 WinExec 003F2708 003F2710 |CmdLine = "explorer.exe http://bbs.pediy.com" 003F270C 00000005 \ShowState = SW_SHOW
关于恢复ESP地址: 说说方法5吧,这7字节方法是靠再次执行OpenUrlA函数来实现恢复的,需要另外的4字节存放原来的ESP。
为了测试,我们把DLL入口点位置代码改成这样: 003F1020 > 8725 50273F00 XCHG DWORD PTR DS:[3F3750],ESP 003F1026 C3 RETN
003F3700 B5 15 86 7C 26 10 3F 00 10 27 3F 00 05 00 00 00 M唡&?.'?.... 003F3710 65 78 70 6C 6F 72 65 72 2E 65 78 65 20 68 74 74 explorer.exe htt 003F3720 70 3A 2F 2F 62 62 73 2E 70 65 64 69 79 2E 63 6F p://bbs.pediy.co 003F3730 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 m............... 003F3740 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 003F3750 00 37 3F 00
注意对应颜色的部分。首先XCHG在[003F3750],此时紫色的4字节被交换到ESP,也就是完成执行WinExec的准备工作,此时原本的ESP被记录在[003F3750]。 再看蓝色的返回地址,这里填的是003F1020!这样等WinExec执行完后,ret返回后将再次执行 003F1020 > 8725 50273F00 XCHG DWORD PTR DS:[3F3750],ESP 将ESP交换回来,收工
这个7字节的代码果然有很多地方值得研究 太强悍了!
其实要真正打造出能用的DLL,还有很多问题。例如:
OriginalFirstThunk和FirstThunk不能都设到要调用的位置(LoadPE就是放一块了);
给.rdata节中的调用参数等进行重定位(新增一个重定位块,基址是.rdata的0x2000);
又因为由于PE的内存不够堆栈使用,需要修改SizeOfStackReserve大小(好累,有心人继续吧)...
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
|
能力值:
(RANK:350 )
|
-
-
16 楼
0字节的怎么没人提?
还有OpenUrlA的地址为正常地址,但没有任何代码,在ATTACH的时候,再写代码到该地址处
这样算不算0字节
|
能力值:
( LV2,RANK:140 )
|
-
-
17 楼
评分标准应该以对原来文件的最小改动字节数来作为基准。
|
能力值:
( LV6,RANK:80 )
|
-
-
18 楼
不拘一格降人才啊 都不错 虽然不符合要求 但是很好很强大
|
能力值:
(RANK:570 )
|
-
-
19 楼
我的答案也是0字节的,不过在外部增加一个DLL,其实就是像Kernel32.dll导出的HeapAlloc实际是Ntdll.dll中的AlllocateHeap。Pediy.dll里面只改了输入表和输出表。
那个附加的DLL是通过注册表和读取IE的地址,然后用CreateProcess打开,整个函数超过3XX字节,2次提交,符合得出负数的分
结果裁判说,这个答案不符合要求。好吧,连负分也不给,硬给我个0分,随他去吧
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
了解,这个方法确实精妙
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
问一下在哪里可以看到审判结果
|
能力值:
( LV12,RANK:470 )
|
-
-
22 楼
楼上好像就是fengyue/
膜拜1下
|
能力值:
(RANK:1130 )
|
-
-
23 楼
楼上的楼上盗用我的头像
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
这不是论坛的默认投降么
|
能力值:
( LV4,RANK:50 )
|
-
-
25 楼
我晕,上面两个"风月",
我在论坛上用了半年多的"慕容紫英"的头像,结果前段时间看到也有人在论坛上用
没法了,只有自己换了,其实好不想换滴,那是相当之郁闷........
|
|
|