大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
Bof基础
Bof原理
Linux下进程地址空间的布局
典型的堆栈结构
上图中可以看到栈中有return address还有局部变量,也就是函数的参数,bof攻击是利用上参数的溢出将返回地址return address用自己构造的数据覆盖掉,从而控制程序的进程。接下来就试着通过bof攻击来实现调用getshell函数。
通过前面可以看出只要把返回地址改成getshell函数的起始地址就可以,但是需要先确定局部变量的大小,然后才能将getshell的起始地址恰好放到return address的位置。直接的想法就是拿一个足够长的参数去试,这时要借助debug工具才能看出那部分数据是溢出的,那部分数据在局部变量范围内,linux终端下gdb就可以进入debug。在debug下运行程序并输入测试用例1111111122222222333333334444444455555556666666,查看结果如下图。
里面用到info命令查看eip寄存器(返回地址)的值,注意到0x35就是‘5’的ascll码,因此可以确定地址应该在8个5的位置,于是再输入一组测试,1111111122222222333333334444444412345678来确定4字节地址的具体位置。
此时就可以确定输入32字节之后的4个字节就是我们要覆盖的返回地址所在的位置了,接下来就是把原来的地址改为getshell函数的起始地址。从之前逆向的反汇编中我们知道getshell的起始地址是0x0804847d,但是直接按这个顺序输入会错,因为从上图中看出当输入是1234时eip寄存器中的值却对应的是4321,这是因为栈顶是低地址的缘故,所以0x0804847d也需要反着输入,即0x7d840408。这时又出现一个问题,如何将0x0408输入,直接输入显然不能实现,但我们知道在编程语言中的print函数是可以做到的,再加上管道|就能把数据输入了。
下面选择使用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。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/167361.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...