如今国家、社会愈加重视网络安全,逐渐加大在这方面的投入。前景向好的同时,近来也有越来越多的新鲜血液涌入到安全这个行业中来,大家亦步亦趋的过程中难免会产生迷茫、困惑,可能会有人在这时感叹一声如果有个前辈引导一下该多好。
因此,我们想借助访谈的形式,与看雪社区的优秀前辈对话、讨教。初衷是想通过前辈的一些经历、经验,为刚踏入这个行业的同学指引方向;为正处在困惑期、迷惘期的朋友们指点迷津。
本期我们邀请到了看雪社区资深软件安全专家:htg,一起来听听他的分享吧!
本期嘉宾:htg
软件安全专家
软件技能丰富:掌握Fortran、Lisp、C、C++、VBA、C#、Python、COBOL 等程序语言编程技能,及IDA、Windbg等逆向软件技能。
开发经验丰富:具有10多年软件开发经验,主持或承担过多个大型管理平台软件、二次开发插件的研发。
逆向经验丰富:结合动态静态逆向方向,研究数款加壳保护软件及脱壳破解软件。
Q:感谢师傅接受采访,请问一下怎么称呼,行走江湖都用过哪些名号?先跟大家自我介绍一下吧!
A:首先非常感谢看雪论坛的盛情邀约。作为国内非常著名的网安交流平台,我早在2012年就有所耳闻并注册了看雪会员,用户名是「htg」,在看雪KCTF里还组建了「心学」战队。混迹网络时还使用过「文宇」、「心隐草」等名号。我是一名系统架构设计师,主持过多个大型管理平台软件、二次开发插件的研发,目前主要研究人工智能、大模型、智能建造技术。
Q:想请问一下师傅贵庚几何?从事网络安全有多少年了?开始对网络安全感兴趣的契机是?
A:我的年龄偏大了,在程序员行业里,应该都算处于退休阶段。其实我也不算完全踏入网络安全,更准确的说法是涉足了其中的软件安全。个人对Reverse和RSA感兴趣,对底层的数学知识更感兴趣。
Q:那师傅至少得有十多年丰富的软件开发经验了,都是从哪些途径找到锻炼自己的机会的?
A:需求来自于工作和兴趣,有了需求,才有了目标;动力来自于生活和兴趣,有了动力,才能从主观层面上去实施。我主要通过网络搜索、查阅教程、与同行交流来提升自己的能力,每一个过程都能让自己沉浸其中,每一项技术的理解和掌握都能带来喜悦,每一次提升都是对自己的鼓励。
Q:师傅是一开始就将网络安全作为职业方向,还是中途才走上这条路的呢?
A:其实我本科专业并不是计算机、软件等方向,但在大学期间就非常喜欢计算机技术,以及相关编程语言。在大学期间通过了NCRE-3(PC技术)和NCRE-4,自学了数据结构、操作系统、编译原理以及计算机组成原理和体系结构,另外还有计算机网络技术等计算机专业课程。毕业后又参加CCSP考试,先后通过了软件设计师和系统架构设计师,同时也迫使自己学习了一些软件工程、软件开发的相关知识。因而说不上是打从开始就将网络安全作为职业方向,甚至现在也都说不上,可以称之为个人第二增长曲线吧。
我所学的计算机语言比较杂,汇编语言、C/C++、C#、Python、VBA、java等。在学习面向对象语言的过程中,对类的结构、对象的结构、虚函数、纯虚函数、重载、多态的概念有点晕乎,后来就是借助查看汇编语言代码,算是了解的比较彻底。至此,我才开始真正接触了软件安全,包括一些溢出漏洞、格式化漏洞。后来又通过阅读 《0day安全:软件漏洞分析技术》,接触到了网安相关知识,php代码安全,还有pwn的知识,对操作系统底层的内存分配和释放有了更深入的了解,算是半路入网安,仍然在半路。
Q:师傅这属于是典型的非科班出身但凭兴趣自学成才了!那您当初又是如何入门的,走过了哪些弯路,对新手入行有什么建议吗?
A:我是懵懵懂懂进入计算机技术圈子的,最初不知道学习的先后顺序,所以先学习的编程语言,后来是通过了解NCRE考试,在学校的图书馆查阅书籍,缺啥补啥,时间耗费较长。大学毕业后从事的是本专业工作,从NCRE转向了CCSP考试,学习方式类似,都是遇到不懂的就花时间去了解,没有经过系统的学习。工作中,有时会通过编程来做一些批处理工作,提高工作效率。我这块主要是靠兴趣来坚持,对新手入行来说,建议找一个师傅带为好,按照专业课程计划进行学习。给一个建议,一定要动手操作,先按照流程走一遍,然后再研读具体细节,走不通时善用网络搜索或向同行请教,实在无法领会的时候,可能就是基础知识缺乏,这个时候没有捷径可循,踏踏实实啃书本吧。
Q:我看到师傅掌握着多门程序语言编程技能,那在师傅看来,最建议网安新人优先学习掌握哪些语言?
A:学的比较杂,其实不算特精通。近几年主要使用C#语言,有时也会使用python。编程语言都有共性,无非就是【顺序、循环、选择】三种结构的组成。底层的汇编语言或者中间语言,整体逻辑或架构不会差距太大,可能语法或操作符号有明显的差距。更高级的语言,一般都会涉及面向对象,再往上,也会概化为设计模式,初学起来会很困难。
如果是初学编程语言,建议学习 python,一是有大量的库可以直接使用,二是在人工智能、大模型方面的应用层面研发上,大量使用python,其资源非常丰富。如果是涉及底层,或者驱动层的研发,pwn方向的网安,建议学习C/C++语言,有精力还是要了解汇编语言。如果是做一些网络应用层面开发,建议从 C#、java、php等语言入手。
Q:您认为网络安全研究还需要掌握哪些基础知识和技能?平时又是如何保持自己的技术水平和知识更新的?
A:具备数据结构与算法、操作系统、主要的加密算法、网络协议以及编程语言等基础知识和技能,另外要掌握一些常用的分析软件。计算机技术日新月异,我最早接触的是小榕软件实验室,用过TRW2000、SoftlCE等软件,这些基本上是老古董了。后来一直关注看雪论坛、52破解网站的内容。平时还是多关注前沿技术,与同行交流、逛权威论坛、打经典赛事,这对保持自己的技能水平和知识更新非常有帮助。
就以看雪学苑为例,里面就有着许多优质教程,想全面深入了解相关技术的同仁,可以多看看;论坛上还有大量的经验帖子,想深入了解技术的细节和关键点,可以多逛逛;看雪的KCTF比赛也有很多经典的题目,想深入了解相关技术的用处,可以多试试。其实,网络安全研究最深层次的就是数学,如果你还没有深刻体会到数学的用处,那你还不算真正入门。
Q:您在逆向研究过程中最常使用哪些工具和技术?有什么诀窍可以分享吗?
A:我主要使用dnSpy、Windbg、IDA,偶尔使用OD等工具,大部分都是研究dotNET的程序集的逆向,也有 PE 的本地程序集,偶尔也做些apk的逆向和重新封装。我给出三点建议:一是要动手操作,边看边学边练边领悟;二是要看一些有价值的教程;三是要看一些高质量的代码。
Q:迄今为止您印象最深的一次逆向经历是什么,给您带来了什么启发吗?
A:那是看雪KCTF中一道《天堂之门》的题目,那时我才第一次知道32位和64位可以相互切换,毕竟在编写代码的时候,一定要注意32位和64位的代码,极有可能编译不过,也有可能出现运行失败。模式的切换,将造成主要调试器失灵。当然,这个在windbg下不存在,所以我一直在使用windbg调试工具,其对dotNet程序的调试非常好用,特别是jit层面,简单的命令输入,就能输出相关的元数据信息,且断点命令也能在关键处断下来,特别是一个方法即将被jit之前,方便进行对比分析。
当然没有哪一款软件能够适用所有的场景,还是要找到适合自己使用、适合对应程序的工具。dotNet程序与普通的pe程序逆向有很大的不同,对其进行逆向分析来说,windbg和dnSpy是必备工具,dnlib是必备库,但还要有一个全面系统的教程来提升自己的能力。
Q:曾经遇到过何种艰巨的挑战,又是如何攻克的?
A:回想起来,对于当初的我而言大多都可说是艰巨的挑战,但现在的我看来也都不算。每当进入未知领域,尝试了解未知技术,都会是一次艰巨的挑战,而一旦掌握了技术,深入到领域内,就会发现其实也不是那么难。所谓会者不难、难者不会吧。就比如,我记得KCTF有一道是关于 quickjs 的题目,之前没接触过,我是通过网络查找、进QQ群、查阅资料等等,初步了解了指令集,再尝试去做题。KCTF里有很多类似的题目,基本上属于自己的盲区,但经历了过程,积累了经验,再看也就豁然开朗了。
Q:说到CTF,师傅在这方面的参赛经验也十分丰富,身为攻击方和防守方,师傅都分别有哪些心得?
A:我主要方向是Windows Reverse,不管是攻击方还是防守方,确实能说其意义“重在参与”。——我们在比赛中能够看到自己的不足,有针对性的学习、演练、揣摩,形成知识固化于身,不断提升个人能力。
作为攻击方,所学的知识点非常多,常用加密技术、混淆技术、虚拟机技术、反调试技术等等都得掌握,另外可能遇到的题目所采用的技术是自己的盲点,此时,只能短时间查找资料、恶补知识、迅速抓住核心。攻击方非常有必要学习优秀的Writeup,一定要进行复盘,在复盘的过程中掌握技术,有时可能需要多次演练、复盘,才能真正理解并掌握。作为攻击方,还要在平时注重收集相关软件或工具、相关攻击技术的技术路线,攻击思路很重要,而好用的工具还能起到事半功倍的效果。攻击方要学会站在防守方的视觉去考虑,比如防守方的帖子或论文,防守方如何考虑利用当前的技术,有时候思路对了,会找到更有效的方法。
作为防守方,我觉得有五个方向,一是利用数学知识,核心就是数学解题过程;二是混淆技术,打乱流程;三是反调试技术,让攻击者不能找到快速找到关键之处;四是虚拟机技术,代码虚拟化,除非找到对应关系,很难进行分析;五是融合技术,将相关技术进行整合,强化防守效果。防守方可以从行业的加壳保护软件或技术里,挖掘防守技术,比如前面提到的五个方向,有能力的可以进行改进。作为防守方,也要学会站在攻击方角度去考虑,比如攻击方会采取什么方法来攻击,进而设置一些迷魂阵、陷阱等措施,误导攻击方的进攻路线等。
Q:相比其他同行,您认为自己有什么不足和长处?您觉得想要在网安领域有所成就,最看重的因素是什么?
A:我不是科班出身,也未全职投入,更多的是兴趣使然,不足之处还是有很多。以软件开发来说,我做过一些系统,但是体量不大、用户数不多,没有那种大体量软件开发所必须的健壮性、安全维护运行的能力。对底层理解还不够深入,比如IR变形、本地变量排序、循环优化、断言传播等等还要进一步深入理解。我觉得自己的优势在于能够静下心来潜心研究技术,特别是对.NET的常用保护技术有了一个全面的理解。我个人认为要想在网安领域有所成就,关键还是在于个人兴趣、潜心研究,还有就是深入底层,强化基础数学知识。
Q:我们看雪官网上边就有师傅编写的一门《.NET程序的文件解析及保护技术》课程,可否具体说说它能够给学员带来什么帮助?
A:现在有很多反编译软件,能够将.NET程序文件进行源码反编译,反编译出来的代码与源程序代码差别不大,主要存在几个问题:一是程序员辛苦编写的代码完全暴露;二是设置软件授权方法容易失效,能够快速通过源码写出注册机;三是源码泄露存在安全风险,近几年HW行动一直在强化行业内的安全意识。从事.NET软件开发,就不得不关注软件安全问题,特别要注意到关键之处的源码保护问题,这也是我编写《.NET程序的文件解析及保护技术》课程的初衷。本课程能够帮助大家深入理解.NET文件格式,了解常用的保护技术原理及关键实现,增强软件开发安全保护意识,打造.NET程序的加壳保护和脱壳破解软件。希望大家能够通过学习,进一步提升.NET程序逆向技能,提高.NET软件开发的安全防护水平。
顺带一提,htg大佬精心编制的《.NET程序的文件解析及保护技术》在看雪课程平台就有售哦,欢迎感兴趣的大佬激情下单~
上新特惠:¥589元
最后,感谢看雪论坛专家【htg】 百忙之中抽出时间接受访谈,也感谢他一直以来对看雪社区的付出,祝他未来在软件安全之路继续披荆斩棘,课程大卖!
如果这篇采访能对大家有所帮助、启发的话就再好不过了。大家还想我们采访谁、采访哪些问题呢?在评论区告诉我们吧!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)