周一在2号实验楼323嵌入式实验室用U盘时发现有病毒,重启后发现刚启动时电脑就有病毒,看来还原卡没起作用。一时兴起打包了病毒文件回来研究下。

病毒文件名:SysAnti.exe
文件大小:52.5KB
MD5:4B160901566108C6F89F21444CE503E7

PEID查壳信息:

PEID显示是ASPack壳,这一款兼容性良好的老牌壳。不过估计用工具脱不了,OD载入时出错,看来经过特意加密防止反编译。我也懒得深入研究壳了,直接丢入虚拟机的XP,创建快照。打开Procmon和Total Uninstall监视,然后运行。

先分析Total Uninstall下直观的文件和注册表修改情况:

文件修改:

1.在C:\windows\Fonts目录下创建cjavv.fon和fprij.fon文件,从文件名上分析可能是随机文件名。

2.与实验室看到的不同,病毒在C:\windows\system32目录下创建了SysAnti.exe文件,而不是实验室的C:\Program Files\Common File目录。

3.修改了C:\windows\system32\drivers\etc目录下的hosts文件,将主流杀软网站指向本地127.0.0.1地址,以阻止用户访问。

Read More

前几天在写一个使用Huffman算法的文本压缩程序时被“段错误”折磨了好长时间。因为自己向来对内存的使用保持着“克勤克俭”的作风,所以总是被此类错误折磨的焦头难额。C语言的内存管理本来就是一个繁琐的工作,写代码时略有不慎便会出现诸如“段错误(吐核)”的运行时崩溃。

其实段错误是操作系统的一个内存保护机制,一般情况下某程序尝试访问其许可范围之外的内存空间时便会触发内核的“一般保护性异常”,内核便会向程序发送一个SIGSEGV(11)信号(无效的内存引用),而SIGSEGV信号默认handler的动作便是在终端上打印出名为“段错误”的出错信息,并产生Core(内核转储)文件,最后结束掉当前犯错的程序。

段错误的成因大致有以下几种:

  1. 程序访问了系统数据区,尤其是往系统保护的内存地址写数据。比如尝试对NULL指针进行解引用或者对其指向的内存写入数据(但是不见得所有的指针越界都会触发“段错误”);
  2. 内存访问越界(数组越界等);
  3. 无限的递归(导致栈溢出);
  4. 对malloc / calloc申请的堆内存二次释放(可能与glibc库版本有关);
  5. 由于操作系统的段保护机制,如果由于缓冲区溢出等错误导致对某段内存的非法访问也会触发;

另外还有一些大家平时不大注意的地方会导致段错误,例如使用标准库函数fclose对一个打开的文件关闭了多次也会导致段错误,同时终端可能会输出很多关于运行时库错误的信息。因为对使用malloc族函数申请的堆内存释放第二次的时候会触发段错误,所以我猜测fclose触发段错误的原因可能是对文件指针FILE *指向的内存二次释放时触发的段错误。而Valgrind检测的结果基本上证明了我的猜测,fclose引发了堆异常,错误被定位到了free函数。

Read More