首页
社区
课程
招聘
[求助]有关《The Shellcoder's handbook》第2章的一点疑问
发表于: 2008-2-27 21:18 4465

[求助]有关《The Shellcoder's handbook》第2章的一点疑问

2008-2-27 21:18
4465
非常感谢译者!

我是一个新手,没怎么接触过Linux,更不能提Unix了。
关于《The Shellcoder's handbook》2.4利用漏洞获得Root权限:第20页的程序,

首先,根据我的理解,这个程序是生成要溢出的缓冲区,这个缓冲区中存放了提升权限的shellcode,并在shellcode后面加上猜测的shellcode第一条指令的地址。这样溢出部分修改栈里的RET(即EIP),使其在函数调用结束后执行shellcode。这个函数就是19页上的简单程序中的函数strcpy(little_array,argv[1]),如果argv[1]过大,将使little_array溢出,从而修改RET,将其指向shellcode。我的理解是否有不对的地方?

第二,勘误上说缺少了对变量buff的内存分配malloc(bsize)。由于malloc是在堆上分配内存,所以并不会影响栈顶指针ESP,而根据接下来的攻击猜测,offset的值始终为0,那么不管每次输入的参数为多少,只是影响在堆上分配内存的大学,对栈并没有影响,所以addr = find_start() - offset的值是不变的(至少在win32平台上是不变的,难道unix上就变化了?)。可是根据作者的描述,输入参数不一样,addr的值确实在变化。这是为什么?

第三,要执行的shellcode第一条指令的地址是在little_array里还是在argv[1]里,抑或是在buff(堆)里?

先表示感谢!

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 4593
活跃值: (3572)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
2
1. 对
2. 根据作者的描述,他是在调整<offset>,我怀疑他的文字描述和他贴在正文中的C已经有了出入。
    他演示的那个attack的argv[1]应该是<offset>和<bsize>的重合,很像是C本来就只有一个形
    参。你的怀疑有道理。
3. 最终在little_array[]里啊,little_array的高址方向就是SavedEBP、RetAddr了啊。
    ./victim $BUF是在用环境变量传递shellcode到little_array[]
2008-2-28 09:16
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
非常感谢scz!
(我是菜鸟,问的问题可能有点可笑,请莫见怪!)

关于第3个问题,我想我有一些不太理解的地方:
system("/bin/bash");
上面这条语句是新开了一个程序还是在原来程序内部执行?
如果是新开了程序,那么问题2里面的addr与程序bash里面little_array里shellcode的地址风马牛不相及啊!
如果作为一个函数执行,再加上 如果 我的问题2的答案如2楼所述(即,确实offset参与了输入,addr的值可能跑进little_array),那就正解了。

再次感谢scz,欢迎讨论!
2008-2-28 21:10
0
雪    币: 4593
活跃值: (3572)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
4
system()导致新开了一个shell,他之所以要这样做,是因为前面简单调用了putenv(),这个函数只能改变当前进程的环境变量以及子进程的。

在*nix上,跟windows是不同的,加载后的栈底相对很固定,当然现在一些Linux开始不固定了。
在作者写作的环境中猜测那个addr是可行的,猜的就是栈布局。你不要套windows的东西去理解。
2008-2-29 09:41
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢!
我看了smash the stack那篇文章,发现这一章是这篇文章上的内容,但是有些代码抄错了。
对于我的第2个问题,smash the stack中输入的是2个参数,所以offset的值是变化的。
2008-3-4 18:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
就是那个测试 shellcode 的程序:
char shellcode[] =
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
int main()
{
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}

我编译顺利,但是执行会报段错误!
[root@localhost asm]# ./sc
Segmentation fault (core dumped)

系统环境为 redhat as4,
[root@localhost asm]# uname -a
Linux localhost.localdomain 2.6.9-5.EL #1 Wed Jan 5 19:22:18 EST 2005 i686 i686 i386 GNU/Linux

我觉得这段代码我看懂了,用gdb调试过程和所想的也完全一样,改写的是ebx下面的 ret 返回地址,但是就是不能像书中写的那样顺利执行成功获得sh!出错发生在main执行完毕 leave 后到 ret 的那一步!请高手解答!
2008-7-2 16:24
0
游客
登录 | 注册 方可回帖
返回
//