Hello
, 欢迎来到wjllz 0days road
. 这是系列的第0篇
, 这也是我的新的博客系列. 因为一些难以理清的原因, 所以我也不能够确定这个系列到底能有多少篇.
这个系列的起源来源于, 由于一些难以理清的原因, 所以我无法确信在接下来的日子, 我还能不能够继续做安全. 所以如果是决定要离开, 那么我想多多少少能留点或者有用, 又或者是没有用的东西.
这个系列的针对目标是初学者. 也是写给一些和我一样类似的或者截然不同的初学者.
如果你是作为初学者这个身份开始学习的话. 大概会困惑于很多东西. 比如有时候, 你盯着电脑屏幕盯了几天只是为了搞清楚一个bit位
到底是在做些什么东西, 比如有时候, 你碰到了一个很有趣的点, 然后你折腾了好几天, 一回头, 才发现自己方向上完完全全是错的, 比如你v8搭了一个月...
我其实不太懂一个很厉害的人是怎么去思考问题的. 如果你打ctf
, 我想你多多少少听说过PPP. 如果你做windows kernel
的话, 你大概能够经常看到j00ru师傅和Alex师傅. 如果你做浏览器
的话, 大宝师傅和lokihardt师傅大红灯笼高高挂, 所以你多多少少也能看到他们.
然后你能够找到大量的他们分享的文章, 或者在一些会议当中, 或者在他们的博客当中.
因为我自己不是经常打ctf
, 所以我对ppp
的师傅们了解的不是很多. 但是在其他师傅的能给我看到的东西里面学到了很多的有用的东西. 但是更多的, 会慢慢开始更加的好奇. 我开始更加的好奇在那些丰富的理论之下. 在初学者阶段的时候这些厉害的师傅们是怎么思考的问题的, 当卡住一个点的时候怎么切换去更好的解决问题.
所以很庆幸自己作为初学者, 或者多多少少能够更加的理解到关于初学者的一些东西.
这篇博客, 我会去介绍在这个阶段我碰到的一些问题, 因为还在摸索阶段, 所以有些问题并没有答案. 我自己比较喜欢的是windows kernel
. 所以我会挑选windows kenel
作为例子.
这篇博客来源于自己的一些个人经验, 所以有些东西难免出现错误. 但是如果能够让作为初学者的你多多少少从中获取到一点点东西, 或者能够帮助你推开那扇门一点点, 那么我想这样就好. 但是作为个人的理解难免会和一些厉害的师傅观点不同, 也希望师傅们轻喷为谢.
如果你之前阅读过我的博客... 大概知道我的博客的陋习是吹逼为主, 聊技术为辅. 所以, 让我们闲话少提,开启这扇门(请不用担心, 我会关上的).
关于学安全的, 我自己的第一个困惑是差距. 如果你知道Alex师傅的话, 你会发现师傅是一个很神奇的人. 因为他啥都会.
然后你一看自己, 发现比较起来自己啥都不会. 所以我一度怀疑whoami
, 或者是这个:
但我想更多的时候我其实是这个:
我是后来盯着alex
师傅的胡子看和盯着小刀师傅的博客看才想明白这个问题.
[+] 师傅他们所拥有的是他们的经验, 他们接触的更早, 付出的更多. 自然会的更多.
所以我想去要求自己会什么, 对初学者的我实在操之过急.
当我不会什么的时候, 我能不能找到什么东西去让我会什么
这是一个我觉得更为重要的技能. 这项技能对我而言更多的查找资料上. 能不能在合适的地方找到合适的资料, 找到之后能不能刨出对自己有用的部分, 确定之后能不能变为自己的.
So, find your key.
第一点是善用google
, 如果是关于学安全的话, 我用的更多的关键词是这下面几个:
tutorial
blog
bypass
awesome
write-up
这些关键词大概率能够给你带来很多的有用的资料, 比如第一个所带来的:
这样很好, 但是这样的google
只是皮毛, 我们还可以用的更为方便一些. 由于大多数有用的资料都会以pdf
和ppt
的形式存在, 所以我会用到下面的两个后缀.
[+] 1. filetype: pdf
[+] 2. filetype: ppt
比如1
的效果如下:
关于google
的部分我所经常用的就是这些. 如果你想要更多的好用的技巧, 你可以在Google Hacking————你真的会用Google吗?一文当中得到更多的答案.
好了, 这些资料看的多了的时候, 然后你会发现很多有趣的事. 比如你发现好像很多不同的资料来来回回都是那些人, 比如你会发现很多有趣的文章来来回回都是来源于那些博客.
比如你可以发现这些厉害的师傅的twitter
:
alex
j00ru
Morten Schenk
k0shl
leeqwind
然后你会发现他们对应的博客:
alex blog
j00ru blog
Morten Schenk blog
k0shl blog
leeqwind blog
在这些师傅的分享的twitter
和博客
当中, 你能够得到大量的有用的东西.
这些东西大概已经足够. 但是我想如果如果是开门的话, 不如我们让他开的彻底一些.
比如你会发现这些师傅关注的人里面很多也是很厉害的师傅, 比如这样:
这样的话你能够接触更多的厉害的师傅, 也能够接触到更多的有用的资源. 这种方法我把它叫做递归follow
法, 伪代码大概如下:
这算法我随手写的, 估计会无限递归, 但这不重要, 大概明白这层意思就行.
博客的算法同理, 比如天知道Alex
师傅友链
顺着翻下去有多少宝贝:
既然聊到了twitter
, 不如来聊一下更多的东西. 比如它的#
关键词:
用好这个关键词你能够获得很多的有用的资料. 然后在你获取的资料的里面, 你能够发现很多的会议重复出现. 会议对我而言, 是一个很重要的资料来源, 我所阅读的大量的论文都来源于一些会议. 记忆所及的经常逛的会议有这些:
blackhat
hitb
44con
cansecwest
defcon
很抱歉我无法去分辨好的会议和坏的会议, 因为对于初学者阶段的我, 这些会议能够分享以及足够感激... 而且我感觉大部分都是对我有用的.
这样的话我们就能够更新一下我们的关键词. 比如这样:
这些会议的pdf
一般会分为两种, 一种是演讲的时候用的简洁的ppt
, 一种是比较详细的paper
.
比如这样:
或者比如这样:
如果你想要更详细的手把手教, 在youtube
上你能够发现更多的有用的资料. 上面的会议都有他们的youtube
官方账号. 比如这样:
blackhat
hitb
44con
defcon
作为国人, 我想我们大概率英文都比较菜... 至少我是这样. 所以视频估计会是一个很难获取的资源, 因为现在的会议大多数用英文当作载体. 但是没关系, 如果你真觉得迫切的想接触什么东西的话, youtube
提供自动生成字幕. 重复性的阅读就好了.
偶尔, 也会有一些会议使用自己的语言, 比如俄语爱莫能助, 比如这样:
这一部分我自己的解决方案的话, 一是看看有没有什么有用可以替代的东西. 另外一部分就是观察表情, 如果真觉得这份资料有用的话, 我会去看他在哪一页PPT
讲的更多. 然后自己去反复看看PPT
, 然后自己调试.
然后这些接触之后, 你会发现很多有趣的组织, 经常会去发布有些有用的blog
. 比如这些:
google project zero
doar-e team
mwrlabs
Improsec
nccgroup
这些是你能够看到的东西, 我指的是作者会手把手教你的东西. 但是有些问题找不到答案的时候, 一些源码或许会更有帮助, 这个时候是时候介绍出我们的github
了.
无论是windows kernel, 浏览器, 或者是虚拟机, github
上面搜索awesome
你都能够得到一大堆的有用的资料. 比如这样:
但是这些远远不够, 带着你想要的问题, 你能够得到很多的有用的源码, 你可以通过调试, 或者其他的手段去吸收更多的东西, 比如这样:
然后你又可以用递归follow法
来follow
一大堆有用的大牛了.
有了这些东西, 我想门大概开了一丢丢, 我们剩下的, 就是学会怎么去使用了.
小标题来源于Eason
的心烧. 大概是指知识的海洋太深, 很容易溺死其中. 所以在下面的这一小节我想去讲一些关于自己怎么在知识的海洋扑腾里面的一些事.
这种扑腾的手法来源于王爽老师的汇编教程(第三版), 大概是指我们所会的东西真的不多, 所以你可能会陷入本来学习着A
, 但是发现自己B C D
都不会, 然后又需要去补的无限的死循环. 但是, B C D
这些东西, 真的是目前我们一定需要的么.
举个小小的例子:
[+] 1. 有一天你想要去pwn
内核. 我们记作A
.
[+] 2. 然后你需要一个洞, 我们记作B
.
然后你发现挖洞很难, 但是没关系, 仔细一想. 你会发现B
和A
其实相互独立. 你其实可以先学习A
的, 至于B
, 心急吃不了热豆腐. 在慢慢成长之后总能解决.
[+] 我不想讲B
的原因是因为我对于B
也是诸多困惑, 所以不了解的事就不多说...
来冒名替代B
的, 是其实你可以找一些比较老的漏洞. 先用他来假冒B
. 现在我们只要关注A
就好, 比如A
的一般步骤.
[+] 1. 你需要去理解别人的漏洞. 记作A-00
.
[+] 2. 你需要编写POC
. 记作A-01
.
[+] 3. 你需要控制读写权限. 记作A-02
.
[+] 4. 你需要控制RIP
. 记作A-03
[+] 5. 你需要编写shellcode
. 记作A-04
.
可是人生总是难, 你会发现你00-04
全然不会, 但是没关系的, 他们千丝万缕, 但又互不影响.
在这里我用shellcode
做一个例子. 你可以发现如下的资料:
[+] 可以去学习如何把模块独立出来.
[+] 一篇手把手教导写shellcode
的文章, 作者采用了大量的动态图. 博客做的相当用心.
[+] github
上的一个关于shellcode
的项目. 里面有针对x64
和x86
的shellcode
现成的版本. 可以通过代码阅读学习(我以前做adobe利用
的时候使用过, 效果拔群, 但是针对于浏览器并没有进行任何尝试, 所以具体能不能行我不是很清楚(但我觉得大概率应该ok
, 毕竟都是针对windows
平台的.)).
[+] 作者写的一个有关于PE结构体
的文章, 图文并茂, 从调试和编写代码入手. 这篇文章对理解如何动态的获取函数地址应该会有很大的帮助.
学会分离之后, 类比一下其他模块. 那么应该能够解决一些关于知识的海洋水太深的问题. 这很难, 但是没关系, 请慢慢来.
我之前写过一篇类似的文章, 因为觉得写的太烂, 所以从我的博客当中移除掉了, 但是你可以在看雪的这里找到它.
我高中的很崇拜的一个数学老师是一个大胡子, 是一个潇洒的人, 他教会我一个很重要的东西叫做通一通百. 大概是指会一道题其实大概是一件很难的事, 但并不一定是最难的事. 在学会了那一道题, 能不能会一类题.
这样很棒, 但是更棒的是, 在你学会了这一类题之后, 能不能把题
这个词去掉, 用在其他地方, 这样或许会更棒.
故事是这样的. 假使你学过c语言
. 我c语言
学的不好, 所以我所知道的c语言
是如下的东西:
[+] 1. 基本语法
[+] a. 常量变量.
[+] b. if switch.
[+] c. while for
[+] d. 函数.
[+] e. 正则表达式.
[+] f. 文件读取.
[+] g. etc...
[+] 2. 算法
[+] 形形色色的算法, 那其中应该是自己的思想. 有自己的思维.
[+] 3. 功能和应用
[+] 这一部分我指的是这中语言的实际运用. 在哪些地方实现什么样的功能. 以及应该怎么使用到具体的生产环境.
这是我理解的c语言
, 所以类比一下到数学, 大概如下:
[+] 1. 基本语法.
[+] a. 加减乘除.
[+] b. 各种公式.
[+] 2. 算法
[+] 你可以把它类比为初中的时候怎么去画辅助线, 高中的时候思考怎么把公式改为其他形式, 可以用高中的知识求导. 这一部分是需要自己去理解, 积累和创造的.
[+] 3. 生产环境
[+] 你买菜的是时候心算如有神速, 更多的时候去算一个皮肤多少钱. 自己的零花钱足够买多少皮肤, 然后一算作为一个穷鬼还是好像买不起皮肤, 所以学习faker最好.
c语言
可以类比到数学, 那么c语言
自然可以类比到我们的window kernel
. 这一部分需要注意的是... 我并不懂其中的算法和功能应用, 对基本语法也知道的很少, 所以我会只会谈论自己所知道冰山一角. 至于冰山之后更大的世界. 你可以去看看泉哥的另外两篇文章(1和2), 在那里你可以找到的更多.
[+] 1. 基本语法.
[+] a. shellcode
编写.
[+] b. 各种缓解措施.
[+] c. 各种利用技巧, 如构建读写原语, ROP
.
[+] d. 基本的调试技巧.
[+] f. 大基本功. 比如windows kernel
的对系统的更加深的理解.
如果可以类比到数学. 那么很多学习c语言
和学习数学的经验就可以迁移到windows kernel
的学习当中来, 谢天谢地, 这一部分也帮助了我很多.
之后在各个区域其实也有迁移.
[+] 比如你会发现内核的很多漏洞模型其实你可以在平时的linux ctf pwn
当中迁移过来.
[+] 比如你会发现browser
的ArrayBuffer
的利用技巧真的和windows kernel
的GDI primitive
很像很像, 他们相似到我最开始写浏览器的漏洞利用的时候基本没看文章只是猜了一下内存布局就能够完成.
[+] 比如你会发现browser
的很多漏洞模型和windows kernel
的也很像.
我更多的知识依赖于调试器. 源于大二的时候初学算法的时候和朋友争论一个算法, 最后两个人动手写的时候才发现两个人都是错误的... 所以与其猜测, 对我而言还不如对着调试器理解的彻底. 这里我用windbg
举例.
一方面是调试器的基本语法, 一般你可以在官方文档找到他:
另外一方面是调试器的一些插件, 那些插件或者可以让你心情变好, 或者可以让你如有神助. 插件的官方文档一般都不太完善, 所以你可以找到很多有用的博客. 比如这个
接着是一些调试trick
, 这里我不知道我理解的对不对, 但我更多的介绍的是关于那些让我觉得便利的调试技巧.
[+] 1. 比如你可以利用虚拟机的镜像功能来帮助你绕开很多的缓解措施, 比如kaslr
和cookie
(例子可以参考这里)
[+] 2. 比如你可以利用windbg
来帮助去模仿一些本来应该由代码来完成的任务, 之后再去完成代码例子可以参考这里.)
[+] 3. 比如其实你可以利用某些代码来自己构造一个或者模拟, 替代一个新的调试命令.
[+] 3. 比如你可以去合适的利用log, 或者是一些调试软件本身支持的功能来方便你调试.
[+] 4. 比如什么时候用条件断点能够让我们的调试如德芙纵享丝滑
.
[+] 5. 比如什么时候用硬件断点, 什么时候用软件断点.
[+] 6. 比如哪一些命令是有用的, 经常在哪些地方用.
[+] 7. 比如哪些工具好用. 适用于什么地方.
[+] 8. and etc...
如果是初学的话, 我自己的感受还是更多的去保持和作者的环境一致, 这样能够帮你避免更多的问题. 积累的越多的时候或许能够帮你去解决更多的无法预计的问题. 这是我所说的尽信书
.
如果你是一个喜欢折腾的人的话, 关于学习的时候, 一些环境搭建的问题. 你可以可以的去追求和作者原环境不一致. 这样你能碰到一些形形色色的错误, 也能够自己碰到和解决很多问题. 这是我所说的不如无书
.
我不知道这两种方式哪一种更为科学, 我自己更喜欢第一种, 但是更多的时候碰到的都是第二种... 所以这个的话估计得见仁见智. 自己筛选.
假期认识了TJ学弟, 因为他经常会问我一些windows kernel
的东西. 所以我偶尔会帮他调一下bug
. 然后我发现我和他调试的思路是不一样的.
学弟擅长的是把东西跟进去, 然后想本源. 这方面我不经常用... 所以了解不深.
我自己采用的是对比.
[+] 如果我的情况是错误的. 本来是应该先执行A+B+C
, 但是结果是A+D+E
.
[+] 1. A
为什么能正常出现.
[+] 2. B/D
有什么不同. 什么会导致他们不同.
我一般会从这两个思路出发. 简而言之, 预想一下正常的流程, 再对比一下错误的流程. 不断的调试着比对. 特别是开发exp的过程, 为什么这个能运行, 为什么加了这一个语句就不能运行. 带着很多问题对比思考, 能够收获更多新的东西.
我大概很多bug
的调试都依赖于此.
但是每个人的思路都不一样, 习惯, 经验, 角度都不一样. 所以这算是我对自己的博客不太自信的原因之一. 所以TJ学弟
和我说能够看懂的时候真是谢天谢地.
合租的朋友每天和我调侃我们的空调费用是毛毛雨, 只是下多了就很容易大雨倾盆. 所以空调开了最好能关上, 我想打开门最好也能够关掉门.
我所会的大概只有这些, 如果这些能够帮你打开这扇门一点, 那么就很舒服.
其实close
更多的是想聊一些关于安全的看法, 但是好像又见识太浅. 所以我不太想扯技术或者什么.
我想更多的是关于安全的感激, 如果你做安全的话, 大概会碰到很多容易感激的事情.
其实我以前蛮反感写博客的, 大概觉得浪费时间. 后来第一次想写博客是因为北归姐和我说不如写写. 但是第一次想好好写博客是因为小刀师傅. 在小刀师傅的博客里总是能够感觉到用心呀, 分享呀之类的字眼. 后来与小刀师傅慢慢交流我才明白. 原来厉害的人是应该长这个样子. 寄希望于自己的优秀, 也能够帮助别人优秀. 我对于优秀没有追求, 但是能做一些和小刀师傅他们一样的事就好. 所以天知道看见自己小刀师傅加了自己的友链的时侯我高兴了一个下午, 恍若少女怀春.
这些你能够碰到的优秀的人除了安全之外, 也能够教会你足够多的其他的事情.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-8-18 18:12
被wjzid编辑
,原因: [+] list