奇安信2020开发岗笔试考点拆解:从C/C++到安全基础

发布时间:2026/9/1 21:15:15
奇安信2020开发岗笔试考点拆解:从C/C++到安全基础 先说明一个事情奇安信2020年的软件开发工程师岗位笔试和市面上大多数互联网公司的笔试风格不太一样。它不是单纯刷LeetCode就能过的里面掺杂了大量安全基础、系统底层、网络协议的题目很多科班出身、算法题刷得很顺的同学反而挂在基础题上。我当年帮团队筛简历、出过几轮笔试题目后来也带过不少新人把这一整套考察逻辑摸得比较透。这篇就按2020软件开发工程师二这套题目的典型结构把考点、准备思路和我踩过的坑一次性讲清楚。1. 先搞清楚奇安信开发岗考什么从岗位JD反推考点1.1 奇安信的产品线决定了开发岗的技术栈奇安信不是做纯互联网业务的它做的是政企安全、终端安全、云安全、大数据安全分析这类To B/To G业务。这意味着软件开发工程师日常接触的技术栈和做电商、做社交的团队有本质区别。终端安全产品比如天擎核心是Windows/Linux底层开发驱动、进程管理、文件系统过滤是家常便饭所以C/C是绝对主力。安全大数据平台涉及海量日志采集、存储、分析Java和Go用得比较多但底层日志采集组件仍然是C/C。云安全方向要跟虚拟化、容器、K8s打交道Go语言几乎是标配。安全服务与攻防对抗需要理解漏洞原理、恶意代码行为开发人员如果不懂攻击很难写出真正有效的防御代码。所以奇安信的软件开发工程师笔试必然是以C/C为主、计算机网络和操作系统并重、同时搀杂安全基础知识的综合体。2020年这一套题基本就是这样设计的。1.2 招聘流程与笔试节奏2020年奇安信的校招流程大致是网申 - 在线笔试 - 技术一面 - 技术二面 - HR面。笔试一般安排在周末时长两小时左右题目分为选择题、简答题和编程题三块。选择题大约20到30道覆盖C/C语法、数据结构、网络协议、操作系统、安全基础。简答题一般有两三道考查某个具体技术点的理解和设计思路。编程题一到两道难度在LeetCode中等偏上但不完全是算法题有时候会结合安全场景出题。这里有个很重要的点笔试的通过率并不完全取决于编程题做没做出来。如果选择题正确率太低编程题全对也可能被刷。我见过好几个算法很强、但C指针和网络基础一塌糊涂的候选人笔试直接被筛掉。反过来选择题扎实、编程题用暴力解法拿部分分的人反而能进面试。1.3 笔试考察的三个层级我把它总结为三个层级第一层是基础功底就是C/C语法、内存模型、STL、数据结构这些硬功夫。这一层决定你能不能过笔试门槛。第二层是系统理解包括操作系统进程线程、内存管理、TCP/IP协议栈、HTTP协议。这一层决定你在面试时能不能跟面试官聊到同一个频道。第三层是安全敏感度包括常见的Web漏洞原理、加密算法、安全编码习惯。这一层是奇安信区别于普通互联网公司的核心考点也是很多人容易忽略的地方。后面几个部分我按这个逻辑逐个拆解。2. 语言与数据结构安全公司笔试的重灾区2.1 为什么不是Java为主而是C/C很多同学觉得奇怪大学里Java学的挺多怎么笔试全是C/C原因很简单安全产品需要直接跟操作系统打交道做驱动、做hook、做内存操作Java做不到Go在某些底层场景也不够灵活。C/C依然是安全软件的主干语言。因此笔试选择题中关于C/C的题目占比通常在30%到40%。2020年这套题里面指针和内存相关的内容出了不少。2.2 指针、内存、STL的常见考题我挑几个高频点每个都是我实际在笔试和面试中见过的。指针与 const 的组合这类题看起来很简单但错误率极高。比如const char *p; // p指向的内容不可变 char * const p; // p本身不可变 const char * const p; // 内容和指针都不可变笔试不会直接让你背定义而是给你一段代码问哪一行编译报错。这种题考的是对声明从右往左读的理解。我的经验是先看const修饰的是谁再判断能不能赋值。内存泄漏与野指针典型的题目会给出一个函数函数内部new了一个对象然后return了另一个指针问哪里有泄漏。或者给你一个类析构函数没有写成虚函数问delete基类指针时会发生什么。这里不只是背概念要理解对象生命周期。比如class Base { public: ~Base() { std::cout Base destructor\n; } }; class Derived : public Base { public: ~Derived() { std::cout Derived destructor\n; } }; Base *p new Derived(); delete p;这段代码delete p时只会调用Base的析构函数Derived的析构函数不会执行。如果Derived里面持有堆内存就泄漏了。解决办法是把Base析构函数声明为virtual。这道题在奇安信的笔试题里出现过变体面试时也经常被追问。STL容器迭代器失效vector在push_back触发扩容后所有迭代器都会失效erase删除元素后被删元素之后的迭代器也失效。map和set的插入删除则不会让其他迭代器失效因为底层是红黑树。这类题考的是对容器底层实现的理解。虽然选择题只是判断对错但背后是内存布局和数据结构原理。2.3 数据结构的典型代码题与高频算法模版编程题部分2020年这套题出现了字符串处理、链表操作和二叉树遍历相关的内容。我更建议大家按模板变体的方式准备而不是盲目刷题。字符串处理模板安全方向对字符串处理特别看重因为很多漏洞都是字符串操作不当引起的。笔试编程题里字符串反转、字符串去重、判断回文是出现率最高的。核心思路是双指针。比如反转字符串一个指针从头一个指针从尾交换后向中间移动void reverseString(std::string s) { int left 0, right s.size() - 1; while (left right) { std::swap(s[left], s[right]); left; --right; } }链表操作模板快慢指针找中间节点、判断链表是否有环、反转链表这三个是必背的。其中反转链表建议掌握迭代和递归两种写法面试时很可能要求你两种都写一遍。二叉树遍历模板前序、中序、后序的递归写法一定要熟到肌肉记忆非递归写法至少掌握一种。笔试如果出二叉树相关题目多半是遍历的变体比如求二叉树最大深度、层序遍历。这些用BFS模板可以统一解决。提示奇安信的编程题往往和常见LeetCode题不完全一样会在场景上做包装。比如不直接考反转链表而是给一个日志记录链表要求把时间戳逆序输出。但本质还是那套东西识别出来就好办。3. 网络与系统基础那些被低估的得分点3.1 安全公司考网络不只是背协议普通互联网公司考网络一般问到三次握手、四次挥手就差不多了。奇安信不一样它会往下追问序列号是怎么初始化的SYN Flood攻击的原理是什么为什么TCP要 TIME_WAIT 状态因为这些不是单纯的网络理论它们直接跟安全防护相关。天擎要做入侵检测要分析网络流量开发人员如果只懂怎么调socket API不理解协议底层根本没法写检测引擎。2020年的题目里选择题考了TCP三次握手中SYN标志位和ACK标志位的变化简答题考了TCP和UDP的区别以及各自的应用场景。这些看起来是基础题但得分率并不高。3.2 HTTP协议与Web安全的关系HTTP是Web安全的基础奇安信的笔试一定会涉及。需要掌握的内容包括HTTP请求方法以及各自语义GET、POST、PUT、DELETE、OPTIONS等状态码的分类和常见含义200、301、302、400、401、403、404、500、502、503请求头、响应头的常见字段Host、User-Agent、Content-Type、Set-Cookie、Location等Cookie和Session的区别与联系HTTPS的握手流程以及证书的作用这里有个容易被忽视的点很多同学记得HTTPS用了RSA密钥交换但2020年的题目更细化会问你整个握手过程中客户端和服务端分别用哪个密钥加密数据。答案是会话密钥由客户端生成用服务端的公钥加密传输之后双方用会话密钥进行对称加密通信。3.3 进程、线程与内存管理操作系统部分的重点我总结为三块进程线程模型、内存管理、死锁与并发。进程线程模型进程是资源分配的基本单位线程是调度的基本单位。同一进程内的线程共享地址空间但各有独立的栈和寄存器上下文。这道题必考而且经常以进程和线程的区别的简答题出现。内存管理分段和分页、虚拟地址到物理地址的映射、页面置换算法、堆和栈的区别这些都要很熟。奇安信的笔试和面试特别喜欢考堆和栈的区别因为它跟安全直接相关——缓冲区溢出漏洞利用的就是栈的结构。死锁与并发死锁产生的四个必要条件以及如何避免死锁。信号量和互斥锁的区别。这些是选择题和专业题里的常客。注意2020年这套笔试题里的操作系统部分风格偏向实际应用不是死记硬背概念。比如会问多线程同时读写同一个变量如何保证线程安全这种问题没有唯一答案关键是考察你有没有真正写过并发代码、知不知道互斥锁、原子操作、读写锁这些工具。4. 安全基础与反直觉题目拉开差距的地方4.1 什么是安全开发工程师的安全基础普通公司的开发笔试不会要求你懂漏洞原理但奇安信会。这里说的安全基础不是让你变成渗透测试专家而是要掌握以下内容常见Web漏洞原理SQL注入、XSS、CSRF、SSRF、文件上传、路径遍历经典二进制漏洞原理缓冲区溢出、整数溢出、格式化字符串了解级别加密算法对称加密AES、DES、非对称加密RSA、哈希算法MD5、SHA-1、SHA-256以及它们的适用场景安全编码习惯输入校验、输出编码、最小权限、避免使用不安全的函数4.2 题目示例路径遍历、防卸载、进程自我保护2020年这套题里面有些题目非常奇安信跟热词里面出现的输入验证路径遍历奇安信天擎卸载等现象其实是一条线。比如路径遍历的题目会给你一段代码要求你判断是否存在路径遍历漏洞以及如何修复。典型代码如下def read_file(filename): base_dir /var/data/ full_path os.path.join(base_dir, filename) with open(full_path, r) as f: return f.read()乍一看用了os.path.join似乎没问题。但如果传入的filename是../../etc/passwdos.path.join会返回/var/data/../../etc/passwd也就是/etc/passwd。这就是路径遍历漏洞。修复方式有两个方向一是对filename做规范化处理之后检查结果是否以base_dir开头二是使用白名单校验只允许文件名匹配特定的安全模式。这个考点不是随便出的它对应的是真实产品的输入校验需求。奇安信的开发者在写文件访问功能时面对的就是这类问题。再比如热词里大量出现的奇安信天擎卸载要密码防卸载这类现象本质上对应着一个真实的安全需求安全软件必须防止恶意程序或用户误操作把自己卸载掉。实现方式包括进程自我保护通过驱动层hook系统调用阻止对进程的终止操作文件与注册表保护阻止对核心文件和自启动项的修改卸载鉴权机制要求用户提供管理员密码或验证码防止未授权卸载笔试不会直接考怎么给天擎加卸载密码但会以如何设计一个自我保护机制这类开放性问题出现。如果你了解一点驱动层面的技术比如SSDT Hook、内核回调、文件系统过滤驱动答题时就能写出比别人更专业的内容。4.3 怎么短期准备安全基础知识如果你不是安全专业的临时补安全知识时间肯定来不及。我的建议是抓大放小Web漏洞原理花两天时间各写一遍攻击payload和防御代码加密算法重点理解AES和RSA的区别以及HTTPS里怎么配合使用安全编码习惯重点记住永远不要信任外部输入路径遍历、SQL注入、XSS这三种漏洞的原理和修复方法必须熟练掌握其他的二进制漏洞、逆向工程、恶意代码分析等内容笔试选择题可能会涉及概念但不会让你真的去分析木马。了解名词和基本原理就够了。5. 笔试代码实战从暴力解到最优解的提分路径5.1 时间分配与题目顺序策略我帮人改过不少笔试代码发现一个问题很多人喜欢死磕编程题结果选择题没时间做简答题草草写两行。这是非常错误的策略。我的建议是先做选择题控制在40分钟以内遇到不会的果断标记跳过不要纠结。然后做简答题每道10到15分钟。最后剩下40到60分钟做编程题。编程题如果卡了超过20分钟先写一个暴力解法拿部分分然后优化。笔试系统通常按测试用例给分暴力解法能过20%到40%的用例总比交白卷强。5.2 高频代码题的解题模板针对2020年这套题的具体情况我再补充两个实际出现过的题目类型。类型一字符串压缩题目会给一个字符串比如aabcccccaaa要求压缩成a2b1c5a3。如果压缩后的字符串不比原串短就返回原串。这题本身不难但很多人忽略了一个关键点压缩后的字符频率可能超过9比如连续100个a需要写成a100而不是a9加9。std::string compressString(const std::string s) { std::string result; int i 0; while (i s.size()) { int j i; while (j s.size() s[j] s[i]) { j; } result.push_back(s[i]); result std::to_string(j - i); i j; } return result.size() s.size() ? result : s; }类型二合并两个有序链表这是单链表里的经典题。迭代写法用哑节点递归写法更简洁。奇安信笔试把它拿来做编程题考的是基本功扎不扎实。ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { ListNode dummy(0); ListNode *tail dummy; while (l1 l2) { if (l1-val l2-val) { tail-next l1; l1 l1-next; } else { tail-next l2; l2 l2-next; } tail tail-next; } tail-next l1 ? l1 : l2; return dummy.next; }5.3 边界条件与异常输入面试官真正想看的东西编程题不是跑通就完了代码的健壮性同样重要。奇安信的笔试系统会跑隐藏测试用例专门测边界条件。常见的边界条件包括空字符串、单字符字符串、链表只有头节点、输入为nullptr、数值溢出的情况。写代码时多花十秒钟想一下这些情况比盲目追求花哨算法值钱得多。另外代码风格也很重要。变量命名有语义、缩进规范、关键步骤有注释这些不会直接加分但会让面试官在看你笔试代码时印象好很多。6. 面试现场如何把项目经历讲成安全故事6.1 项目包装的核心从功能实现到安全思考笔试过了之后面试是另一道坎。奇安信的技术面试有一个很鲜明的特点面试官会深挖你的项目经历而且不是问你做了什么而是问你踩过什么坑你考虑过哪些安全风险。举个例子如果你简历上写了用一个Web框架开发了某某管理系统普通公司面试官会问框架用法奇安信面试官可能会问你的登录功能是怎么实现的密码存的是明文还是哈希如果用户输入了SQL语句怎么办你这个系统的文件上传功能有没有限制文件类型所以面试前要把自己做过的项目从安全角度重新过一遍。哪怕只是学校的课程设计也需要讲清楚输入数据有没有做校验具体校验了什么有没有处理权限控制越权访问是怎么防止的数据存储有没有加密密码是什么方式存放的如果有用户上传文件做了哪些防护这些问题不一定要求你做得完美但你必须想过。哪怕回答当时没想到现在觉得应该这样做也远好过没考虑过这个问题。6.2 常见面试追问与应答逻辑我总结了几类奇安信面试官常问的追问方式供参考。追问一场景设计如果让你设计一个日志分析系统你会怎么做这种问题没有标准答案考察的是你的设计思路和表达能力。回答的框架是先从需求出发说清楚要分析什么、数据量多大、实时性要求多高然后再说技术选型比如采集用Agent还是直接读文件、存储用ES还是ClickHouse、计算用Spark还是Flink、告警怎么触发。追问二底层原理TCP为什么需要三次握手两次行不行这种问题的回答逻辑是先复述基本原理再说如果只有两次握手会发生什么最好能结合具体的异常场景。比如两次握手会导致服务端无法确认客户端的接收能力可能出现已失效的连接请求到达服务端导致资源浪费。追问三安全攻防如果被流量攻击你会怎么防御这种题考察的是你有没有从攻防视角思考问题的习惯。基本回答思路包括先做流量清洗、限流再分析攻击特征、封禁源IP再从架构层面做高可用、负载均衡最后是应急响应和溯源。如果能提一下具体的技术方案比如用Nginx做连接数限制、用防火墙做规则匹配、用WAF拦截应用层攻击会更有说服力。追问四算法优化你刚才说这个模块的性能有瓶颈具体是哪里怎么优化的这种问题考察的是你有没有真实的性能调优经验。回答时要给出具体的数据优化前多少毫秒优化后多少毫秒瓶颈在哪做了什么改动。哪怕优化幅度不大只要有真实数据都算合格。6.3 个人备考时间线与建议最后说说时间安排。如果你离笔试还有三到四周可以这样分配第一周把C/C基础过一遍重点是指针、内存、STL加上常见数据结构的代码题第二周复习计算机网络和操作系统每天刷20道选择题保持手感第三周补安全基础每天花两小时看Web漏洞原理和安全编码规范第四周集中做套题模拟笔试环境训练时间分配如果只有一周优先做三件事背C/C高频考点、刷熟三个编程题模板字符串、链表、二叉树、整理一份自己的安全基础笔记。另外笔试前一定要熟悉奇安信的笔试系统。有的系统支持本地编译器调试有的只支持在线编辑。提前用在线编辑器写几道题练一练代码补全不依赖IDE的感觉不然笔试时会非常难受。我在实际带新人的过程中发现那些能过笔试的人并不是最聪明的而是准备方向最对的。奇安信这类安全厂商考的不只是算法更是你对系统底层和安全原理的理解。把这些基础打扎实了面对笔试题目时你会发现大部分题都是换了个壳的熟悉考点。最后再分享一个小技巧刷题时遇到不会的简答题不要空着。把你理解的原理写上去哪怕不完全对也比白卷强。笔试阅卷是按点给分的多写一个要点就多一分希望。

相关新闻