这段代码的shellcode是抄的别人的,仅仅显示出一个msgbox提醒一下。
编译器为 vc 2005
操作系统为 xp sp3
如果你的编译器或者操作系统不完全相同,有可能溢出失败
大概原理为:
执行sprintf时,将我们构造的长字符串拷贝到堆栈区,从而覆盖了fun函数的返回地址(字符串16字节处),而此时esp正好指向字符串20字节处,因此我们将16处覆盖为jmp esp指令的地址, 将20字节处覆盖为我们的shell code。当函数fun返回时,正好将jmp esp的地址出栈,而执行了jmp esp后,正好执行到20字节处的shell code。
1
#include <stdio.h>
2
#include <string.h>
3
4
编译器为 vc 2005
操作系统为 xp sp3
如果你的编译器或者操作系统不完全相同,有可能溢出失败
大概原理为:
执行sprintf时,将我们构造的长字符串拷贝到堆栈区,从而覆盖了fun函数的返回地址(字符串16字节处),而此时esp正好指向字符串20字节处,因此我们将16处覆盖为jmp esp指令的地址, 将20字节处覆盖为我们的shell code。当函数fun返回时,正好将jmp esp的地址出栈,而执行了jmp esp后,正好执行到20字节处的shell code。
1
2
3
4