符号修饰与函数签名
符号符号修饰与函数签名约在20世纪70年代以前,编译器编译源代码产生目标文件的时候,符号名与相应的变量和函数的名字是一样的。
但是现在库和目标文件越来越多,如果我们想要使用一个库的时候,我们就不能使用库中定义的函数和变量。否则就会有符号名冲突。为了防止符号名冲突,UNIX下的C语言就规定,C语言源代码文件中的所有全局变量和函数经过编译后,相对应的符号名前加上下划线”_”。
这种简单而原始的方法确实能够解决符号冲突的概率,但是当程序很大时,不同模块由多个部门开发,他们之间的命名规范如果不严格,则很有可能导致冲突。于是像C++这样的后来设计的语言开始考虑到了这个问题,增加了 名称空间(Namespace)的方法来解决多模块的符号冲突问题。
随着时间的推移,很多操作系统和编译器被完全重写,符号冲突问题不是那么明显了,现在的Linux下的GCC编译器中,默认情况下已经去掉了在C语言符号中加”_”的方式。只有GCC在windows平台下的版本(mingw,cygwin)和 Visual C++ 编译器会在C语言符号前加”_“。
C++符号修饰众所周知,强大而又复杂的C++拥有类,继承,虚机制 ...
祥云杯2022-protocol赛后复现
祥云杯2022-protocol赛后复现前言离离原上谱的一道题,开始完全没有任何思路,又是protocol协议,又是静态编译去除符号表的,头都大了,没分析出来。还是赛后看着wp复现的。确实是自己菜狗了
但确实也提醒我去多了解了解网络方面的知识了,pwn终究还是个大杂烩,只会一些二进制漏洞的利用还是不够的,还得和其他方向结合一下。
知识点protocol协议其实就是一个文件传输协议,在你要传输的信息前面加点东西,然后再传输过去,那边再根据协议解包就行了,网上都有现成的资料可以看看
protocol协议的提取在做题的时候我们需要知道protocol协议的一个.proto文件,但是要是让我们去一点点看结构体什么的来提取会很麻烦,还好github上有现成的提取项目可以直接用
https://github.com/marin-m/pbtk
记得安装的时候一定要用python3和pip3,否则会有不知名的错误,一直修不好,血泪教训,如果你python2能用的话,那就没事
用下面的命令来提取文件
1./extractors/from_binary.py protocol ./
就能得到一个 ...
祥云杯2022-unexploitable - wp
祥云杯2022-unexploitable - wp题目分析分析一下文件,发现只有一个read函数来读取数据,但是给的空间非常大,基本上是随便溢出了。但是还是出了点小问题,刚好这是我第一道爆破的题,记录一下,以后要是忘了还可以回来看看
exp看栈上返回地址的后面第二位是libc_start_main一定偏移的地址,于是我们可以通过部分覆盖法来将该地址覆盖为one_gaget的地址,看师傅们的wp
有用vsyacall来使返回地址滑到libc那里去的
也有通过返回到push ebp之后的地址使返回地址的上一位被弹出的
好像还能用ret2_dl_runtime来做(还没有自己试过)
前两种方法都是爆破法来求解,但是爆破的概率有点小,需要爆破三位。全凭运气了,概率为4096分之一。但还是写一下。最近发现爆破法用得挺多的。
通过ret_push_after 的exp在下面
12345678910111213141516171819202122from pwn import *context.log_level = "debug"global pdef pwn(): ...
由endbr64指令而获取到的CET知识
由endbr64指令而获取到的CET知识控制流完整性针对于漏洞利用,最终的效果和目的就是劫持控制流,控制目标程序做一些他本来做不了的事情。可以达到这一目的的方式有很多,比如ROP、劫持函数指针等等。而这些都来自于软件中一些漏洞,如缓冲区溢出、释放后利用等等。最初防御的方式就是头疼医头,脚疼医脚,哪里出现了漏洞比如缓冲区溢出,我们就检查一下内存边界,或者在边界处设置一个cookie(canary)。
或许是漏洞多的补不过来,之前的防御方式不能很好的完成防御计算机被破坏的工作,原本的防御方式经过几轮较量后衍生出了很多绕过方式,这些攻击手法就是现代漏洞利用技术的核心,比如ROP。如果攻击者通过层层阻挠,到达了执行ROP这一步,那么后续的路基本就畅通无阻了,因为之前并没有防御ROP的有效方式。
CFI即Control Flow Integrity控制流完整性就是指程序运行时控制流的合法性。这一步概念被提出来主要就是为了针对ROP的防御。可以将程序运行看作是一辆车在路上跑,开发者遵循的安全开发准则,比如说严格控制好边界等可以看作是司机在路上遵守交通规则;而之前的防御如canary等内存边界检查机 ...
用patchelf改程序后在exp中用gdb.attach()调试堆栈
用patchelf改程序后在exp中用gdb.attach()调试堆栈问题来源在做pwn题时,经常遇到题目的libc版本与自己虚拟机的版本不同,而用patchelf改链接后,gdb堆栈指令看不了,困扰了我很久,查阅了很多师傅的博客找到了一种解决办法
实现方法:我这边拿2020纵横杯 wind_farm_panel这道pwn题做演示它的靶机是Ubuntu 16.04,libc2.23而我自己的虚拟机为kali 2022.3,libc2.36
首先patchelf改链接:ld可以在glibc-all-in-one中找到
12patchelf --replace-needed libc.so.6 你要换的libc的硬路径 ./pwnpatchelf --set-interpreter ld的硬路径 ./pwn
我这里改为
成功改完之后发现gdb堆栈的指令实现不了出现报错这里面的下载了也没用
12345678heap: This command only works with libc debug symbols. They canprobably be installed vi ...
物联网漏洞挖掘思路
物联网漏洞挖掘思路攻击面分析在做攻击面分析前我们首先要知道,对于一个常规的物联网设备而言,可以分为设备端、手机端和云端。而这三个不同的端都会存在自己一些特殊的攻击面。比如设备端我们往往会先想办法获取固件然后分析核心服务,而APP端则会有注入蓝牙等一系列操作。
硬件分析针对硬件的分析主要停留在电路板上使用的芯片以及配套的解决方案,一般重点关注MCU型号以及外挂Flash闪存。其次便是寻找各类接口,如UART、ADB、JTAG等。
对于UART口一般可以直接找并排或相距不远的多个焊点和通孔,然后借助万用表来识别每个串口对应的功能。也可以直接使用JTAGulator来直接进行识别,当然他更强大的功能是识别JTAG接口。
信息收集做完硬件层面的分析接下来就是要正式开始,一般会在未获取固件前就对端口开放信息进行扫描,了解其对外开放的一些服务并进行黑盒测试。
过第一步说的接口进入shell后可以用ps查看设备开启了哪些服务,这些服务都是后期重点的挖掘方向。其次便是分析固件文件系统,查看固件使用了哪些中间件,如果有中间件,查看中间件的配置文件,获取中间件配置信息,当没思路的时候可以查看中间件是 ...
爆破Canary
爆破CanaryCanary 爆破的原理Canary爆破是除Canary泄露外的另一个针对canary保护的利用方法。
对Canary而言,虽然每次进程重启后的Canary不同,但是同一个进程中的不同线程的Canary是相同的,并且通过fork函数创建的子进程的Canary也是相同的。我们可以利用这个特点,逐个字节将Canary爆破出来。不管是32位,还是64位的Canary,最低的一个字节均为0x00,从这个字节开始,依次破解每个字节:每次填入的值与Canary不匹配,则程序崩溃;每次填入的值与Canary匹配,则继续破解下一个字节。填入最高字节时,Canary匹配,就成功破解出了Canary。
爆破Canary的exp123456789101112131415161718192021222324252627from pwn import *context.log_level = 'debug'context.terminal = ['gnome-terminal','-x','bash','- ...
熊猫杯-PWN题复现
熊猫杯-PWN题复现safestring一个格式化字符串的利用,但是不能需要先进行加密再进行传输,其实也就是一个凯撒加密,逆向出来的解密函数如下
1234567891011121314151617181920def decode_s(data): result = bytearray() data=bytearray(data) for byte in data: if 32 <= byte <= 126: # 可见字符范围 if 65 <= byte <= 90: # 大写字母 A-Z base = 65 elif 97 <= byte <= 122: # 小写字母 a-z base = 97 else: result.append(byte) continue # 凯撒密码解密,向前移动23个位置 ...
漏洞利用开发--shellcode开发
漏洞利用开发–shellcode开发shellcode 的基本原理shellcode 通常使用机器语言编写,是一段用于利用软件漏洞而执行的代码。
shellcode根据它是让攻击者控制它所运行的机器,还是用过网络控制另一台机器,可以分为本地和远程两种类型。本地shellcode常用于提权,攻击者利用高权限程序中的漏洞(例如缓存区溢出),获得与目标进程相同的权限。远程shellcode则用于攻击网络上的另一台机器,通过TCP/IP套接字为攻击者提供shell访问。根据连接的方式不同,可以分为反向shell(由shellcode建立与攻击者机器的连接),绑定shell(shellcode绑定到端口,由攻击者发起连接)和套接字重用shell(重用exploit所建立的连接,从而绕过防火墙)。
有时候,攻击者注入目标进程中的字节数是被限制的,因此可以将shellcode分阶段执行,有前一段比较简短的shellcode将一阶段复杂的shellcode(或者可执行文件)下载并执行,这是恶意程序常见的一种操作。但有时候攻击者并不能确切的知道后一阶段的shellcode被加载到内存的哪个位置 ...
渗透测试-木马免杀的几种方式
渗透测试-木马免杀的几种方式0x01前言免杀就是反病毒技术,,它指的是一种能使病毒木马免于被杀毒软件查杀的技术。由于免杀技术的涉猎面非常广,其中包含反汇编、逆向工程、系统漏洞等黑客技术,所以难度很高,一般人不会或没能力接触这技术的深层内容。其内容基本上都是修改病毒、木马的内容改变特征码,从而躲避了杀毒软件的查杀。
它除了使病毒木马免于被查杀外,还可以扩增病毒木马的功能,改变病毒木马的行为。免杀的基本特征是破坏特征,有可能是行为特征,只要破坏了病毒与木马所固有的特征,并保证其原有功能没有改变,一次免杀就能完成了。
免杀技术也并不是十恶不赦的,例如,在软件保护所用的加密产品(比如壳)中,有一些会被杀毒软件认为是木马病毒;一些安全领域中的部分安全检测产品,也会被杀毒软件误杀,这时就需要免杀技术来应对这些不稳定因素。
0x02查杀方式及原理杀毒软件基本原理1. 无害没有任何可疑行为,没有任何特征符合病毒。
2. 可疑存在可疑行为:操作注册表,打开powershell,修改用户,操作敏感文件等。
3. 病毒特征符合病毒。
杀毒软件常用识别方式1. 静态:从病毒体中提取的病毒特征码,逐个与程序文件 ...