0xc02c20bc <sys_call_table+32>: 0xc0138930 0xc01445c0
0xc01217c0是sys_ni_call系统调用地址, 0xc011ac50是sys_exit地址调用地址.
如果信任来自Syetem.map文件或者ksyms文件的地址那么我们可以比较所有的地制值.当然入侵者不会改变所有的系统观调用地址值.比如sys_read,sys_getdents,sys_write这些普通进程.
例2.活动进程列表
为了能得到整个运行进程的列表我们必须找出init_task_union结构体.这个结构体指明了第一个进程的描述符,这个被称为"process 0" 或者 "swapper".
# cat Symbol.map | grep init_task_union
c02da000 D init_task_union
下一步是如何找出整个结构体.其实init_task struct可以在源代码中的sched.h头文件中被找到,同时task_struct这个结构体也可以在这个头文件中被找到.
#define INIT_TASK(tsk)
{
state: 0,
flags: 0,
sigpending: 0,
addr_limit: KERNEL_DS,
exec_domain: &default_exec_domain,
...
run_list: LIST_HEAD_INIT(tsk.run_list),
time_slice: HZ,
next_task: &tsk,
prev_task: &tsk,
p_opptr: &tsk,
...
对于我们进程描述符中的重要部分是prev_task和next_task..它们可以帮助我们建立进程列表. next_task指向进程的下一个进程的描述符, prev_task指向被插入的最后一个进程的描述符.
在下面,我列举了进程描述符的片断,这些是在地址: 0xc514c000处被找到的.
(gdb) x/180x 0xc514c000
...
0xc514c040: 0x00000000 0xffffffff 0x00000004 0xc1be0000
0xc514c050: 0xc4dac000 0xc5ea8e40 0xc5ea8e40 0xc02c56d4
...
0xc514c070: 0x00000001 0x00001ace 0x00001ace 0x00000000
...
0xc514c230: 0xffffffff 0xffffffff 0x61620000 0x00006873
0xc514c240: 0x00007974 0x00000000 0x00000000 0x00000000
...
说明:
0xc1be0000 is the next_task
0xc4dac000 is the prev_task
0x00001ace is the process PID = 6268 in decimal format
0x61620000 and 0x00006873 is the name of process (the comm table in the struct) = "bash" in this particular example
打印出进程的下一个描述符我们这么做:
(gdb) x/180x 0xc1be0000
从每个进程描述符的信息我们可以建立所有活动进程的列表.
3. 总结
本文的目的是介绍一些数据收集,基本和高级分析的方法.特别地,我将精力聚焦在我们强行关闭系统后丢失数据上.这个部分的定性分析何事后措施很难完成,我们必须对每个步骤都非常小心并且要保证纪录(文档)每个细节.我们也可以看到用软件收集过程的好处和弊端.在最后我向你介绍了如何在Linux系统中进行收集操作,其实你完全可以将这些步骤移植到其他操作系统上.未来将有一篇指导你如何在Windows操作系统中收集入侵数据的文章.
参考:
|