首页
社区
课程
招聘
[娱乐]某些牛人们的方法
发表于: 2008-10-4 14:44 18308

[娱乐]某些牛人们的方法

2008-10-4 14:44
18308

这里给出一些别的牛人们的答案,供大家玩乐
我对这个题目的理解是,无论我们怎么异想天开的改,都要保证一些函数基本的东西
1. 不能破坏除eax, edx,ecx以外的寄存器
2. 不能假设美好的环境存在,比如d位是0, 即不保证lods方向
3. 不能事先做好铺垫代码,即不允许hook流和异常流,否则可以无意义的0字节

我认为最标准的答案是10字节的

B8 XX XX XX XX 50 FF 50 XX C3
50 FF 50 B8 C3 50 3C 00 EB F6

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (48)
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
2
大开眼界了啊
2008-10-4 14:47
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
这样好像我的就通过不能了,很久没做过pediy,完全不会了
2008-10-4 14:47
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
4
不用泄气
上面只是我的个人理解,并不代表裁判也是这样理解的
2008-10-4 14:50
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
O(∩_∩)O~这个好像没什么事吧,只是玩笑话,shooo莫当真
2008-10-4 14:53
0
雪    币: 64
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
为了通用和规则,---扼杀了N条思路~
2008-10-4 14:53
0
雪    币: 243
活跃值: (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
7字节和这个貌似也没什么区别的

push _jump_jump_jump
retn
2008-10-4 15:09
0
雪    币: 296
活跃值: (89)
能力值: ( 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楼。
2008-10-4 15:11
1
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
9
那7个字节,我可以保证,openurla从开始到结束,除了api系统领空外, 函数唯一经过的就那两行代码,不会跑到别的用户态代码或事先做好的代码上面去
2008-10-4 15:15
0
雪    币: 243
活跃值: (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
仔细回味了下 ,7字节确实太妙了.可惜不能多线程
2008-10-4 15:26
0
雪    币: 216
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
来看牛人,来看牛人们的代码.......
2008-10-4 15:32
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
12
能仔细说说那个7字节的代码么?如果不需要“跑到别的用户态代码”上,实在不清楚如何实现的啊。
光赋值就用去5个字节了,剩下的2个字节我们能拿来做什么
2008-10-4 15:39
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
13
秘密就在于我们可于把很多要做的事情先在新堆栈中设计好,然后直接换进来就OK了
2008-10-4 15:55
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
14
谢谢,终于顿悟了7字节的方法!这个方法太精妙了!


例如方法3MOV 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大小(好累,有心人继续吧)...
2008-10-4 16:10
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
哇塞
我明白了
2008-10-4 16:26
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
16
0字节的怎么没人提?


还有OpenUrlA的地址为正常地址,但没有任何代码,在ATTACH的时候,再写代码到该地址处
这样算不算0字节
2008-10-4 16:42
0
雪    币: 101
活跃值: (88)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
17
评分标准应该以对原来文件的最小改动字节数来作为基准。
2008-10-4 18:28
0
雪    币: 107
活跃值: (1683)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
18
不拘一格降人才啊   都不错 虽然不符合要求 但是很好很强大
2008-10-4 18:49
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
19
我的答案也是0字节的,不过在外部增加一个DLL,其实就是像Kernel32.dll导出的HeapAlloc实际是Ntdll.dll中的AlllocateHeap。Pediy.dll里面只改了输入表和输出表。

那个附加的DLL是通过注册表和读取IE的地址,然后用CreateProcess打开,整个函数超过3XX字节,2次提交,符合得出负数的分

结果裁判说,这个答案不符合要求。好吧,连负分也不给,硬给我个0分,随他去吧
2008-10-4 19:01
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
了解,这个方法确实精妙
2008-10-4 19:11
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
21
问一下在哪里可以看到审判结果
2008-10-4 19:14
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
22
楼上好像就是fengyue/
膜拜1下
2008-10-4 19:17
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
23
楼上的楼上盗用我的头像
2008-10-4 19:27
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
24
这不是论坛的默认投降么
2008-10-4 19:36
0
雪    币: 216
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
我晕,上面两个"风月",
我在论坛上用了半年多的"慕容紫英"的头像,结果前段时间看到也有人在论坛上用
没法了,只有自己换了,其实好不想换滴,那是相当之郁闷........
2008-10-4 19:52
0
游客
登录 | 注册 方可回帖
返回
//