首页
社区
课程
招聘
[原创]第一阶段第一题提交
发表于: 2008-10-3 15:09 2423

[原创]第一阶段第一题提交

2008-10-3 15:09
2423
思路:
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!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
2
OpenUrlA 函数大小 = 7 字节
附件提交次数 = 1
得分 = min[1.0, 13/7]x100 - (1 -1 )x5 = 100.000000

很好很强大~学习
2008-10-9 02:03
0
游客
登录 | 注册 方可回帖
返回
//