1.在 Linux 上使用 Checksec 识别二进制文件的源码安全属性 | Linux 中国
2.pwn基础— Got表劫持
3.JetPack Compose从初探到实战
在 Linux 上使用 Checksec 识别二进制文件的安全属性 | Linux 中国
这篇文章介绍如何使用Checksec工具识别Linux上的二进制文件安全属性,了解属性含义及应用。源码
在编译源代码时,源码gcc编译器可提供标志调整二进制文件的源码安全属性。Checksec是源码一个简单shell脚本,可检测编译期间添加的源码crx破解源码安全属性。
安装Checksec,源码基于Fedora的源码系统使用命令`sudo dnf install checksec`。基于Debian的源码系统用`sudo apt install checksec`。
运行Checksec识别安全属性,源码如RELRO、源码STACK CANARY、源码NX等。源码属性颜色显示状态,源码绿色为良好,源码红色可能不是最佳。某些红色属性不一定表示文件质量差。
Checksec输出包括安全属性和文件状态,如NX enabled表示堆栈数据无执行权限。使用示例二进制文件“hello world”进行验证。
更改Checksec输出格式,linux 源码编译教程使用`--output`选项自定义,通过管道将结果传递至jq进行美化打印。
检查二进制文件“hello”和“ls”安全属性差异,解释Checksec查找信息方式。
符号、Canary、PIE、NX、RELRO等属性解释。如何删除符号、启用Canary、PIE、NX、RELRO。演示禁用NX及启用全RELRO。
了解Fortify安全属性,但本文不深入。其他Checksec功能,如检查多个文件、进程、mpeg2源码内核。
通过Checksec了解安全属性,包括符号、Canary、PIE、NX、RELRO等,识别每个属性及其阻止的攻击类型。
pwn基础— Got表劫持
随着技术的发展,攻击者越来越重视对软件的深入理解,其中对GOT(全局偏移表)的劫持技术成为了渗透测试中的一种重要手段。本文将对GOT表劫持的基础知识进行深入讲解,包括其原理、流程、检测方法、保护机制、源码分析以及利用脚本的编写和动态调试分析。
程序信息方面,我们以ELF程序为例。由于延迟绑定机制的ngrok2.1源码存在,GOT是可以被修改的,这为攻击者提供了任意控制程序流程的可能性。劫持原理主要分为两步:首先,在未执行漏洞函数前,GOT中的特定地址存储着真实的函数地址;然后,通过执行漏洞函数,将该地址修改为攻击者想要的函数地址,如system函数,从而在再次调用原函数时,其行为被改变了。
检测保护机制时,通常使用检查安全工具来分析程序的安全性。在本例中,程序仅开启了Canary保护和部分RELRO保护,这意味着堆、栈、BSS段代码可执行,但GOT仍然可写。这为GOT劫持提供了条件。保护机制的idle gui 源码分析全称为RELRO(Relocation Read-Only),通过设置全RELRO,可以防止GOT劫持,因为在加载时将所有函数绑定完成,GOT被设置为不可写。
分析源码是理解攻击流程的关键步骤。题目直接提供了源码,通过仔细阅读,我们可以发现puts@plt地址和全局变量name的地址,这是进行GOT劫持和shellcode注入的基础。
编写利用脚本是将理论知识转化为实践的环节。通过编写并执行exp脚本,成功实现了getshell,验证了攻击流程的有效性。动态调试分析提供了更直观的视角,通过在关键位置设置断点,观察内存内容的变化,确认shellcode的注入和目标地址的修改,最终实现目标函数的劫持。
综上所述,GOT表劫持技术是渗透测试领域中一种复杂且强大的攻击手段。通过深入了解其原理、流程、保护机制和利用方法,可以有效提升安全意识和防御能力。对于开发者而言,及时更新安全保护机制,如全RELRO保护,可以有效防止GOT劫持,保障软件的安全性。
JetPack Compose从初探到实战
Jetpack Compose,Google对Android UI的重大变革,现已进入稳定版阶段,是深入理解的最佳时机。它以Kotlin为基础,采用声明式编程构建UI,相较于以往使用XML描述UI,通过Java/Kotlin在Activity中操作View的方式,Jetpack Compose能显著提升开发效率,优化用户体验。
长期以来,Android的UI开发依赖XML文件,操作系统解析后生成View,通过Java/Kotlin操作。这种方式存在多处问题,如XML与Java/Kotlin的分离,命令式编程导致的复杂性。Jetpack Compose通过抛弃XML,采用Kotlin描述UI,实现声明式编程,简化UI修改流程,数据变化自然驱动UI更新,大大提升了开发效率。
在Jetpack Compose的初探中,推荐下载Android Studio Canary版本进行体验。引入Jetpack Compose的方式有两种:创建全新的Composable项目或在现有项目中加入。在创建新项目时,只需选择Empty Compose Activity。对于现有项目,则需配置Gradle,最低支持API 及以上,启用Compose支持,并引入相关依赖。
接入Jetpack Compose有两种方式:setComposesetContent和new。setComposesetContent是Google推荐的默认方式,使用Composable函数如Text构建UI。new方式则需深入查看setContent源码,理解其本质为创建ComposeView并调用setContentView,适用于Fragment等场景。
XML方式与传统XML布局类似,通过id获取ComposeView,调用setContent()使用Composable函数。此方式适用于成熟项目,但Jetpack Compose的核心理念是放弃XML,因此推荐直接使用第一种方式。
深入探讨Composable函数,如Text,它是描述UI和数据关系的关键组件。Composable函数的特性,如乱序执行、并行执行、局部跳过、乐观操作、频繁执行,为Jetpack Compose框架提供了高效的执行机制。
乱序执行和并行执行优化了重组效率,局部跳过减少无用计算,乐观操作实现高效重组,频繁执行处理高成本操作。理解这些特性,有助于开发者编写高效、稳定的代码。
实战应用,以构建经典feed流界面为例,通过使用Card、Column、Row等Composable函数实现布局,使用Column、Row进行垂直、水平排列,使用Modifier进行外观和交互调整。引入LazyColumn轻松实现列表加载,无需传统开发模式的样板代码。
了解Jetpack Compose的关键概念后,可以发现其在Android开发领域的巨大潜力。通过引入ViewModel和LiveData进行状态管理,Jetpack Compose与Jetpack工具包无缝集成,为开发者提供强大的支持。
Jetpack Compose的优势在于完全复用Jetpack工具包,熟悉的Kotlin语法,以及与原生Android开发的无缝衔接。然而,Composable函数的并行执行要求开发者编写线程安全的代码,避免常见错误,是当前面临的主要挑战。随着后续版本的更新,期待解决这一问题,进一步提升Jetpack Compose的开发体验。