创建一个弹出计算器的Shellcode

综合 2026-10-17 05:29:20 78
直接说结论:用shellcode弹计算器,创建出计本质上就是个弹让CPU执行一段写死的机器码,这段机器码调用Windows API创建进程。算器整个过程不依赖外部文件,创建出计纯内存操作,个弹所以也叫“注入式执行”。算器 我拿32位Windows 7做测试,创建出计用Metasploit的个弹`windows/exec`模块生成基础payload,再手工改偏移量。算器核心思路就三步:定位kernel32.dll的创建出计基址,找`WinExec`函数地址,个弹构造参数压栈后调用。算器 先看最原始的创建出计shellcode长什么样。 ``` \x31\xc0\x50\x68\x2e\x65\x78\x65\x68\x63\x61\x6c\x63\x89\xe3\x50\x53\xb8\xc7\x93\xbf\x77\xff\xd0 ``` 这段只有22字节。个弹前几个字节是算器`xor eax,eax`清空寄存器,接着`push`压入“calc.exe”字符串的倒序,然后`mov ebx,esp`让EBX指向字符串。关键在最后一行:`mov eax,0x77bf93c7`,这是XP SP3的`WinExec`地址。不同系统这个地址完全不一样,Win7是`0x76b43a40`,Win10直接变了,所以实战中得动态查找。 动态查找才是真正麻烦的地方。 PEB(进程环境块)里藏着kernel32的加载地址,偏移0x30处是PEB指针,再偏移0x0c是LDR结构,遍历双向链表就能摸到kernel32的基址。但直接写这些汇编代码容易出错,我习惯先用C写个原型,确认逻辑通了再转成汇编。比如查找`WinExec`的哈希值,用`0x0007c2d4`这个值去匹配导出表,匹配成功就返回函数地址。 整个shellcode放哪里执行?两种常见做法: 1. 栈溢出,把shellcode塞进缓冲区,覆盖返回地址指向它; 2. 更省事的是用VirtualAlloc申请一段可执行内存,把shellcode拷进去,再用CreateThread启动。 我测试时用的后者,因为不用管栈对齐问题。 这里有个坑:32位shellcode和64位完全不通用。 64位系统下,`WinExec`不存在,得用`CreateProcessW`,而且参数传递从栈变成寄存器(rcx、rdx、r8、r9)。网上很多老教程还在用32位思路,直接跑会蓝屏。我踩过这个坑,后来干脆写了个小工具,自动判断当前架构再生成对应payload。 弹计算器只是验证shellcode能执行的最小例子。真正要防住这种攻击,光靠杀毒软件不够——因为shellcode是纯数据,没有文件特征。你得盯住内存权限变化:正常程序不会同时具备“写”和“执行”权限,用EMET或系统自带的DEP+ASLR就能拦掉大部分。但话说回来,总有绕过方法,比如用ROP链先关掉DEP再跳转。 最后给个实操建议:别直接抄网上现成shellcode,尤其那些带硬编码地址的。 自己写一遍流程,至少搞清楚每个字节在干什么。比如开头的`\x31\xc0`是`xor eax,eax`,不是随便填的——清空寄存器是为了避免调用API时参数残留。真到渗透测试时,你还要考虑编码器(如shikata_ga_nai)混淆特征,但那是另一篇文章了。 代码能跑起来那刻,你会突然理解为什么老黑客说“shellcode是黑客的乐高”——每块积木都简单,拼起来却能干大事。
本文地址:http://www.79wt.cn/news/177f0099822.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

友情链接