网络攻防学习心得一(20159320)工具学习
由于自己对逆向相关信息有比较大的兴趣,所以并没有参照老师所推介的sectools去学习一些工具,反而自己学习了其他的逆向相关的工具的简单应用。
调试工具ollydbg 查壳工具peid 脱壳工具loadpe 修复工具importrec 还有就是简单IDA的了解
peid:一个简单的查壳工具,通过作者对很多壳的了解编写出来的查壳工具,可以查询一些常见的带壳程序所加的壳,方便具体脱壳。但是此工具只能作为参考,有些时候查壳未必正确,或者查不出对应壳,也可以通过区段来看一下壳的简单特征,从而采取对应方法来解决脱壳问题。
loadpe :一个脱壳工具(当然,脱壳过程中也可以通过od自带的脱壳工具通过两种方式来脱壳),此工具运用之前必须找到程序真正的OEP,从而查找对应IAT,从而更新函数表,找到其中无效的函数,可以 尝试直接删除少的无效函数,如果比较多的话,可以通过追踪来修复或者查找对应函数。之后则重新载入。
Importrec:这是一个修复的工具,在上一部LOADpe出来的程序中,可能重新载入之后并不能真正运行,这时候涉及到修复的过程,在简单修复中,首先是找到对应进程,重新计算镜像大小,输入真正OEP然后自动查找IAT,之后则是获取输入表完成修复,有的时候不能修复的情况下,涉及到的是查找RVA,在查找RVA的时候方法则是找到一个call,跟进call对应地址,在od数据窗口中找到数据全为零的点,则RVA为下一个地址,然后查找最下面全为零的点,计算两点之间的偏移则为SIZE,有的时候为了方便,可以不用计算SIZE,直接写成1000则够用,如此之后则可以修复一些不能运行的情况。
如果修复之后还是不能运行,则可以尝试用LOADPE尝试重建PE,这也是一种处理的方法。
IDA:IDA在时下用的也不少,也有他对应的一些有点。这个工具用的时候还不多,在课余时间,我在看逆向工程核心原理,这里介绍了一些IDA的运用,下周应该可以看到对应的内容,所以此次暂时不多说。
od:作为一种调试工具,他的使用感觉有的地方有点困惑,首先说说总结的一些简单壳的脱壳方法吧。
常见的壳有两种:加密壳和压缩壳
常见的方法:1、单步跟踪法:注意向下跳转实现,向上跳转则不让实现,通过下断的方式即f4及f8组合实现,但需要注意一些语句也得跳过,有的时候还得注意长call让跳转,短call跟进相结合。
2、esp定律:所谓esp定律则是堆栈平衡大法。我觉得需要注意的是一些push引起的esp突变,然后则在数据窗口跟进,找到对应位置下断然后f4运行之后再进行单步,也和单步方式一样,大跳转的情况及可能为程序真正的OEP。
3、内存镜像法:首先找到内存窗口即为M,进入之后找到rec区段(注意有两个rec,一个为程序的,一个为系统的)在此下断运行,然后再次进入M找到401000位置下断及data段然后运行,观察入口特征。注意有的时候,程序只需要一次镜像法完成。
4、模拟跟踪法:其中包括sfx方式,但由于在自己电脑实现过程中,模拟法出了点问题,所以并没有实现,但是在虚拟机中能够实现,问题还在思考中,所以也不写出来了。
5、最后一次异常法:这个方法通过设置异常中断,计算shift f9次数,当程序跑飞的时候需要的次数,然后重新载入之后少按一次来找到位置。然后进行单步找oep
6、还有一些特殊的断点,还有一些设置包括tc eip <xxxx等方式来找到(由于笔记忘在实验室了,所以这边不写出来那些断点方式,但是这些断点如何实现的 还需要继续深究)
在oep的查找过程中还需要记得的就是一些常见语言的入口点特征,记住或者熟悉这些特征可以方便查找oep,以下给出一些常见特征:
VB:
004012D4 > 68 54474000 push QQ个性网.00404754
004012D9 E8 F0FFFFFF call <jmp.&MSVBVM60.#100>
004012DE 0000 add byte ptr ds:[eax],al
004012E0 0000 add byte ptr ds:[eax],al
004012E2 0000 add byte ptr ds:[eax],al
004012E4 3000 xor byte ptr ds:[eax],al
004012E6 0000 add byte ptr ds:[eax],al
004012E8 48 dec eax
delphi:
004A5C54 > 55 push ebp
004A5C55 8BEC mov ebp,esp
004A5C57 83C4 F0 add esp,-10
004A5C5A B8 EC594A00 mov eax,openpro.004A59EC
BC++:
00401678 > /EB 10 jmp short btengine.0040168A
0040167A |66:623A bound di,dword ptr ds:[edx]
0040167D |43 inc ebx
0040167E |2B2B sub ebp,dword ptr ds:[ebx]
00401680 |48 dec eax
00401681 |4F dec edi
00401682 |4F dec edi
00401683 |4B dec ebx
00401684 |90 nop
00401685 -|E9 98005400 jmp 00941722
0040168A \A1 8B005400 mov eax,dword ptr ds:[54008B]
0040168F C1E0 02 shl eax,2
00401692 A3 8F005400 mov dword ptr ds:[54008F],eax
00401697 52 push edx
00401698 6A 00 push 0
0040169A E8 99D01300 call <jmp.&KERNEL32.GetModuleHandleA>
0040169F 8BD0 mov edx,eax
VC++:
0040A41E > 55 push ebp
0040A41F 8BEC mov ebp,esp
0040A421 6A FF push -1
0040A423 68 C8CB4000 push 跑跑排行.0040CBC8
0040A428 68 A4A54000 push <jmp.&MSVCRT._except_handler3>
0040A42D 64:A1 00000000 mov eax,dword ptr fs:[0]
0040A433 50 push eax
0040A434 64:8925 0000000>mov dword ptr fs:[0],esp
0040A43B 83EC 68 sub esp,68
0040A43E 53 push ebx
0040A43F 56 push esi
0040A440 57 push edi
MASM(汇编):
004035C9 > 6A 00 push 0
004035CB E8 A20A0000 call <jmp.&kernel32.GetModuleHandleA>
004035D0 A3 5B704000 mov dword ptr ds:[40705B],eax
004035D5 68 80000000 push 80
004035DA 68 2C754000 push 11.0040752C
004035DF FF35 5B704000 push dword ptr ds:[40705B]
004035E5 E8 820A0000 call <jmp.&kernel32.GetModuleFileNameA>
004035EA E8 87070000 call 11.00403D76
004035EF 6A 00 push 0
004035F1 68 0B364000 push 11.0040360B
004035F6 6A 00 push 0
004035F8 6A 64 push 64
004035FA FF35 5B704000 push dword ptr ds:[40705B]