1.?手撕什叫手撕?˺Դ??
2.DIff算法看不懂就一起来砍我(带图)
3.手撕CTFHub-Web(七):RCE
??˺Դ??
在FPGA领域,图像拼接技术的源码应用广泛,尤其在医疗和军工行业。代码市面上的手撕什叫手撕图像拼接方案主要分为两类:一类是Xilinx官方推出的Video Mixer方案,通过SDK配置即可实现;另一类是源码自定义方案,需要开发者自己手撕代码。代码宅聊 源码Xilinx的手撕什叫手撕Video Mixer方案虽然可以直接调用IP,但在资源消耗和使能难度上相对较高,源码不太适合小规模FPGA应用。代码然而,手撕什叫手撕对于Zynq和K7以上平台,源码它则表现出较好的代码适应性。如果对Video Mixer方案感兴趣,手撕什叫手撕可以参考之前的源码博客。
本文将详细介绍如何使用Xilinx的代码Kintex7 FPGA,纯verilog代码实现路视频图像拼接,以满足不同场景的需求。视频源选择灵活,可使用廉价的OV摄像头模组或内部生成的静态彩条模拟摄像头视频。默认使用OV作为视频源,但可根据需求切换至静态彩条模式。
视频处理过程包括摄像头配置与数据采集、视频拼接算法设计、Homo是人源码图像缓存与输出。摄像头采集模块将DVP接口的视频数据转换为RGB或RGB格式,支持不同分辨率和格式的输出。静态彩条模块则提供不同分辨率的视频选择,包括边框宽度、动态方块大小和移动速度的参数化配置。
在视频拼接方面,通过优化FDMA方案,实现图像的三帧缓存,确保不同视频在DDR3中的存储位置不同,从而顺利进行视频读写和拼接。最终,输出视频分辨率为x,满足路视频拼接需求,每路视频分辨率为x,布局美观且效率高。
本文不仅提供了完整的工程源码,还附带了技术支持,旨在帮助在校学生、研究生和在职工程师学习提升,适用于医疗、军工等行业的直播盒子源码2021高速接口或图像处理领域。对于不同FPGA型号、版本的移植问题,提供了详细的指导,确保代码的适应性和可移植性。此外,还提供了上板调试和演示验证的步骤,以及静态演示和动态视频演示。
如果您对本文内容感兴趣,且希望获取完整工程源码和技术支持,请私信博主。资料将通过某度网盘链接方式提供,确保代码的安全传输。
DIff算法看不懂就一起来砍我(带图)
面试官:“你对虚拟DOM(Virtual DOM)和Diff算法了解吗?请描述一下。”
我:“额,那个,嗯...”突然智商不在线,没组织好语言,没答好或者压根就答不出来。
所以这次我总结一下相关的知识点,让你可以有一个清晰的认知,也会让你在今后遇到这种情况可以坦然自若,应付自如,类似上线了源码游刃有余:
相关知识点:
虚拟DOM(Virtual DOM):
Diff算法:
虚拟DOM(Virtual DOM):
什么是虚拟DOM:
一句话总结虚拟DOM就是一个用来描述真实DOM的JavaScript对象,这样说可能不够形象,那我们来举个:分别用代码来描述真实DOM以及虚拟DOM。
真实DOM:
对应的虚拟DOM:
控制台打印出来的Vnode:
h函数生成的虚拟DOM这个JS对象(Vnode)的源码:
补充:
上面的h函数大家可能有点熟悉的感觉但是一时间也没想起来,没关系我来帮大伙回忆;开发中常见的现实场景,render函数渲染:
为什么要使用虚拟DOM:
灵魂发问:使用了虚拟DOM就一定会比直接渲染真实DOM快吗?答案当然是否定的,且听我说:
举例:当一个节点变更时DOMA->DOMB
上述情况:
示例1是创建一个DOMB然后替换掉DOMA;
示例2去创建虚拟DOM+Diff算法比对发现DOMB跟DOMA不是相同的节点,最后还是创建一个DOMB然后替换掉DOMA;
可以明显看出1是更快的,同样的结果,2还要去创建虚拟DOM+Diff算法对比
所以说使用虚拟DOM比直接操作真实DOM就一定要快这个说法是错误的,不严谨的
举例:当DOM树里面的某个子节点的内容变更时:
当一些复杂的节点,比如说一个父节点里面有多个子节点,当只是一个子节点的内容发生了改变,那么我们没有必要像示例1重新去渲染这个DOM树,这个时候虚拟DOM+Diff算法就能够得到很好的体现,我们通过示例2使用虚拟DOM+Diff算法找出改变了的子节点更新它的内容就可以了
总结:复杂视图情况下提升渲染性能,因为虚拟DOM+Diff算法可以精准找到DOM树变更的地方,减少DOM的操作(重排重绘)
虚拟dom库Diff算法:
在看完上述的文章之后相信大家已经对Diff算法有一个初步的概念,没错,Diff算法其实就是找出两者之间的差异;
diff算法首先要明确一个概念就是Diff的对象是虚拟DOM(virtual dom),更新真实DOM是Diff算法的结果。
下面我将会手撕snabbdom源码核心部分为大家打开Diff的家政三端源码心,给点耐心,别关网页,我知道你们都是这样:
snabbdom的核心
init函数
init函数时设置模块,然后创建patch()函数,我们先通过场景案例来有一个直观的体现:
当init使用了导入的模块就能够在h函数中用这些模块提供的api去创建虚拟DOM(Vnode)对象;在上文中就使用了样式模块以及事件模块让创建的这个虚拟DOM具备样式属性以及事件属性,最终通过patch函数对比两个虚拟dom(会先把app转换成虚拟dom),更新视图;
我们再简单看看init的源码部分:
这些地方也会用createElement来命名,它们是一样的东西,都是创建虚拟DOM的,在上述文章中相信大伙已经对h函数有一个初步的了解并且已经联想了使用场景,就不作场景案例介绍了,直接上源码部分:
总结:h函数先生成一个vnode函数,然后vnode函数再生成一个Vnode对象(虚拟DOM对象)
补充:
在h函数源码部分涉及一个函数重载的概念,简单说明一下:
重载这个概念和参数相关,和返回值无关
patch函数(核心):
要是看完前面的铺垫,看到这里你可能走神了,醒醒啊,这是核心啊,上高地了兄弟;
源码:
看得可能有点蒙蔽,下面再上一副思维导图:
题外话:Diff算法简介:
传统Diff算法
snabbdom的Diff算法优化
下面我们就会介绍updateChildren函数怎么去对比子节点的异同,也是Diff算法里面的一个核心以及难点;
updateChildren(核中核:判断子节点的差异):
为了更加直观的了解,我们再来看看同级别节点比较的五种情况的实现细节:
新开始节点和旧开始节点(情况1)新结束节点和旧结束节点(情况2)旧开始节点/新结束节点(情况3)旧结束节点/新开始节点(情况4)新开始节点/旧节点数组中寻找节点(情况5)
下面我们再介绍一下结束循环的收尾工作(oldStartIdx>oldEndIdx || newStartIdx>newEndIdx):
最后附上源码:
key的作用:
以下我们看看这些作用的实例:
Diff操作可以更加准确;(避免渲染错误)
实例:a、b、c三个DOM元素中的b、c间插入一个z元素
没有设置key
没有设置key
当设置了key:
Diff操作可以更加准确;(避免渲染错误)
实例:a、b、c三个DOM元素,修改了a元素的某个属性再去在a元素前新增一个z元素
没有设置key:
因为没有设置key,默认都是undefined,所以节点都是相同的,更新了text的内容但还是沿用了之前的DOM,所以实际上a->z(a原本打勾的状态保留了,只改变了text),b->a,c->b,d->c,遍历完毕发现还要增加一个DOM,在最后新增一个text为d的DOM元素
设置了key:
当设置了key,a、b、c、d都有对应的key,a->a,b->b,c->c,d->d,内容相同无需更新,遍历结束,新增一个text为z的DOM元素
不推荐使用索引作为key:
设置索引为key:
这明显效率不高,我们只希望找出不同的节点更新,而使用索引作为key会增加运算时间,我们可以把key设置为与节点text为一致就可以解决这个问题:
最后:
如有描述错误或者不明的地方请在下方评论联系我,我会立刻更新,如有收获,请为我点个赞,这是对我的莫大的支持,谢谢各位。
手撕CTFHub-Web(七):RCE
在深入探讨 RCE(远程代码执行)的实现过程中,我们首先聚焦于 PHP 中的 eval 函数。eval 函数允许执行 PHP 字符串,通常通过接收 POST 或 GET 方法提交的数据,如 cmd 参数。这允许执行如 `system('ls')` 这样的命令,以查看当前目录。然而,没有对输入进行过滤,这直接导致了攻击者可以连接到菜刀(web shell)服务器。
当在根目录发现 flag 文件时,我们注意到一个名为 shell.txt 的一句话木马文件。通过接收 file 参数并利用 strpos 函数,我们可以绕过对 flag 文件的直接包含限制。构造请求 `?file=./shell.txt` 来包含 shell.txt,并使用菜刀连接,我们得以在根目录下获取 flag。
接着,我们转向 PHP://input 的概念,它允许将 POST 请求中的数据作为 PHP 代码执行。构造 `?file=php://input` 的请求并提交 POST 数据,我们可以执行命令并从根目录中找到 flag 文件。
远程包含提供了一种通过外部服务器的包含命令执行代码的方法。通过在 file 参数中填写自己的服务器上的包含一句话木马的 txt 文件地址,我们可以绕过服务器端的限制,直接在根目录下找到 flag。
在尝试直接读取源代码时,发现与 PHP://input 类似的问题。根据题目描述和提示,我们猜测使用 PHP://filter 协议可以读取 flag 文件。构造请求 `/?file=php://filter/read=convert.base-encode/resource=/flag`,读取 flag 文件的 base 内容,然后对得到的内容进行 base 解码以获取 flag。
进入命令注入的探讨,exec 函数用于执行 cmd 参数指定的命令,并将执行后的返回状态写入 res。尽管尝试使用管道符|连接命令,但没有返回任何内容,可能是因为存在无法显示的字符。使用 base 编码并导出命令后,解码得到 flag。
面对 cat 命令的过滤,我们使用连接符''、\ 或 $@ 来绕过过滤,构造命令 `.0.0.1|ca''t ./ flag_.php|base`,获取 base 编码后的内容并解码得到 flag。
过滤空格的处理中,我们使用连接符`<`构造命令 `.0.0.1|cat<./flag_.php|base`,获取 base 编码后的内容,解码后得到 flag。
目录分隔符的过滤处理需要特别注意,使用分号`;`来分割命令。由于 `/` 被过滤,我们先用 `cd` 进入 flag_is_here 文件夹,然后用 `cat` 读取 flag 文件 flag_.php。构造命令 `.0.0.1;cd flag_is_here;cat flag_.php` 获取 flag。
运算符的过滤包括 |、& 和 ||,通过使用分号`;`来分隔命令,我们绕过了这些过滤。构造命令 `.0.0.1;cat flag_.php` 并查看源代码页面以获取 flag。
综合过滤练习要求我们整合多种技术,以应对复杂的过滤策略。借助一篇文章中提供的 Linux 绕过方法,我们了解到使用 `%0a` 作为分隔符可以执行命令。请注意 `%0a` 是 URL 编码,必须在 URL 中使用,否则将被二次编码。构造请求 `?ip=.0.0.1%0als` 可以执行成功并发现目录 flag_is_here。接下来,用 `%` 代替空格并使用连接符`'’`绕过对关键词 cat 和 flag 的过滤,构造命令 `?ip=.0.0.1%0acd%fl''ag_is_here%0aca''t%fl''ag_.php` 并查看源码获取 flag。