执行shellcode的几种方式
发布日期:2021-05-24 13:56:51 浏览次数:14 分类:精选文章

本文共 1628 字,大约阅读时间需要 5 分钟。

汇编与计算器调试实战

汇编成功弹出计算器

下面这段汇编代码可以用来弹出计算器:

#pragma comment(linker,"/section:.data,RWE") // 数据段可读写
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") // 不显示窗口
#pragma comment(linker,"/INCREMENTAL:NO") // 指定非增量编译
#include "windows.h"
void main() {
__asm {
sub esp, 0x454 // 保存进栈大小
xor ebx, ebx // 保留 eax
push ebx // 将 ebx pushed 到栈中
mov eax, 0x6578652e // 'Shell' 字符串
push eax // 'Shell' 可读写
mov eax, 0x636c6163 // 'expl' 字符串
push eax // 'expl' 可读写
mov eax, esp // 从栈中取出结果
push 5 // 设置栈中的参数
push eax // 'expl' 可读写
mov eax, 0x74f0dab0 // WinExec 函数指针
call eax // 调用 WinExec
mov esp, 0x450 // 恢复栈状态
}
}

找出-local offense address-

下面这两条语句与 call dword ptr [WinExec] 功能相同,可以利用这条语句找出自己机子上 WinExec 地址,然后将 0x74f0dab0 替换成自己机子上的地址:

mov eax, 0x74f0dab0
call eax

提取汇编的机器码

将汇编代码编译后可以得到相应的机器码:

unsigned char shellcode[] = "\x81\xEC\x54\x04\x00\x00\x33\xDB\x53\xB8\x2E\x65\x78\x65\x50\"\"  
"\xB8\x63\x61\x6C\x63\x50\x8B\xC4\x6A\x05\x50\"\"
"\xB8\xB0\xDA\xF0\x74\xFF\xD0\"\"
"\xBC\x50\x04\x00\x00";

执行shellcode的方法

方法一:通过函数名执行

void Run1() {
((void (*)(void))&shellcode)();
}

方法二:通过偏移地址跳转

void Run2() {
__asm {
lea eax, shellcode
jmp eax
}
}

方法三:相同的另一种写法

void Run3() {
__asm {
mov eax, offset shellcode
jmp eax
}
}

方法四:使用 emit 插入数据

void Run4() {
__asm {
mov eax, offset shellcode
_emit 0xff;
_emit 0xe0;
}
}

调试总结

代码及调试方法已经成功完成功能,其他三种方法均可调试成功弹出计算器。

上一篇:cobaltstrike生成一个原生c,然后利用xor加密解密执行
下一篇:c和汇编---函数

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年05月02日 04时39分50秒