以前总是在各个论坛看帖子~~ 前天黑手的缓冲区书到了~ 呵呵
随便写点 可能有写错的地方 大家多指教啊`~ 看的脑袋都大了
太不好理解
自从认识し掰搿嬲讎雠 以后才知道以前学的东西相当于幼儿园大班水平~~ 哈哈~
这一个月全是在网上到处逛找些堆栈的文章看~~ 昨天黑客手册的缓冲区溢出的书到了。~`呵呵 作些笔记啥的~~ 复习复习~~ 呵呵~~
#inclue<stdio.h>
#include<sindows.h>
char name[] ="xiaoyu";
int main()
{
char output[8];
strcpy(output,name);
for(int i=0;i<8&&output[i];i++)
printf("\\0x%x",output[i]);
return 0;
}
#inclue<stdio.h>
#include<sindows.h>这我不解释了~~ 头文件` 因为后面使用的strcpy跟printf要用到~
char name[]="xiaoyu" 是吧数组赋值~
char output[8]; 给output分配8个char空间 把name里的字符拷贝给它~
这样执行一下 只是把xiaoyu以16进制的形式打出来~~~ 没啥问题的`` 要是把name里改长点~~改成
1111111111111111111111111111111111111111111这样就会报错了`` 呵呵 最简单的溢出~`
几个小知识`~ 虽然会了 但是还是写出来~~ 关于PUSH跟POP
堆栈就是先进后出~~ 这个概念大家都知道的~~ 在操作系统中~存和取的动作就是PUSH跟POP
PUSH放进去一个~~POP取一个~~ 这么个概念~~
因为我们第二次输入了一堆11~~ 可是output分配的还是8个字节~~ 但是却拷贝了更多的近来~~
当执行完main函数以后系统要恢复EBP EIP而EIP已经被我们覆盖了~~ 但是系统不知道 就会去执行那个东东 而那个位置是不可读的~~所以就会出错~` 呵呵
2.shllcode
啥叫shellcode呢~ 其实我的理解就是把我们想要的程序称为shellcode
比如我们想要的程序是开一个DOS窗口 就是下面这个程序
#include<windows.h>
int main()
{
LoadLibrary("msvcrt.dll");
system("command.com");
return 0;
}
执行一下 呵呵 DOS窗口出来了~
因为system函数是由msvcrt.dll提供的 所以执行 system("command.com");首先要用LoadLibrary("msvcrt.dll")装载svcrt.dll
其实不用LoadLibrary("msvcrt.dll");也可以调用system函数~ 今天问了下 し掰搿嬲讎雠 他说有时候问了汇编方便还是需要的~
现在我们把程序改为机器码 以前肯定看到很多比如\x01\xff\x3f\xff一类的东东
那些就是程序的机器码 呵呵 也把我们的程序变成机器码吧
在VC中直接按F10进行调试 然后在跳出的Debug工具栏里点最后一个Disassembly 这样就出现汇编代码了~~
随便写点 可能有写错的地方 大家多指教啊`~ 看的脑袋都大了
太不好理解
自从认识し掰搿嬲讎雠 以后才知道以前学的东西相当于幼儿园大班水平~~ 哈哈~
这一个月全是在网上到处逛找些堆栈的文章看~~ 昨天黑客手册的缓冲区溢出的书到了。~`呵呵 作些笔记啥的~~ 复习复习~~ 呵呵~~
#inclue<stdio.h>
#include<sindows.h>
char name[] ="xiaoyu";
int main()
{
char output[8];
strcpy(output,name);
for(int i=0;i<8&&output[i];i++)
printf("\\0x%x",output[i]);
return 0;
}
#inclue<stdio.h>
#include<sindows.h>这我不解释了~~ 头文件` 因为后面使用的strcpy跟printf要用到~
char name[]="xiaoyu" 是吧数组赋值~
char output[8]; 给output分配8个char空间 把name里的字符拷贝给它~
这样执行一下 只是把xiaoyu以16进制的形式打出来~~~ 没啥问题的`` 要是把name里改长点~~改成
1111111111111111111111111111111111111111111这样就会报错了`` 呵呵 最简单的溢出~`
几个小知识`~ 虽然会了 但是还是写出来~~ 关于PUSH跟POP
堆栈就是先进后出~~ 这个概念大家都知道的~~ 在操作系统中~存和取的动作就是PUSH跟POP
PUSH放进去一个~~POP取一个~~ 这么个概念~~
因为我们第二次输入了一堆11~~ 可是output分配的还是8个字节~~ 但是却拷贝了更多的近来~~
当执行完main函数以后系统要恢复EBP EIP而EIP已经被我们覆盖了~~ 但是系统不知道 就会去执行那个东东 而那个位置是不可读的~~所以就会出错~` 呵呵
2.shllcode
啥叫shellcode呢~ 其实我的理解就是把我们想要的程序称为shellcode
比如我们想要的程序是开一个DOS窗口 就是下面这个程序
#include<windows.h>
int main()
{
LoadLibrary("msvcrt.dll");
system("command.com");
return 0;
}
执行一下 呵呵 DOS窗口出来了~
因为system函数是由msvcrt.dll提供的 所以执行 system("command.com");首先要用LoadLibrary("msvcrt.dll")装载svcrt.dll
其实不用LoadLibrary("msvcrt.dll");也可以调用system函数~ 今天问了下 し掰搿嬲讎雠 他说有时候问了汇编方便还是需要的~
现在我们把程序改为机器码 以前肯定看到很多比如\x01\xff\x3f\xff一类的东东
那些就是程序的机器码 呵呵 也把我们的程序变成机器码吧
在VC中直接按F10进行调试 然后在跳出的Debug工具栏里点最后一个Disassembly 这样就出现汇编代码了~~