-
-
[原创][firefly][第一阶段◇第一题]答案提交
-
发表于:
2008-10-1 19:55
2746
-
[原创][firefly][第一阶段◇第一题]答案提交
看雪论坛.腾讯公司2008软件安全竞赛
[第一阶段◇第一题] 答题说明
firefly
08.10.1
-----+++++-----
1) 增加输出表
-----+++++-----
我选择导入表之后文件偏移0x700(RVA为0x2100)处的空白位置来构造导出表,导入表的
数据如下所示
00000700 00 00 00 00 C2 95 A2 48 00 00 00 00 40 21 00 00 ....聲....@!..
00000710 01 00 00 00 01 00 00 00 01 00 00 00 28 21 00 00 .........(!..
00000720 2C 21 00 00 30 21 00 00 00 11 00 00 4A 21 00 00 ,!..0!.....J!..
00000730 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000740 70 65 64 69 79 2E 64 6C 6C 00 4F 70 65 6E 55 72 pediy.dll.OpenUr
00000750 6C 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 lA..............
其中设置OpenUrlA函数的RVA为0x1100。
然后,用stud_pe查看pediy.dll的输出表的数据目录在偏移为0x148,修改数据目录,
将其偏移设置为0x2100,大小设置为0x54,如下所示:
00000140 00 00 00 00 10 00 00 00 00 21 00 00 54 00 00 00 ........!..T...
-----+++++-----
2) 增加导入函数
-----+++++-----
由于要调用IE浏览器打开http://bbs.pediy.com,需要用到ShellExecute函数,因此
要为pediy.dll增加导入函数。为了方便期间,先用LoadPE增加导入函数,这样就多了一
个区段。为了能加分,手工移动这个区段到文件偏移0x770(RVA 0x2170)处,如下所示
00000C00 73 68 65 6C 6C 33 32 2E 64 6C 6C 00 00 00 53 68 shell32.dll...Sh
00000C10 65 6C 6C 45 78 65 63 75 74 65 41 00 C0 05 00 00 ellExecuteA.?a}
00000C20 00 00 00 00 5C 20 00 00 00 00 00 00 00 00 00 00 ....\ ..........
00000C30 72 20 00 00 0C 20 00 00 50 20 00 00 00 00 00 00 r ... ..P ......
00000C40 00 00 00 00 9C 20 00 00 00 20 00 00 1C 50 00 00 ....?... ..P..
00000C50 00 00 00 00 00 00 00 00 00 50 00 00 1C 50 00 00 .........P..P..
由于偏移地址变了,需要将部分地址修改成如下所示:
00000770 73 68 65 6C 6C 33 32 2E 64 6C 6C 00 00 00 53 68 shell32.dll...Sh
00000780 65 6C 6C 45 78 65 63 75 74 65 41 00 7C 21 00 00 ellExecuteA.?a}
00000790 00 00 00 00 5C 20 00 00 00 00 00 00 00 00 00 00 ....\ ..........
000007A0 72 20 00 00 0C 20 00 00 50 20 00 00 00 00 00 00 r ... ..P ......
000007B0 00 00 00 00 9C 20 00 00 00 20 00 00 8C 21 00 00 ....?... ..?..
000007C0 00 00 00 00 00 00 00 00 70 21 00 00 8C 21 00 00 ........p!..?..
最后更新导入表的入口地址。
-----+++++-----
3) 增加代码
-----+++++-----
首先把ShellExecuteA用的参数添加到.data段,文件偏移为0x900(RVA 0x3100)处,如下
所示:
003F3100 6F 70 65 6E 00 00 00 00 68 74 74 70 3A 2F 2F 62 open....http://b
003F3110 62 73 2E 70 65 64 69 79 2E 63 6F 6D 00 00 00 00 bs.pediy.com....
为了尽可能保持小的代码体积,不在程序里进行自定位,写好代码后修改程序的重定位表。
增加的代码如下所示。
003F1100 >/$ 33C0 xor eax, eax
003F1102 |. 50 push eax ; /IsShown => 0
003F1103 |. 50 push eax ; |DefDir => NULL
003F1104 |. 50 push eax ; |Parameters => NULL
003F1105 |. 68 08313F00 push 003F3108 ; |FileName = "http://bbs.pediy.com"
003F110A |. 68 00313F00 push 003F3100 ; |Operation = "open"
003F110F |. 50 push eax ; |hWnd => NULL
003F1110 |. FF15 8C213F00 call dword ptr [<&shell32.ShellExecut>; \ShellExecuteA
003F1116 \. C3 retn
-----+++++-----
4) 修改重定位表
-----+++++-----
注意到添加的代码中RVA 0x1106,0x110B,0x1112需要重定位,因此在重定位表中追加数据,
修改后的重定位表如下所示:
003F4000 00 10 00 00 26 00 00 00 03 30 08 30 10 30 2F 30 ...&...000/0
003F4010 34 30 83 30 8E 30 96 30 9F 30 BE 30 C5 30 06 31 40??????1
003F4020 0B 31 12 31 00 00 00 00 00 00 00 00 00 00 00 00 11............
然后修改重定位表的大小。
---------++++++++++----------
5) 修改PE各区段的Virtual size
---------++++++++++----------
由于添加了新的代码和数据,需要修改PE各区段的Virtual size。
这样就修改完成了。由于直接增加导入表,所使用的函数在Win2k中也能使用,因此
不需要针对2K平台做修改。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课