首页
社区
课程
招聘
第一题做法-7byte
发表于: 2008-10-4 22:12 10868

第一题做法-7byte

2008-10-4 22:12
10868

目的:想从初级会员升为普通会员:P
思路:
OpenUrlA长度为7byte.主要是用的壳里的常用手法“堆栈切换”来实现的。
在全局内存中构造:
内存1:
低    WinExecIAT
      OpenUrlA地址
      字符串地址
高    0x5 --- WM_SHOW

内存2:
      {内存1的地址}

OpenUrlA:
xchg [内存2], esp
retn

OpenUrlA:
mov eax, 内存2
xchg [eax], esp
retn

由于CPU对eax做了优化,以上两组指令均为7byte;

流程为:client ---call---> OpenUrlA ---retn----> winexec ----retn---> client
在第二和第三个箭头过程中分别做了一次堆栈切换。

这里注意的是我们的PE内存可能不够堆栈的使用,这里的办法是把内存1写入reloc节,然后把前面节.data的虚拟内存大小加大为PE header中

的SizeOfStackReserve = 100000 (1048576.)。然后调整一下后面的节(还有属性要可写)。

1)
import table:
首先修改导入表在导入表加入kernel32.dll中的WinExec函数.
import table的RVA为:2014,这个PE的DLL中先把具体文件和函数名写入注册表后面。
由于导入表的Original First Thunk没有太严格的要求,可以为NULL。所以可以将kernel32.dll和user32.dll的Original First Thunk清为0,
现在再加入一个kernel32.dll的WinExec的导入信息这里注意了,这个导入信息的Original First Thunk是要有的(WinExec的第一个参数不为

NULL)

2)
找空间把数据和代码写入PE文件中。
先写入数据到最后
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000BC0   A9 20 00 00 D0 10 40 00  D0 31 50 00 05 00 00 00   ?..?@.?P.....
00000BD0   65 78 70 6C 6F 72 65 72  20 68 74 74 70 3A 2F 2F   explorer http://
00000BE0   62 62 73 2E 70 65 64 69  79 2E 63 6F 6D 00 00 00   bbs.pediy.com...
00000BF0   00 00 00 00 00 00 00 00  C0 31 50 00 00 00 00 00   ........?P.....
调整.data段的虚拟内存大小为100000,把rdata,data和reloc都修改为可写可读。

将代码写入.text段

008710D0 > .  8725 F8319700 xchg    dword ptr [9731F8], esp
008710D6   .  C3            retn

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

000004D0   87 25 F8 31 50 00 C3 00                            ??P.?

3)修改重定位表
把代码和数据中用到的全局变量的地址,按格式写入重定位表中。
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000A30   00 30 10 00 10 00 00 00  C4 31 C8 31 F8 31 00 00   .0......???..
4)加入导出表
在导入表后面加入导出表和OpenUrlA函数:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

000006D0   00 00 00 00 00 00 00 00  00 00 00 00 11 21 00 00   .............!..
000006E0   00 00 00 00 01 00 00 00  01 00 00 00 00 21 00 00   .............!..
000006F0   04 21 00 00 E1 20 00 00  00 00 00 00 00 00 00 00   .!..?..........
00000700   D0 10 00 00 08 21 00 00  4F 70 65 6E 55 72 6C 41   ?...!..OpenUrlA
00000710   00 70 65 64 69 79 2E 64  6C 6C                     .pediy.dll

要调整一下.rdata的虚拟内存
OK!


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2
学习123456
2008-10-4 22:41
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
3
已经见识过了,最早在shoooo的帖子 【娱乐】某些牛人们的方法 里见过这个方法,想了半天才想清楚。
实际调用参数是硬编码到.rdata节中了。

两次执行XCHG切换ESP,太强了!
2008-10-4 22:53
0
雪    币: 220
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
低    WinExecIAT
      OpenUrlA地址
      字符串地址
高    0x5 --- WM_SHOW


问一下楼主,红色部分应该是OpenUrlA地地址还是客户端call OpenUrlA的下一条语句的址(也就是说call OpenUrlA后进入OpenUrlA函数后ESP上压进的EIP地址)?

如果红色部分是OpenUrlA的地址的话,当Winexec retn后是不是又返回到了OpenUrlA的入口了??

我是初学者,有点迷惑,望高手释疑
2008-10-4 23:08
0
雪    币: 220
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
明白了,那个地址应该为xchg [eax], esp 指令的地址,真是高深啦,学习了。
2008-10-4 23:19
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
6
膜拜6.exe
2008-10-4 23:32
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
终于见到7个字节是怎么弄的了`~~~
膜拜`~~
2008-10-5 14:26
0
雪    币: 238
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
膜拜个,真强。。。。。。
2008-10-5 15:34
0
雪    币: 270
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
强啊!!!!学习了
2008-10-5 16:39
0
雪    币: 360
活跃值: (92)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
10
传说中的7字节
2008-10-5 23:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好好膜拜一下,专心学习
2008-10-6 09:49
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
12
学习一个
2008-10-7 18:01
0
雪    币: 497
活跃值: (78)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
13
重复调用xchg是亮点。

有个问题:
我之所以放弃继续研究用ret跳转的原因,就是因为API IAT会被覆盖,导致只能调用一次。
楼主确定可以连续调用?(我用的是ShellExecuteA,调用它用了0xb90字节的堆栈空间,平台vista sp1)

当然刚好这个DWORD没有被读写,那WinExec可真是用对了。我可是把API IAT前面0x200个字节全部置0xff,一个没留下
2008-10-7 19:55
0
雪    币: 218
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
xchg用的太漂亮了,有点棋行险招
学习 学习......
2008-10-8 21:12
0
雪    币: 334
活跃值: (22)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
不能连续调用,很可惜
2008-10-9 12:05
0
雪    币: 707
活跃值: (1922)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
16
收藏学习。。。
2008-10-9 13:13
0
游客
登录 | 注册 方可回帖
返回