第一个一百!!!

Posted on Jan 15, 2021

看着九十九这个数字想了一会儿,惊觉博客居然要有一百篇文章了,既然如此这第一百篇就胡扯一气吧。

缘起

高考失利,不过最后进入的学校和专业还是相对满意(学校虽然偏科严重但是和我关系不大),第一个月基本上就是日日水过,期间考虑过我到底想要什么,高中算是打过OI,没花多少时间是真的,基本就是我打游戏的一个掩护(否则想想高中期间可能真的没得电脑玩),但是也不是真的什么都没学到,可以说基础算法都系统的学过了。我校的ACM实力确实是很强,我把自己当作零基础的来练,也是可能夺个区域赛Ag什么的。而且以我的OI经历,也算是超出零基础不少(其实我到现在还不能肯定当时我到底算不算进入了集训队,不过也是过去的事情了,就当是进了吧,反正也没什么关系了),班里也有大佬可以给我帮助,也许真的可能能成。然而我是一个非常兴趣驱动的人,如果有得选,没兴趣的事情我是死都不会选的,管他有多少好处,在打了几场CF和仔细审视了自己刷不进去题目的事实后,我彻底明白了我事实上并不喜欢算法。

在那段时间我其实打算CTF和ACM两手抓,当时对安全这方面没什么了解,上知乎查了查,发现大家都建议学web,当时我想想学web的话,不如从零开始搭建一个个人博客(现在想想当时是真的不自量力),本来准备就拿树莓派得了,但是发现阿里云的服务器是真的便宜,还不如直接用云服务,于是就租了个ECS,先宝塔装了一套,搭了个wordpress出来。这就是博客的缘起了

曲折的路

然后发现这样根本没有技术水平嘛,我能学到啥?图标点点嘛?就全部删掉准备自己干一个出来,然后知乎莫名其妙的给我推各种什么web没前途,一定要学bin的回答,正好当时我burp suite都折腾不好(这里不得不说,windows配个Java怎么能这么麻烦,到现在我都不知道我的电脑上的jdk能不能用),写什么博客又需要学那前端三剑客,感觉前路茫茫。又有学校的协会对reverse进行一定的介绍,于是就买了三本书:《汇编语言》,《逆向工程核心原理》,《加密与解密》(到现在也只看完一本..)。

《汇编语言》这本书写的是真的好啊,花了一个星期我一口气把它读完了(这个读完的定义是读到端口为止,后面的和保护模式关系可能很小了,就暂且未读)。这里我一定要多说两句,王爽老师的这本书是我读过的最好的教材,真正是深入浅出的介绍的实模式汇编语言,写的完全不会有看不懂之处,又确确实实是讲清了其工作方式。看这本书之前还很建议先读一读《编码》,是一本非常轻松的科普书,又确实充满了干货,和《汇编语言》结合起来看,真的会对计算机底层有一个重新的认识。

后来还买了一本《x86汇编:从实模式到保护模式》,希望加强一下自己的汇编水平,这本书应该也是写的很好的,为什么说应该呢,因为这本书我真的没看几页就看不下去了,虽说捧一踩一是一件非常不好的事情,但是我还是得说,和《汇编语言》一比,这本书真的是难以读懂,书的下半部分“进入保护模式”,一上来就讲GOT,直接堆GOT每一位是什么东西,完全看不懂,看了3面就想睡觉了。这本书到现在还是没看,真的是提不起兴趣去看,这样也许我以后会吃亏,但是暂且不管了,开心最重要嘛。

客观来讲,我的基础在ACM那里可以说不值一提,毕竟哪怕是学OI的时候,我也是研究底层研究的多,但是放在CTF,欸你还别说,我还真的还说的过去。大体是协会第一次给我们培训,布置了一点作业,客观来讲题目不难,我就简单地写了一下。有一个题目读入用的gets,其实当时仔细考虑过,毕竟是给安全协会的作业,安全性肯定要考虑,当时我也粗浅的知道gets是不安全的,应该用gets_s才对,然而gets_s在我的编译器下通不过编译(应该是当时用错了的原因)。我又一想啊,协会应该也知道新手不会特别懂这个,用个危险函数应该也没啥,然后交上去之后改作业的学姐(很长一段时间我都以为是学长,还以学长称呼,想想也是有点不好意思)就给我指出了,后来谈了谈,大概她觉得我还不算一无所知,就让我去和协会做二进制的学长聊聊。

于是和协会的学长进一步地联系了一下,学长当场发给了我一道pwn入门题,也就是buu的rip一题,当时我还没想到我的二进制之路会从此变成从pwn而不是之前预想的从re开始。拿到题目就做呗,这就体现出CTF和ACM的很大的一点差别,就是环境,不想折腾的话ACM的环境就一个DevCpp就足够了,那环境5分钟以内就可以配好,CTF就不一样,想想当时我配工具就配了半天多,一方面我当时还不会做法,要从git上clone的速度非常慢,还会出现失败,另一方面是为了偷懒,想着直接用WSL来弄,结果依赖问题怎么样都解决不掉(后来才知道是换源换错了),gcc,g++,gdb都装不上去。做题前先花了一天配环境,当时学长和我说题目不难,主要是熟悉一下IDA,我就傻傻的以为是熟悉IDA的动调,好家伙又花半天研究IDA怎么动调。大家都知道啊,高版本的Linux下IDA的破解是很难找的,显然我也用不起正版,那只能Windows上远程调试。找IP就花了我很久,virtual box的网络转接原理我是到现在还没弄懂,当时弄了很久总算是知道怎么动调了,才发现这对我解题有什么用处?这么简单的题哪里需要动调?(客观来讲IDA远程动调我还真没怎么用过,一般也是用gdb。)然后正式解题,题目确实很简单,我先花了一段时间学函数调用栈,然后尝试ret2text,怎么样都写不出来,一直是segment fault,想想当时是真的年轻啊,这么简单的错误竟然卡了这么久,最后发现就是返回的地址多写了个b,真是懊悔莫及。

做完这题发现pwn还真的挺有意思,于是就彻底放下逆向了,虽然好像说是先逆向打好基础再学pwn会好一点,但是也无所谓了,毕竟兴趣更重要嘛。

入门之路

pwn确实挺难学的,主要是调试不是很方便,没办法(如果有办法务必告诉我!)直观地展示exp中每一步的效果,很多时候只能凭空想象,这是一重难。还有就是知识比较多,比较杂,而且要熟悉源码才能真正精通利用,这样的话读glibc源码就不可避免了,说实话这种体量的代码是真的不太好读,各种宏,各种调用,很难懂。我学习的方法大体就是跟着题目走,找题目做,不会做就看wp,争取吸收知识点,这样的效果还是不错的,毕竟有pwn出题的反馈,还是很有成就感的。

愿景

希望2021年可以继续将博客维持下去,最好能再写个一百五十篇文章吧。然后希望能在这个寒假的协会的新生赛中取得好的成绩,争取能尽早进入协会,并且最后成为主力,也算是充实的度过大学时光吧!