CobaltStrike插件编写之语言陷阱(一)

作者:飞天魔鬼
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。

0x01前言

众所周知,cs的插件引擎是使用的sleep脚本实现的。在编写cna脚本时,我们需要使用sleep脚本去调用cs实现好的hook来实现很多功能。但是其实sleep脚本本身和cs的hook都有一些语言陷阱,这个系列将会介绍一些我在写cna脚本时遇到的一些问题,以及告诉大家如何避免这些语言陷阱。

0x02“==”和“eq”的区别

在我们进行if判断的时候,不免会对字符串和字符串之间或者整数和整数之间进行比较,但是在sleep脚本中,整数与整数之间的比较和字符串和字符串之间的是有一定的区别的,先看代码:

$int1 = 2;
$int2 = 2.0;

if ($int1 == $int2){
    
    
    println("true");
}else{
    
    
    println("false");
}

这里我定义了两个数字。分别为int1和int2,在数值上int1是等于int2的,但是在类型上,int1是一个整数,但是int2是一个浮点数。
在这里插入图片描述
我们在使用“”进行比较的时候,int1和int2的比较结果是相等的,但是如果我们将“”改为eq的话,结果就会变成下面的样子:

$int1 = 2;
$int2 = 2.0;

if ($int1 eq $int2){
    
    
    println("true");
}else{
    
    
    println("false");
}

在这里插入图片描述
出现这种问题的原因是因为sleep在使用“==”进行比较的时候,是先将进行比较的两个变量转换为整数,所以int1就等于了int2。

而在使用“eq”进行比较的时候,sleep是首先将两个变量转为字符串类型进行比较的,所以int1就变成了“2”,而int2就变成了“2.0”,所以这两个变量在使用eq进行比较的时候也就不相等了。

0x03 script_resource分割字符串问题

在进行cna插件的编写的时候,难免会进行windwos系统路径的分割,例如我们要获取“C:\Users\admin\Desktop\tools\browser64.exe”这个文件的位置,然后对这个文件路径使用sleep中的split函数进行分割。假如tools文件为cna插件的根目录,那么我们就可以使用script_resource函数进行路径的获取。

$path = "C:\\Users\\admin\\Desktop\\tools\\browser64.exe";
@arry = split("\\\\",$path);
println("type of path is: <".typeOf($path)."> the value is: ".$path." the lenth of path is :".strlen($path));
println(@arry);

以上代码为我们定义了一个path字符串,该字符串为browser64.exe文件的绝对路径,当我们进行分割的时候是可以分割的。以下为运行结果:
在这里插入图片描述
可以看到cs正确的对该路径进行了分割,而且path变量的类型也为sleep脚本中对应的string类型并且长度为42。但是如果我们使用cs内置的script_resource函数进行路径的获取再对其分割,就会发生奇怪的问题:

$path2 = script_resource("tools\\browser64.exe");
@arry2 = split("\\\\",$path2);
println("type of path2 is: <".typeOf($path2)." >the value is: ".$path2." the lenth of path is :".strlen($path2));
println(@array2);

在这里插入图片描述
可以看到使用script_resource之后,字符串的类型同样为sleep脚本中的string,而且长度依然为42,但是我们再对其进行分割,获得到的返回结果就为空了。也就是说使用script_resource函数获取到的路径,就不能直接进行split分割了。

但是如果我们将代码改为以下形式:

ub split_it
{
    
    
    @array_tmp = split("\\\\",$1);
    println(@array_tmp);
}
$path2 = script_resource("tools\\browser64.exe");
println("type of path2 is: <".typeOf($path2)." >the value is: ".$path2." the lenth of path is :".strlen($path2));
split_it($path2);

我们定义一个函数来接收script_source获取到的路径,然后在这个函数里进行分割,查看结果:
在这里插入图片描述
可以看到竟然可以正常分割了。简直是奇了大怪。

0x04 总结

以上就是我在最近写cna插件时遇到的一部分语言陷阱。sleep脚本和cs结合之后问题还有很多,后面总结之后再写文章进行发布。有的时候cs内置的脚本控制台报错很奇怪,可以在剥离cs内置函数之后在本地的sleep环境进行测试一下,建议大家在写插件时遇到奇怪问题多做一些尝试。

0x05 了解更多安全知识

欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_42282189/article/details/120293827