shellcode入门

整理自《0day安全:软件漏洞分析技术》第2版

系统:VMware安装的Window XP SP2

工具:vc++6.0, ollydbg, Dependency Walker, python

步骤:通过内联汇编__asm实现功能,再在OllyDbg中提取对应字节码,最后转化为shellcode。

例1:

该程序弹出一个对话框,点击确认后程序退出执行

用到的两个函数MessageBox和ExitProcesss的地址通过dependency walker人工计算

ExitProcesss地址=0x7c800000+0x0001caa2 = 0x7c81caa2 (MessageBoxA类似)


另外,程序运行默认会加载kernel32.dll和ntdll.dll,不会加载user32.dll。但要调用MessageBoxA函数,必须显示加载user32.dll到内存空间。

#include <stdio.h>
#include <windows.h>

int main()
{
    HINSTANCE libHandle;
    libHandle = LoadLibraryA("user32.dll");
    _asm{
            sub sp,0x440    //抬高栈空间
            xor ebx,ebx        //ebx置零
            push ebx        //字符串的结尾'\0'
            push 0x216f6c6c    //压入字符串"hello!",栈向低地址空间增长
            push 0x65680000

            lea eax,[esp+2]    //esp+2指向字符串首地址
            push ebx        //压入MessageBoxA的四个参数
            push eax
            push eax
            push ebx
            mov eax,0x77d5050b //MessageBoxA address
            call eax
            push ebx
            mov eax,0x7c81caa2 //ExitProcess address
            call eax
    }
    return 0;
}
在ollydbg中查看其字节码,并复制


用python处理这些字节码得到shellcode(可利用split函数和join()函数),最后shellcode测试程序如下

#include <stdio.h>
#include <windows.h>

char shellcode[]=
"\x66\x81\xEC\x40\x04\x33\xDB\x53\x68\x6C\x6C\x6F\x21\x68\x00\x00\x68\x65\x8D\x44\x24\x02\x53\x50\x50\x53\xB8\x0B\x05\xD5\x77\xFF\xD0\x53\xB8\xA2\xCA\x81\x7C\xFF\xD0";

int main()
{
	HINSTANCE libHandle;
	libHandle = LoadLibraryA("user32.dll");
	_asm{
			lea eax,shellcode
			push eax
			ret
	}
	return 0;
}
例2:
功能和上面一样,但为了使shel
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值