티스토리 뷰
소스코드
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 문자열을 검색해서 얻은 정보에서 정규식 매칭을 통해 데이터를 정리해서 뽑아내도록 한다.
결과
아직 테스트 케이스가 부족한 것 같다.
크래시 관련 참고 자료
- https://www.doulos.com/knowhow/arm/Embedded_Linux_Debugging_User_Space_Seg_Faults/index.php
- http://d3s.mff.cuni.cz/teaching/crash_dump_analysis/slides/08-linux.pdf
'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 |
댓글