티스토리 뷰

System/Linux

Linux Crash Monitor[dmesg]

Tribal 2018. 1. 23. 03:29

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/python
from subprocess import *
from time import sleep
import re
 
def crash_logging(ps, pid, cause, ip, sp, error, ptr):
    with open("./crash_log.txt""a") as fh:
        fh.write("=============================================\n")
        fh.write("Process : {0}\n".format(ps))
        fh.write("PID :     {0}\n".format(pid))
        fh.write("Cause :   {0}\n".format(cause))
        fh.write("IP :      {0}\n".format(ip))
        fh.write("SP :      {0}\n".format(sp))
        fh.write("Error :   {0}\n".format(error))
        fh.write("Ptr :     {0}\n".format(ptr))
        fh.write("=============================================\n")
 
def crash_match(text):
    crash = {'ip':''}
 
    match = re.match("^[\[\]0-9. ]+ ([\w]+)\[([\d]{1,5})\]: segfault at ([0-9a-f]+) ip ([0-9a-f]+) sp ([0-9a-f]+) error ([\d]+?) in [\w]+\[([0-9a-f+]+)\]", text)
    if match:
        crash['ps'= match.group(1)
        crash['pid'= match.group(2)
        crash['cause'= match.group(3)
        crash['ip'= match.group(4)
        crash['sp'= match.group(5)
        crash['error'= match.group(6)
        crash['ptr'= match.group(7)
 
    return crash
 
def monitoring():
    while True:
        cmd1 = Popen(["dmesg""-c"], stdout=PIPE)
        cmd2 = Popen(["grep""segfault"], stdin=cmd1.stdout, stdout=PIPE)
        cmd1.stdout.close()
 
        segfault_list = cmd2.communicate()[0].split('\n')
        if len(segfault_list) == 1:
            sleep(30)
            continue
 
        for line in segfault_list:
            crash = crash_match(line)
            if len(crash) == 7:
                crash_logging(**crash)
 
        sleep(30)
 
def main():
    monitoring()
 
if __name__ == '__main__':
    main()
 
cs


  리눅스에서 Fuzzer를 돌릴 때, Crash를 모니터링 하기 위한 코드이다. 리눅스에서 AddressSanitizer로 따로 컴파일한게 아니면, 일반적으로 Crash는 dmesg 로그에 남는다(core 파일을 남기는 방법도 있다). 

   암튼 Crash에 대해서 몇 가지 분석 방법이 있지만, 단순하게 dmesg에서 로그 정보를 가져와서 모니터링을 하는데 segfault 문자열을 검색해서 얻은 정보에서 정규식 매칭을 통해 데이터를 정리해서 뽑아내도록 한다.


결과

  아직 테스트 케이스가 부족한 것 같다.


크래시 관련 참고 자료


'System > Linux' 카테고리의 다른 글

[Sandbox] BPF 및 seccomp 정리  (0) 2018.07.18
Unix Domain Socket  (0) 2018.07.10
Reverse Shellcode  (0) 2017.08.12
Linux TLS(Thread Local Storage) 정리  (0) 2017.06.05
Linux Device Driver 정리 (2)  (0) 2017.06.01
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31