计算机科学与技术一级学科二级专业分类

1、计算机系统结构

  • 并行与高性能计算
  • 分布式系统
  • 存储系统
  • 多核/众核编程系统
  • 处理器微体系结构
  • 大数据与云计算
  • 计算机网络体系结构
  • 网络科学与大数据
  • 网络与系统性能评价
  • 路由与交换
  • 网络与信息安全
  • 密码理论与网络通信编码
  • 网络管理与测量
  • 移动互联网与传感网

2、计算机软件与理论

  • 数据管理与知识工程
  • 数据挖掘与知识发现
  • 电子系统设计自动化方法与软件
  • 智能系统与物联网安全
  • 可信芯片设计方法及软件
  • 计算机算法与复杂性
  • 量子计算与量子信息
  • 理论计算机科学

3、计算机应用技术

  • 机器学习理论与应用
  • 互联网智能信息处理
  • 认知与神经计算
  • 智能控制与机器人
  • 生物信息与计算生物学
  • 计算机视觉
  • 计算机图形学与可视化
  • 网络多媒体与社会媒体
  • 普适计算
  • 人机交互

Pwn学习总结(1):工具篇

虽然之前已经了解了一些Pwn。但根据需要,最近需要系统的学习一遍Pwn。经权威人士推荐,选择“Linux下pwn从入门到放弃”进行再次入门。
本学习总结根据该参考资料及个人经验重新总结整理。

需要用到的工具包括:
(1)gdb:GNU gcc调试器
(2)peda/gef/gdbinit:美化gdb命令行界面的脚本,同时可以扩展gdb的命令,可以参考[2]
(3)pwntools: python的一个pwn库,提供了很多封装过的用于pwn的函数
(4)checksec: 查询ELF程序的各类保护措施及程序的运行平台
(5)objdump/readelf: 查询ELF各节的关键信息
(6)IDA Pro: “全世界首屈一指”的反编译工具
(7)ROPgadget: ROP(Return-Oriented Programming)利用工具
(8)one_gadget: 快速寻找libc中的 execve(“/bin/sh”, * 的位置
(9)LibcSearcher: 非常方便的通过libc泄漏函数偏移地址和函数名查询libc版本及其他函数地址的python库

参考资料:
[1] Linux下pwn从入门到放弃 https://blog.csdn.net/niexinming/article/details/78814422
[2] https://github.com/bjrjk/GDBPlugins

LeetCode 44 Wildcard Matching

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
class Solution {
public:
    string input, pattern;
    short arr[2005][2005];
    bool isMatch(string s, string p) {
        input = s;
        pattern = p;
        memset(arr, -1, sizeof(arr));
        return dfs(0, 0);
    }
    bool dfs(int iPos, int pPos){
        if(arr[iPos][pPos] != -1) return arr[iPos][pPos];
        int inputLen = input.size(), patternLen = pattern.size();
        if(iPos == inputLen && pPos == patternLen) return arr[iPos][pPos]=true;
        if(iPos >= inputLen || pPos >= patternLen){
            if(iPos == inputLen && pPos < patternLen){
                for(int i=pPos;i<patternLen;i++){
                    if(pattern[i]!='*') return arr[iPos][pPos]=false;
                }
                return arr[iPos][pPos]=true;
            }
            return arr[iPos][pPos]=false;
        }
        switch(pattern[pPos]){
            case '*':
                return arr[iPos][pPos]=dfs(iPos+1, pPos+1) || dfs(iPos+1, pPos) || dfs(iPos, pPos+1);
                break;
            case '?':
                return arr[iPos][pPos]=dfs(iPos+1, pPos+1);
                break;
            default:
                if(input[iPos] == pattern[pPos])
                    return arr[iPos][pPos]=dfs(iPos+1, pPos+1);
                else
                    return arr[iPos][pPos]=false;
                break;
        }
    }
};