Bof基础实践

Bof基础

Bof原理

Linux下进程地址空间的布局html

 

典型的堆栈结构linux

  上图中能够看到栈中有return address还有局部变量,也就是函数的参数,bof攻击是利用上参数的溢出将返回地址return address用本身构造的数据覆盖掉,从而控制程序的进程。接下来就试着经过bof攻击来实现调用getshell函数。shell

  经过前面能够看出只要把返回地址改为getshell函数的起始地址就能够,可是须要先肯定局部变量的大小,而后才能将getshell的起始地址刚好放到return address的位置。直接的想法就是拿一个足够长的参数去试,这时要借助debug工具才能看出那部分数据是溢出的,那部分数据在局部变量范围内,linux终端下gdb就能够进入debug。在debug下运行程序并输入测试用例1111111122222222333333334444444455555556666666,查看结果以下图。编程

里面用到info命令查看eip寄存器(返回地址)的值,注意到0x35就是‘5’的ascll码,所以能够肯定地址应该在8个5的位置,因而再输入一组测试,1111111122222222333333334444444412345678来肯定4字节地址的具体位置。bash

   此时就能够肯定输入32字节以后的4个字节就是咱们要覆盖的返回地址所在的位置了,接下来就是把原来的地址改成getshell函数的起始地址。从以前逆向的反汇编中咱们知道getshell的起始地址是0x0804847d,可是直接按这个顺序输入会错,由于从上图中看出当输入是1234时eip寄存器中的值却对应的是4321,这是由于栈顶是低地址的缘故,因此0x0804847d也须要反着输入,即0x7d840408。这时又出现一个问题,如何将0x0408输入,直接输入显然不能实现,但咱们知道在编程语言中的print函数是能够作到的,再加上管道|就能把数据输入了。dom

下面选择使用perl语言构造输入数据:编程语言

 能够看到成功的调用了getshell函数。函数

  既然能够跳转到任意咱们输入的地址,那么只要注入本身编写的shelcode而后再跳到对应的位置,咱们的shellcode就能够顺利的运行。下面尝试利用相似的方法插入并让程序运行本身编写的代码。工具

shallcode注入

准备工做

  

root@KaliYL:~# execstack -s pwn1    //设置堆栈可执行
root@KaliYL:~# execstack -q pwn1    //查询文件的堆栈是否可执行
X pwn1
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 
2
root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 
0

 

  首先须要肯定咱们插入shellcode后的地址在哪,下图是已经跳转失败后查看的寄存器数据,因此此时栈顶esp就是eip的下一字,由于eip刚刚弹出栈,从栈顶的数据也能够看出。我直接选择了eip后做为shellcode的起始地址,所以我应该把eip的值改成0xbffff1f0,一样在注入时地址须要反着输入,可是shellcode不须要逆序输入,由于程序是按照从低地址到高地址执行的。布局

 

接下来就构造输入数据,先按前一步把eip和前32字节内容写到input2文件中。而后编写shellcode,编写一个c文件编译,而后反汇编找到须要的部分加到input2后面,。

代码以下图,只有输出hello world的功能,为了方便直接将整段程序接到input2后面,利用hello >> input2很方便就能实现。

将input2做为输入程序成功输出hello world以下

shellcode的编写其实有不少坑,了解更多http://www.cnblogs.com/xxy745214935/p/6477120.html。

相关文章
相关标签/搜索