大一新生学习二进制一年的经历
23年高考完在cuit学习了一年技术后,现在怎么样了?
先自我介绍吧,我是来自成都信息工程大学syclover实验室(三叶草技术小组)的Elegy,这篇文章是写给刚结束高中学习即将开启大学学习的学弟学妹们的,希望能给为学弟学妹们提供一些帮助,略微揭开一点信安神秘的面纱。同时这也是本人这一年的阶段学习报告。最后会和大家分享一下生活。也很感谢这一年Arahat0师傅对我耐心的指导!
我的blog地址
https://yuan0x1elegy.love
(阅读原文地址可以跳转)
简要的学习历程
-
高考刚毕业
高考毕业后,看见自己的分数后,就差不多选定了成都信息工程大学,并且加入了各种招新群去了解关于学校的相关信息。因为高中就对计算机感兴趣,所以当时就主要是了解各个实验室的特点,并且都去尝试一下。不去尝试一下大概率是不知道自己其实喜欢某一样东西的。然后就开始学习信安的二进制,并且以进syclover实验室(三叶草技术小组)为目标进行学习。
-
刚开始接触的时期
当时主要是打基础,学习C语言,理解C语言里面的指针。这么说吧,指针就是C语言的灵魂所在。学习ida逆向工具的一些使用,这些当时其实都没有特别深入去学习。
然后就是迎来第一次的比赛经历(西安电子科技大学的ctf比赛),于是上手开始做一些简单的逆向题。刚开始做题的时候还是比较坐牢:陌生的ida界面,不熟悉的语言,还没建立成熟的那种做题流程,什么东西都在尝试。但是引用学长的一句话:“坐牢吗?坐牢就对了,不坐牢学不到东西。”
随着一道一道题解出来,分数开始一点点上涨,看着自己的排名上涨(当时学长还做了一个校内榜单,把当时一起学习的小伙伴都统计了上去),真的是感受到了学习带来的正向反馈。还记得当时一天时不时就去看看榜单,看看自己排名掉了没。
并且这些比赛大多数都是新生赛,不需要顾虑自己学没学过,直接参赛然后让题磨炼自己,逐渐学习,逐渐开始了解一些技术。然后重要的就是如果自己没做出来一些题,可以礼貌问学长怎么解决 (这里建议看提问的智慧)。
-
打完第一次比赛后
相当长一段时间的学习集中在两点:1. 学习新生赛中出现的考点;2. 学习计算机基础内容。在新生赛中,每个考点其实都是考得比较浅的,知道考察什么知识内容后,就用浏览器搜索相关内容,然后去解题。这里已经和高中的学习模式很不一样了,更多的是边学习边做题,这样才掌握得更加牢固,理解更深刻,效率也更高一点。计算机基础内容主要是学习语言基础、汇编、计算机组成原理、Linux等。
-
geek大挑战
Geek大挑战是当时第一次遇到的比较正式的比赛。因为是syclover实验室举办的,所以校内有奖项,奖品诱人,校外人员也同时有奖竞争激烈,可以感受到校外大佬带来的压迫感。而且是两人为一队进行比赛,可以和队友互相鼓励。
当时打比赛期间,真的很努力在学习,为了每一道题拼尽全力去学习。Geek真的是盛产黑马,当时很多在Geek期间才开始正式学习信息安全的同学,随着比赛进行,排名不断向上冲刺,给人压力特别大。同时,我们的动力也变得特别足,都不想把奖项拱手让人,晚上和队友陪星星陪月亮。
Geek大挑战也算是转折点。只要跟着全程打完了一个月,都会对信息安全开始有深一步的了解,真正意义上的入门了,有种打通了任督二脉的感觉。无论过多久也忘不了大晚上因为搞懂了一个很关键的知识点兴奋得睡不着觉的经历,并且最后有幸和队友以第一名的成绩收尾。
因为比赛期间算是正式接触了pwn方向(即二进制安全的漏洞挖掘方向),也让我确定了自己想要学习pwn。因为真的很帅!虽然相比而言确实很难,但是高情商说法是:学习起来有很强的成就感。下面放一下比赛颁奖图
-
小组面试期间
小组面试期间和Geek大挑战是重合的,所以当时还是比较高压的,也可能是最容易放弃的时间。很多人认为面试内容难,然后自己和一些提前学习过的人差距较大,就选择放弃。但是其实面试考核的是学习速度和质量,而且面试任务其实几乎是所有人都没学过的,所以大家的起跑线是一样的。只要认真学习相关知识点,然后写出自己的详细学习报告,很大概率就可以通过。
虽然让大家不要紧张之类的,但是其实当时的我很紧张。为了能够不被甩开,当时还是很刻苦在学习布置的任务,然后熬夜写报告,想着出一份报告让自己的心踏实下来。(不推荐熬夜,因为本人的生活作息导致早起难度比晚睡高太多了,这里能保持健康作息的话其实学习时间是差不多的。)并且在报告写出来后,比较仔细地再打磨打磨后交了上去。
在面试期间的学习真的刷新了对计算机的理解,深入底层地学习,最终理解了以前难以理解的一些东西。并且确定了后面的学习模式——写博客式,因为面试的时候是边学习边写报告,所以就养成了习惯,在学习的时候就会类似于记笔记一样将内容记录下来。
-
近期
其实,近期的学习历程概括起来和前期的内容差不多,但毕竟是写给新生的,前期的内容更具参考性。近期的学习其实也没有和前期发生很大的变化,我建立了一个博客网站用于记录自己的学习历程。我觉得这是很有必要的,这样可以清楚地知道自己学习了什么东西,也方便后面自己回头复习。而且也方便学长监督自己的进度,与其他小伙伴共享知识点。所以近期的学习模式主要是四点:
-
打一些大型比赛从中学习知识点:毕竟前面说了嘛,坐牢才是在学习。做一些大型比赛的题可以跟进一些解题技巧并且学习一些比较新的技术。而且一般大型比赛的题都是很容易获取的,比如搜索XCTF、强网杯、西湖论剑之类的。这里主要是提升自己的上限。 -
学习计算机基础:这部分要看自己的学习方向了,不同方向必须掌握的底层不同,这里简单说一下pwn方向(即二进制漏洞方向)。比如Linux内核、C语言各个版本的源码分析、汇编代码等等。 -
看大佬博客:行业内真的有很多大佬,并且很多大佬都愿意把自己学习到的东西写成博客分享给大家。所以,看大佬学习了什么然后自己跟着学习也不失为一种方式。 -
根据兴趣进行学习:因为我对计算机非常感兴趣,所以对计算机相关的其他技术也有浓厚兴趣。平时会多了解一些有趣的新技术进行学习和实践。比如有时候单一方向的学习累了,就去稍微了解一下其他有趣的方向,往往会提高自己的知识面,并且起到休息的作用,因为学习自己喜欢的内容其实就和打游戏一样。
学习清单
★
前面说的主要是本人的一些学习历程,现在就汇报一下自己这一年大概在安全这方面学习了一些什么东西 。涉及的一些名词可能有点多,不想看的可以直接跳转到后面的分享生活环节。
”
编程语言
学习过的语言是go
,c
,java
,python
,js
,ts
,nodejs
,lua
... 其中比较熟练以及用得比较多的是:go,c,python,lua。
其中Go
算是自己的一个主用语言,写一些后端,插件框架,爬虫脚本的时候就使用golang,本人是很喜欢golang的简洁高效优雅,并且golang也是安全后期的重点研究对象 所以接触很多,了解过golang的底层源码(主要跟随《go语言的设计与实现》)。
c语言
就不用说了,学习二进制的必须把c语言研究得明明白白的,起码指针得有一定的理解才行,一些深入学习的内容我主要学习过glibc2.23,glibc2.27,glibc2.35,glibc2.38版本的堆管理器和有关io的函数。学习各个类型在堆栈中存储的方式。感觉c语言算是自己学习的语言中理解得较深的了。
python
python主要是写攻击脚本的使用,然后就是写爬虫,写一些后端的时候使用。可能相比于go来说熟练度没那么高,但是基本的一些设计和使用是会的。
lua
可能更多的是写了一个golang的lua插件框架,研究了一下对lua虚拟机的一个进程调度,一些内嵌函数的书写。
汇编
主要学习的是x86、ARM、MIPS这三个架构的汇编语言。当然,最熟悉的是x86架构,因为一般我们在学习pwn(即二进制漏洞挖掘方向)的时候会高频使用gdb进行调试,而gdb显示出来的就是汇编代码,所以二进制的学习中,汇编是特别有必要的。并且学习好了汇编,对一些操作的理解会深刻很多。特别是当一些软件对代码进行了混淆,我们通过IDA还原出来的代码可能是混乱不堪的,这个时候直接查看汇编代码可能会更有效。
目前我对各个汇编的掌握情况是:能熟练地看x86,并且能够用x86写出一些简单的shellcode对程序进行攻击。还掌握了一些x86的shellcode缩短技巧,就是用更少的字节完成一些操作。在ARM方面,手撕过手游某某世界中的内联汇编代码,并分析出了加密逻辑。对于MIPS,做过一些简单的题,大概了解一些概念。
熟悉函数调用规范,x86下的四种函数调用约定,并且对MIPS和ARM的调用约定也有一些了解。
工具
学习过的工具有:gdb、IDA、VSCode、GoLand、PyCharm、JADX、ADB、Frida、Git、Docker、patchelf、QEMU、MySQL/SQLite等。
主要使用的工具包括:gdb、IDA、VSCode、GoLand、JADX、Frida、Git、Docker、ADB、patchelf、MySQL/SQLite以及一些pwn的小工具。
-
gdb
这是最熟练的工具,能够用gdb查询各种寄存器、代码、堆栈。能够修改内存,查询结构体,查询变量。熟练进行代码调试和源码级调试。因为gdb确实很重要,要想深入理解底层就得使用gdb才行。
-
IDA
能够使用IDA进行代码审计,修复结构体,改变变量类型,写IDAPython脚本辅助调试。可以使用IDA调试Android的so文件,较为熟练进行调试汇编界面。
-
Frida
Frida的使用比较浅层,能够封装一些方便hook的函数,掌握怎么打印函数调用栈、函数签名等信息。能够hook native层函数。用Frida进行过一些实战,可以利用frida-dexdump脱一些简单的Android壳。
-
JADX
掌握一些基本的搜索技巧,会利用JADX进行反汇编分析,基本的一些调试技巧。
-
Docker
掌握基本的镜像的拉取、容器的创建及其一些基本的启动参数,简单的Dockerfile的书写。
-
Git(以及GitHub网站使用)
掌握基本的上传commit、pull同步远程、push提交请求、rebase。理解reset和revert的区别,并且解决一些特殊情况。在一些开源项目中使用git与多人进行协同开发。
GitHub网站:熟悉一些基础的开源项目提交规范,利用GitHub进行管理自己的项目,利用GitHub搭建过自己的博客网站。
-
MySQL/SQLite
会基本的增删改查,可以利用gorm等对数据库进行一些操作。
pwn方面
-
掌握x86下的ROP链 能够较为熟练运用ROP进行攻击。
-
会解决一些异架构的pwn题。
-
掌握格式化字符串攻击,阅读过scanf printf的源码。
-
能写常规的shellcode,能绕过一些sandbox ,熟悉一些64转32之类的小技巧。
-
学习完pwn wiki的堆攻击,了解glibc的堆管理机制 以及多线程堆管理机制 阅读过glibc各个版本(2.23 2.27 2.35)的malloc和free源码。
-
掌握
house of apple1/2/3
,house of cat
等io劫持攻击手段 分析过getchar ,getc ,printf,puts等io函数的源码 打过exit tls_dtor_list的劫持。 -
大体读过linux0.11的源码(主要跟随《linux源码趣读》) 重点了解了内存管理,进程管理方面。
-
初步了解jsc v8的一些知识点。
-
php的堆管理机制 做过2024d3 phppwn。
-
学习过编译器原理,自己实现过基于golang的类c语言解释器 和 基于c语言的解释器 (算是lab吧)。
逆向方面
-
学习过安卓逆向 项目大致结构 主要是学习frida ida objection dexdump等工具使用 实战过一些项目 -
掌握基础的一些加密算法AES,TEA,RC4等,能够写出其逆向逻辑。 -
花指令原理及其去除,主要是几种常规的比如jnz,jz,call等。 -
能逆向go,c编译的程序。还有比如 web ass
,cgi
等一些。
分享生活
★
6月25号的时候有幸参加了矩阵杯,虽然第一天没帮上什么忙,但是还是好好旅游了的(bushi)。一般这种线下赛都巨帅,能够线下见到很多大佬,而且主办方承包了大部分费用。这里分享一下这次比赛的一些东西。
”
这次是矩阵杯第一次举办,地点在山东青岛,刚下飞机就坐了一个小时地铁就来到了比赛地点。第一次见到比赛地点(青岛国际会议中心)感觉自己就是一个小土鳖,而且恰逢夕阳,一直拿着手机酷酷拍照。作为四川人第一次见到海还是特别激动的,以及一想到自己要和各个顶级联合战队的成员,一些顶级名校战队的佬们见面就很刺激。
然后就是第二天比赛的时候场内的照片。真的现场巨帅,可以近距离看见大佬们心情激动。
还有就是第二天主办方举办的矩阵杯之夜,颇有赛博朋克的那种感觉了。
结语
计算机学习的过程不是一蹴而就,与高中的学习模式相比,其实已经变化很大了,多实践多去尝试多在计算机之中寻找到有趣的东西。我当初接触计算机都是因为想要在我的世界里面添加一些自己的想法才开始学习的计算机,当在这方向有兴趣后学习过程其实是快乐的,甚至有时候会沉迷,有一段时间每天学习14个小时以上都感觉时间过得太快了。所以在启航之前,先找到兴趣或许可以行驶得更远。而且不要把放松当作负罪,就算是打游戏都会打腻的,适当休息效率反而会更高。
博客地址
https://yuan0x1elegy.love(阅读原文跳转)
可能兴趣就是那样:)
虽然辛苦,我还是会选择那种滚烫的人生
原文始发于微信公众号(二进制磨剑):大一新生学习二进制一年的经历
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论