执行 Shellcode
Last updated
Last updated
shellcode 是一段用于利用软件漏洞而执行的代码,shellcode 为16进制之机械码,以其经常让攻击者获得 shell 而得名。shellcode 常常使用机器语言编写。 可在暂存器 eip 溢出后,塞入一段可让 CPU 执行的 shellcode 机械码,让电脑可以执行攻击者的任意指令。在编译时关闭 ASLR、NX 、CANARY 选项,这样就可以在输入时把 shellcode 布置在栈中,通过动态调试获得所需要的 padding 溢出到返回地址为输入的 shellcode 地址,这样程序返回后便会执行 shellcode。
下面给出一个经典例子,验证程序溢出后执行 shellcode,编译的环境为 winxp 工具为 vc6.0。
编译完成后拖入 OllyDbg 动态调试确定 padding 的长度,在 memcpy 处下一个断点方便随后调试。可以先生成50 BYTES 的 padding 比较与返回地址的距离,最后确定为60 BYTES 后为返回地址。
输入的字符串会被复制到栈中 0012FAE4 的位置。
因为通过合理的 padding 控制了返回地址到 0012FAE4,所以在函数返回时寄存器 EIP 的值为 0012FAE4,这时系统会认为栈中的数据为机器码,程序就会执行地址为 0012FAE4 的代码。
password.txt 中的内容为精心布置的机器码,功能是弹出一个消息框,内容为 hackhack。如何编写 password.txt 中的内容,我们放在后面的章节来讲,本章着重介绍整个执行流程。
如我们所期望的,程序返回后执行了弹窗功能。