当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : [原创]ubuntu 7.04下对《网络渗透技术》书中的第一个缓冲区溢出小程序的调试笔记。
帖子发表于 : 2007-10-18 22:18 

注册: 2007-07-25 16:36
帖子: 16
送出感谢: 0 次
接收感谢: 0 次
菜鸟写的文章...高手就别看了~..就是想和研究此书的读者交流一下心得!~
另:下一个程序就没运行成功...抓狂ing..找到栈底也不能定位环境变量阿....可能是我还不明白吧...希望有人指点指点!~
书中提到的第一个缓冲区溢出的测试程序,原文代码如下:
代码:
#include <stdio.h>
#include <string.h>
char largebuff[] =
"1234512345123451234512345===ABCD";
int main (void)
{
   char smallbuff[16];
   strcpy (smallbuff,largebuff);
}

按照书上的介绍.....此程序返回地址eip应该会被覆盖成:

Program received signal SIGSEGV, Segmentation fault.
0x44434241 in ?? ()

正好是倒过来的ABCD,可是在ubuntu下按照例子调试确始终不得其解...于是有了此文...
一步一步来吧..先看看我开始调试时的问题:
先按照例子走:
代码:
ojjou@ojjou-laptop:~$ gcc -o simple_overflow simple_overflow.c
ojjou@ojjou-laptop:~$ gdb simple_overflow
GNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".(后文用省略号代替.这里还是留着吧.)
(gdb) r
Starting program: /home/ojjou/simple_overflow
*** stack smashing detected ***: /home/ojjou/simple_overflow terminated

Program received signal SIGABRT, Aborted.
0xffffe410 in __kernel_vsyscall ()

得到如下信息..注意这里是0xffffe410 in __kernel_vsyscall ()
却不是书上说的0x44434241 in ?? ()
这里是第一个问题了..于是:
代码:
(gdb) disas main   #得到如下代码
Dump of assembler code for function main:
0x080483d4 <main+0>:    lea    0x4(%esp),%ecx
0x080483d8 <main+4>:    and    $0xfffffff0,%esp
0x080483db <main+7>:    pushl  0xfffffffc(%ecx)
0x080483de <main+10>:   push   %ebp
0x080483df <main+11>:   mov    %esp,%ebp
0x080483e1 <main+13>:   push   %ecx
0x080483e2 <main+14>:   sub    $0x34,%esp
0x080483e5 <main+17>:   mov    %gs:0x14,%eax
0x080483eb <main+23>:   mov    %eax,0xfffffff8(%ebp)
0x080483ee <main+26>:   xor    %eax,%eax
0x080483f0 <main+28>:   movl   $0x8049620,0x4(%esp)
0x080483f8 <main+36>:   lea    0xffffffe8(%ebp),%eax
0x080483fb <main+39>:   mov    %eax,(%esp)
0x080483fe <main+42>:   call   0x8048308 <strcpy@plt>
0x08048403 <main+47>:   mov    0xfffffff8(%ebp),%edx
0x08048406 <main+50>:   xor    %gs:0x14,%edx
0x0804840d <main+57>:   je     0x8048414 <main+64>
0x0804840f <main+59>:   call   0x8048318 <__stack_chk_fail@plt>
#看这一行..原文中是没有调用这个代码的,这是意思就像那函数名字一样:栈保护- -!
0x08048414 <main+64>:   add    $0x34,%esp
0x08048417 <main+67>:   pop    %ecx
0x08048418 <main+68>:   pop    %ebp
---Type <return> to continue, or q <return> to quit---Quit
(gdb)

开始以为是ubuntu内核有栈保护(那我这破水平就玩完了)...但是google后发现debain/ubuntu默认的内核是没有加入栈保护的(但是suse,fore有...但不是说ubuntu不好.只是默认没有.编译一下内核也会和suse等一样的~但是这个安全问题也是值得关注的)google了一下发现是gcc的栈保护措施只要 gcc -fno-stack-protector就可以了..(但是之后发现还是有问题的..)
于是:
代码:
ojjou@ojjou-laptop:~$ gcc -fno-stack-protector -o simple_overflow simple_overflow.c
ojjou@ojjou-laptop:~$ gdb simple_overflow
......
......
(gdb) r
Starting program: /home/ojjou/simple_overflow

Program received signal SIGSEGV, Segmentation fault.
0x080483a0 in main ()   /*可是还是没有对阿!!哎.. 看下面代码知道执行到
                        0x080483a0 <main+44>:   ret  时停住了*/
(gdb) disas main
Dump of assembler code for function main:
0x08048374 <main+0>:    lea    0x4(%esp),%ecx
0x08048378 <main+4>:    and    $0xfffffff0,%esp
0x0804837b <main+7>:    pushl  0xfffffffc(%ecx)   #注意这一句!也是没有的!
0x0804837e <main+10>:   push   %ebp
0x0804837f <main+11>:   mov    %esp,%ebp
0x08048381 <main+13>:   push   %ecx       /*这就是问题的关键!还是gcc的问题..
                                          如果要覆盖返回地址...就会把ecx也覆盖
                                          掉但是ecx却保存着esp的指向.于是
                                          ret的时候就停了...esp的指向被
                                          覆盖了*/
0x08048382 <main+14>:   sub    $0x24,%esp
0x08048385 <main+17>:   movl   $0x80495a0,0x4(%esp)
0x0804838d <main+25>:   lea    0xffffffec(%ebp),%eax
0x08048390 <main+28>:   mov    %eax,(%esp)
0x08048393 <main+31>:   call   0x80482c0 <strcpy@plt>
0x08048398 <main+36>:   add    $0x24,%esp
0x0804839b <main+39>:   pop    %ecx
0x0804839c <main+40>:   pop    %ebp
0x0804839d <main+41>:   lea    0xfffffffc(%ecx),%esp  /*由于ecx的值改变了
                                                      所以esp的值也会被
                                                      改变..于是下句ret就
                                                      出错了,eip的值仍然
                                                      没有被覆盖*/
0x080483a0 <main+44>:   ret   
End of assembler dump.
 

这也是gcc的问题.实践中发现..现在的gcc版本会把main函数的代码写成如下:
lea    0x4(%esp),%ecx
and    $0xfffffff0,%esp
pushl  0xfffffffc(%ecx)   
push   %ebp
mov    %esp,%ebp   
push   %ecx


而不是简单的写成:
push   %ebp
mov    %esp,%ebp   /*无疑多了层溢出保护!!这样就算覆盖了返回地址也会必然覆盖esp.
                     导致指向不到那句:call *0x8(ebp)   意思就是让eip的值等
                     于ebp+8;*/

但是奇怪的是其他被main调用的函数却没有这样的"保护"!(我也希望高手给我一些解答和帮助!)
于是把程序修改成:

代码:
#include <stdio.h>
#include <string.h>
char largebuff[] =
"1234512345123451234512345===ABCD";
void copyout(void)
{
   char smallbuff[16];
   strcpy (smallbuff,largebuff); 
}
int main (void)
{
   copyout();    #只是加了个嵌套而已..
}

ojjou@ojjou-laptop:~$ gcc -fno-stack-protector -o simple_overflow simple_overflow.c
ojjou@ojjou-laptop:~$ gdb simple_overflow
......
......
(gdb) r
Starting program: /home/ojjou/simple_overflow

Program received signal SIGSEGV, Segmentation fault.
0x34333231 in ?? ()  #虽然没有得到原文答案...但是已经溢出了!仔细看看这不就是"4321"么!
(gdb) i reg
eax            0xbfc2f3c8       -1077742648
ecx            0xb7be5e28       -1212260824
edx            0x80495c1        134518209
ebx            0xb7f56ff4       -1208651788
esp            0xbfc2f3e0       0xbfc2f3e0
ebp            0x35343332       0x35343332
esi            0xb7f86ce0       -1208455968
edi            0x0      0
eip            0x34333231       0x34333231  #eip已经修改!!!
eflags         0x210246 [ PF ZF IF RF ID ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) disas main
Dump of assembler code for function main:
0x0804838f <main+0>:    lea    0x4(%esp),%ecx
0x08048393 <main+4>:    and    $0xfffffff0,%esp
0x08048396 <main+7>:    pushl  0xfffffffc(%ecx)
0x08048399 <main+10>:   push   %ebp
0x0804839a <main+11>:   mov    %esp,%ebp
0x0804839c <main+13>:   push   %ecx
0x0804839d <main+14>:   sub    $0x4,%esp
0x080483a0 <main+17>:   call   0x8048374 <copyout>
0x080483a5 <main+22>:   add    $0x4,%esp
0x080483a8 <main+25>:   pop    %ecx
0x080483a9 <main+26>:   pop    %ebp
0x080483aa <main+27>:   lea    0xfffffffc(%ecx),%esp
0x080483ad <main+30>:   ret   
End of assembler dump.
(gdb) disas copyout
Dump of assembler code for function copyout:
0x08048374 <copyout+0>: push   %ebp
0x08048375 <copyout+1>: mov    %esp,%ebp
0x08048377 <copyout+3>: sub    $0x18,%esp    #由于对齐不一样的缘故把和书
                                                中不太一样
0x0804837a <copyout+6>: movl   $0x80495a0,0x4(%esp)
0x08048382 <copyout+14>:        lea    0xfffffff0(%ebp),%eax
0x08048385 <copyout+17>:        mov    %eax,(%esp)
0x08048388 <copyout+20>:        call   0x80482c0 <strcpy@plt>
0x0804838d <copyout+25>:        leave 
0x0804838e <copyout+26>:        ret   
End of assembler dump.
(gdb) b *0x08048374
Breakpoint 1 at 0x8048374
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/ojjou/simple_overflow

Breakpoint 1, 0x08048374 in copyout ()
(gdb) display /i $pc
1: x/i $pc  0x8048374 <copyout>:        push   %ebp
(gdb) si
0x08048375 in copyout ()
1: x/i $pc  0x8048375 <copyout+1>:      mov    %esp,%ebp
(gdb)
0x08048377 in copyout ()
1: x/i $pc  0x8048377 <copyout+3>:      sub    $0x18,%esp
(gdb)
0x0804837a in copyout ()
1: x/i $pc  0x804837a <copyout+6>:      movl   $0x80495a0,0x4(%esp)
(gdb)
0x08048382 in copyout ()
1: x/i $pc  0x8048382 <copyout+14>:     lea    0xfffffff0(%ebp),%eax
(gdb)
0x08048385 in copyout ()
1: x/i $pc  0x8048385 <copyout+17>:     mov    %eax,(%esp)
(gdb)
0x08048388 in copyout ()
1: x/i $pc  0x8048388 <copyout+20>:     call   0x80482c0 <strcpy@plt>
(gdb) x/s 0x80495a0
0x80495a0 <largebuff>:   "1234512345123451234512345===ABCD"
(gdb) i reg $eax
eax            0xbfd76d08       -1076400888
(gdb) i reg ebp
ebp            0xbfd76d18       0xbfd76d18
/*ebp-eax=0x10 故需要20个字节才能覆盖返回地址*/
原程序改为:
#include <stdio.h>
#include <string.h>
char largebuff[] =
"12345123451234512===ABCD";
void copyout(void)
{
   char smallbuff[16];
   strcpy (smallbuff,largebuff);
}
int main (void)
{
   copyout();
}

下面是仿造《网络渗透技术》书中此程序内容写的文章:
代码:
[ojjou@ojjou-laptop:~$ gcc -fno-stack-protector -o simple_overflow simple_overflow.c
[ojjou@ojjou-laptop:~$ gdb simple_overflowGNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) r
Starting program: /home/ojjou/simple_overflow

Program received signal SIGSEGV, Segmentation fault.
0x44434241 in ?? ()
(gdb) i reg
eax            0xbfe9a638       -1075206600
ecx            0xb7e510ac       -1209724756
edx            0x80495a5        134518181
ebx            0xb7f5fff4       -1208614924
esp            0xbfe9a650       0xbfe9a650
ebp            0x3d3d3d32       0x3d3d3d32
esi            0xb7f8fce0       -1208419104
edi            0x0      0
eip            0x44434241       0x44434241
eflags         0x210246 [ PF ZF IF RF ID ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51

在gdb里的执行结果是eip已经被改为0x44434241,正好是ABCD倒过来,这是由于IA32默认字节序是little_endian。接下来用gdb反汇编跟踪程序,看看eip为什么会变成0x44434241。
代码:
(gdb) disas main
Dump of assembler code for function main:
0x0804838f <main+0>:    lea    0x4(%esp),%ecx
0x08048393 <main+4>:    and    $0xfffffff0,%esp
0x08048396 <main+7>:    pushl  0xfffffffc(%ecx)
0x08048399 <main+10>:   push   %ebp
0x0804839a <main+11>:   mov    %esp,%ebp
0x0804839c <main+13>:   push   %ecx
0x0804839d <main+14>:   sub    $0x4,%esp
0x080483a0 <main+17>:   call   0x8048374 <copyout>
0x080483a5 <main+22>:   add    $0x4,%esp
0x080483a8 <main+25>:   pop    %ecx
0x080483a9 <main+26>:   pop    %ebp
0x080483aa <main+27>:   lea    0xfffffffc(%ecx),%esp
0x080483ad <main+30>:   ret   
End of assembler dump.
(gdb) disas copyout
Dump of assembler code for function copyout:
0x08048374 <copyout+0>: push   %ebp
0x08048375 <copyout+1>: mov    %esp,%ebp
0x08048377 <copyout+3>: sub    $0x18,%esp
0x0804837a <copyout+6>: movl   $0x804958c,0x4(%esp)
0x08048382 <copyout+14>:        lea    0xfffffff0(%ebp),%eax
0x08048385 <copyout+17>:        mov    %eax,(%esp)
0x08048388 <copyout+20>:        call   0x80482c0 <strcpy@plt>
0x0804838d <copyout+25>:        leave 
0x0804838e <copyout+26>:        ret   
End of assembler dump.
(gdb) b *0x08048374
Breakpoint 1 at 0x8048374
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/ojjou/simple_overflow

Breakpoint 1, 0x08048374 in copyout ()
(gdb) i reg
eax            0xbf91c974       -1080964748
ecx            0xbf91c8f0       -1080964880
edx            0x1      1
ebx            0xb7f4cff4       -1208692748
esp            0xbf91c8cc       0xbf91c8cc
ebp            0xbf91c8d8       0xbf91c8d8
esi            0xb7f7cce0       -1208496928
edi            0x0      0
eip            0x8048374        0x8048374 <copyout>
eflags         0x200282 [ SF IF ID ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) x/x $esp
0xbf91c8cc:     0x080483a5
(gdb) x /2i 0x080483a5
0x80483a5 <main+22>:    add    $0x4,%esp
0x80483a8 <main+25>:    pop    %ecx
(gdb) x /2i 0x080483a5-5
0x80483a0 <main+17>:    call   0x8048374 <copyout>
0x80483a5 <main+22>:    add    $0x4,%esp

可以看到,在copyout函数(由于溢出是在此函数里执行的)的最开始设置断点执行后的esp指向的内容就是copyout函数的返回地址。我们的目标就是覆盖这个地址,这样在copycout函数返回的时候转入我们的流程。在gdb里单步指令执行:
代码:
(gdb) display /i $pc
1: x/i $pc  0x8048374 <copyout>:        push   %ebp
(gdb) si
0x08048375 in copyout ()
1: x/i $pc  0x8048375 <copyout+1>:      mov    %esp,%ebp
(gdb)
0x08048377 in copyout ()
1: x/i $pc  0x8048377 <copyout+3>:      sub    $0x18,%esp
(gdb)
0x0804837a in copyout ()
1: x/i $pc  0x804837a <copyout+6>:      movl   $0x804958c,0x4(%esp)
gcc在编译的时候分配了0x18的空间(好像参数没有保持4字节的对齐...)
(gdb) si
0x08048382 in copyout ()
1: x/i $pc  0x8048382 <copyout+14>:     lea    0xfffffff0(%ebp),%eax
(gdb)
0x08048385 in copyout ()
1: x/i $pc  0x8048385 <copyout+17>:     mov    %eax,(%esp)
(gdb)
0x08048388 in copyout ()
1: x/i $pc  0x8048388 <copyout+20>:     call   0x80482c0 <strcpy@plt>
继续单步指令执行,"call 0x80482c0"指令实际就是调用strcpy函数,看看它push的两个参数:
(gdb) x/s 0x804958c
0x804958c <largebuff>:   "12345123451234512===ABCD"
(gdb) i reg $eax
eax            0xbf91c8b8       -1080964936
压栈的第一个参数是largebuff的地址,第二个是smallbuff的地址,gcc给它分配的大小是0xbf91c8c8(ebp)-0xbf91c8b8=0x10,所以需要20个字节才能正好覆盖返回地址。
(gdb) b*0x0804838d
Breakpoint 2 at 0x804838d
(gdb) c
Continuing.

Breakpoint 2, 0x0804838d in copyout ()
1: x/i $pc  0x804838d <copyout+25>:     leave 
(gdb) x/20x $esp
0xbf91c8b0: 0xbf91c8b8      0x0804958c      0x34333231      0x33323135
0xbf91c8c0: 0x32313534      0x31353433      0x3d3d3d32      0x44434241
0xbf91c8d0: 0xb7f70700      0xbf91c8f0      0xbf91c948      0xb7e25ebc
0xbf91c8e0: 0xb7f7cce0      0x080483c0      0xbf91c948      0xb7e25ebc
0xbf91c8f0: 0x00000001      0xbf91c974      0xbf91c97c      0xb7f7d898
执行strcpy后,0xbf91c8cc已经被覆盖成0x44434241。
(gdb) i reg $esp $ebp
esp            0xbf91c8b0       0xbf91c8b0
ebp            0xbf91c8c8       0xbf91c8c8
(gdb) si
Cannot access memory at address 0x3d3d3d36
(gdb) i reg $esp $ebp
esp            0xbf91c8cc       0xbf91c8cc
ebp            0x3d3d3d32       0x3d3d3d32

继续执行单步指令到main函数返回,最后的ret指令让eip等于esp指向内容,并且esp等于esp+4.(昏,前面是书上原话...可是此处ret无法执行...不能理解..高手路过时请指点指点!)
代码:
(gdb) si
0x44434241 in ?? ()
Disabling display 1 to avoid infinite recursion.
1: x/i $pc  0x44434241: Cannot access memory at address 0x44434241
(gdb) i reg $esp $ebp
esp            0xbf91c8d0       0xbf91c8d0
ebp            0x3d3d3d32       0x3d3d3d32

这时eip已经变为可以控制的地址了,也就是说我们可以控制程序的流程。
<完>
总结:
一、gcc的参数实在挺多的...应该去了解他的参数的用法.本文中用到了它的-fno-stack-protector参数..意思失去掉栈保护..还有-mpreferred-stack-boundary=n 按照2的n次对齐
有兴趣的朋友可以试试
二、由于gcc的版本原因..现编译函数对main进行了保护..使得在main下的溢出不太可能了(当然高手总是说nothing is impossible.希望高手来指教阿!)。
三、感谢《网络渗透技术》此书的所有作者和安焦团队..你们的文章实在太好了...也十分不好意思改动你们的文章,如果有什么写的不对的地方也请指正和谅解。感谢dorainm的一篇网上的文章《缓冲区溢出利用 的 简单例子》是这篇文章给我的启发。感谢google那些热心的朋友们。


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-10-19 20:19 
头像

注册: 2006-12-07 17:32
帖子: 234
送出感谢: 0 次
接收感谢: 0 次
写了那么多,绝对支持。


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-10-20 2:39 

注册: 2007-10-05 1:36
帖子: 29
地址: 江西
送出感谢: 0 次
接收感谢: 0 次
小弟这里先看过了阿,


_________________
我喜欢,我追求......


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-10-21 10:23 

注册: 2006-11-26 14:41
帖子: 122
送出感谢: 0 次
接收感谢: 0 次
期待楼主的后续文章


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-10-24 10:21 

注册: 2007-07-25 16:36
帖子: 16
送出感谢: 0 次
接收感谢: 0 次
谢谢大家支持~.最近在学习perl...老师让我毕业设计弄什么MRTG(好像是一个网络流量的监视工具)的应用...摆弄半天都不会用..结果溢出的研究又没忙上...如果我有什么心得我一定和大家交流分享~


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-11-20 17:57 

注册: 2007-11-20 17:53
帖子: 9
送出感谢: 0 次
接收感谢: 0 次
感谢楼主啊.....我最近也在看这本书,第一个程序就过不去,正郁闷着呢,不料搜到了你这篇文章......看来凡事要多动手动脑才行啊.......


_________________
勿在浮沙筑高台


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-11-20 18:50 

注册: 2007-11-20 17:53
帖子: 9
送出感谢: 0 次
接收感谢: 0 次
不过你说:"gcc在编译的时候分配了0x18的空间(好像参数没有保持4字节的对齐...) "
好象恰好就是保持4字节的对齐呀......


_________________
勿在浮沙筑高台


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-12-04 10:21 

注册: 2007-07-25 16:36
帖子: 16
送出感谢: 0 次
接收感谢: 0 次
应该说是保持四字节对其了...只是GCC以前版本会多分配几个地址...原来我也没搞清楚..谢谢楼上的指正


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-12-04 10:30 

注册: 2007-07-25 16:36
帖子: 16
送出感谢: 0 次
接收感谢: 0 次
对于文中的通过溢出获得sh我也成功了:)..只是漏洞程序被我改的面目全非了...而且把书中很多自动化的操作都手动了...找栈底什么的...现今版本的栈底可变了...而且环境变量的地址和栈底之间有可能会相差0X100..(在我看感觉象是随机的..因为不明白机制啊..也可能是分页系统造成的?初步想像~))..惭愧啊~..不过还是厚着脸皮发出来吧...(还在组织逻辑中...操作的太乱..结果写也不好些...)...希望能和大家交流交流...还是感谢7楼的弟兄!


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2007-12-06 19:55 

注册: 2007-11-20 17:53
帖子: 9
送出感谢: 0 次
接收感谢: 0 次
呵呵,希望可以联系你一下.....QQ:296806968...
我还不会perl呢,所以没进行下去,直接问了绿盟了scz(你不会不知道他吧):
confish:
缓冲区溢出的初级问题
我最近在图书馆找到了安焦的那本<网络渗透技术>,就在自己的ubuntu上试了下.不过,第二个就出现问题了.
首先问一个比较基本的问题,我想,缓冲区溢出的基本原理我是明白的,不过,如果对于同一个程序来说,溢出返回地址即可,但是如果用一个利用程序,它是不同的程序,怎么可以在内存中写别的程序的栈呢?
书中的那个程序是这样的:
#include<stdio.h>
#include<string.h>
void my_main(int my_argc,char *my_argv[])
{
char vulnbuff[16];
strcpy(vulnbuff,my_argv[1]);
printf("\n%s\n",vulnbuff);
getchar();
}
int main(int argc,char **argv)
{
my_main(argc,argv);
}
本来不用那个嵌套的,只是在ubuntu里,gcc会在main函数中有一个堆栈保护.
按照书中的说法,找到程序的栈底,然后,将shellcode写进去,ret指令就可以精确定位shellcode但是我在反汇编之后,虽然找到了栈底,却并没有找到书中所说的环境变量,这样不能确定shellcode的长度了.
希望各位可以指导一下.推荐一本这方面的基础书籍最好了.十分感谢.
scz:
这本书就挺基础的啊。

或许你可以不急于干这些事,先学学GDB汇编级调试,根据我的经验,没有什么书可以
包打天下地提前想到它的读者所能碰到的所有问题,此时书的作用无非是给你一个方向
感,不至于太错乱,最终还是以你自己实践出来的奇技淫巧为准吧。

没有环境变量就没有呗,你自己想别的办法岂不更容易掌握原理。

你一定要照搬那书的话,就在虚拟机里装同样版本的OS好了,这也是个办法。

说来说去,还是先熟了GDB为好。

以前我就老看人在问UNP的随书代码怎么编译不过去,当时就奇怪的很,这都什么问题啊,
一点不改就编译得过去那才叫鬼了,理解原理了,自己改改就是。


_________________
勿在浮沙筑高台


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2007-12-08 18:49 

注册: 2007-07-25 16:36
帖子: 16
送出感谢: 0 次
接收感谢: 0 次
我加你QQ了~我看那书上(我那还正版的)的shellcode都是写错的呢(不过如果不是错的我又少发现了一些小现象~)...小四哥大名当然知道了~;"一点不改就编译得过去那才叫鬼了"真是名言啊!


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2007-12-08 19:27 
头像

注册: 2006-05-03 0:39
帖子: 8273
地址: المريخ
送出感谢: 0 次
接收感谢: 1
好长一篇,没心思看

给个评价:很好,很强大


_________________
PHP是最好的语言!不服来战!


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2007-12-09 19:48 

注册: 2007-07-25 16:36
帖子: 16
送出感谢: 0 次
接收感谢: 0 次
谢谢名人捧场啊!我真是觉得荣幸!我看过你很多文章的说...我的下一篇又长了好多..考虑是不是弄个附件传成PDF好了...


页首
 用户资料  
 
14 楼 
 文章标题 : Re: [原创]ubuntu 7.04下对《网络渗透技术》书中的第一个缓冲区溢出小程序的调试笔记。
帖子发表于 : 2008-10-08 19:49 

注册: 2008-09-28 16:41
帖子: 37
送出感谢: 0 次
接收感谢: 0 次
刚装了Ubntu 8.04,正好又看《网络渗透技术》,正好发现跟书上讲的linux的栈空间不一样。照着书上也行不通,刚好想这样试一下,不巧发现你的帖子。
顶一下!!!


页首
 用户资料  
 
15 楼 
 文章标题 : Re: [原创]ubuntu 7.04下对《网络渗透技术》书中的第一个缓冲区溢出小程序的调试笔记。
帖子发表于 : 2008-10-08 20:44 
头像

注册: 2005-09-06 20:34
帖子: 501
送出感谢: 3
接收感谢: 1
谁手头有《网络渗透技术》电子版的?

给我发一份,email:jarodlau@163.com


_________________
arch
awesome
blog
+github
freebsd handbook中文版


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译