Category Archives: Uncategorized

最近的二三事20150711

最近也很久没更新博客了,稍稍更新一下。

0x00

之前去听了geekpwn公开课第三期的分享会,见到了一些技术牛人,似乎看到了真正的安全界的圈子。主办方keen team让人膜拜得五体投地,做分享的flanker是94年的,前一年获得pwn2own冠军也是我交同届的,我在起跑线上已经被甩了十万八千里了。。。

0x01

最近为了准备我厂的安全技术大赛,做了些CTF的题目,CTF就是capture the flag,跟安全技术相关,通常有编程,解密,逆向,隐写等题目,就如有名的东大计算机系研究生入学题可以算CTF题的一种。

做了些网站上的练习了以后自然觉得要不就是题目太水,要不就是智商被压制,很难有棋逢对手的那种感觉,然后渐渐领会到了一些CTF问题的坑爹本质,很自然,考试题与现实中的安全渗透还是有十分大的区别的。

什么是CTF的坑爹之处呢?下面让我来举个例子:

题目来源:http://ctf5.simplexue.com/qwctf/1.html

Os drnuzearyuwn, y jtkjzoztzoes douwlr oj y ilzwex eq lsdexosa kn pwodw tsozj eq ufyoszlbz yrl rlufydlx pozw douwlrzlbz, ydderxosa ze y rlatfyr jnjzli; mjy gfbmw vla xy wbfnsy symmyew (mjy vrwm qrvvrf), hlbew rd symmyew, mebhsymw rd symmyew, vbomgeyw rd mjy lxrzy, lfk wr dremj. Mjy eyqybzye kyqbhjyew mjy myom xa hyedrevbfn lf bfzyewy wgxwmbmgmbrf. Wr mjy dsln bw f1_2jyf-k3_jg1-vb-vl_l

对上述这段文字进行解密,可以,看到mjy这个字出现了很多次,所以根据词频猜测是单对单的置换密码,mjy表示the。(千万别问我这是怎么一眼看穿的,我也不知道)

于是我想试着替换一下,但是看到了第一行中,y这个字母会替换成e的话,就不对了,英文中e不会单独以一个词出现啊?于是我就在想是不是有单对多或者 多对多的关系。。。然后想了一个下午,没有想到。

后来我在网上搜到一个博客说了这题的解法,来源请点紫诺的博客

还是用了替换密码,到了一个网站去强行破解了一发,答案是:

2015062606483573

 

what the fuck?!原来他妈的前一半就是纯坑爹的,来干扰人的思路。不得不想起东大的那些入学题,因为通常如果比较难的解密隐写的题目,正确的解题方法通常可以规为这样一个步骤:

pic0

“解出一轮密文后,我能否判断这个密文的思路是不是对的?“就成了一个很大的问题。人的思路通常也是深度优先和广度优先相结合的,首先拿到一道题时大家肯定会开始开脑洞,得出潜在的n个算法0,然后分别检测得出来的密文1是否有解出答案的可能性,

(1)判断密文1是对的密文1(算法0正确),则以密文1为一道新题开始做。

(2)判断密文1是错误的,那剪枝,回到上一状态选择下一个算法0。

如果正确答案的密文1非常模糊,造成了判断错误,那对解题是一个致命打击,比如每一次选算法去解时有n种解法,按照上图显示可能多耗费的时间就是n的3次方级别的,也可能直接影响这道题做不做得出来。。。

0x02

以上这些,也有可能是我太弱了所以这样想。想象一下安全研究人员真正在研究某样系统存不存在某漏洞时,如果把它看成是一道题的时候,很有可能是没有答案的。(我就是没这个漏洞,你咬我呀?)

所以要不断地try and error,不光要try and error,因为有时error并不是真正的error,可能只是自己的评估方式有问题,而不是之前没有得出期望的结果。

说得比较拗口希望看到的人能懂。

我很希望有一个mentor能在我评估方式可能有问题,在自己解出的密文1该放弃还是该继续尝试时,给我点正面或负面的鼓励,但是现在我从事岗位的环境中,没有,前路一片漆黑。

之前有人说,我厂平台很大能给人很大的帮助,但是我似乎只感受到了大平台的信息传递慢,协作困难。我不否认技术主要靠自己,我也搞不清我到底是个平庸的人?还是要干票大事业的人? 只是希望,以后能加入个更有活力,少点限制的小型geek团队啊。我还是

希望自己能以技术为导向,而不用一些吹牛手段和trick来提高自己的KPI,光为了一个数据而不是做真才实干,我是会越来越瞧不起自己的。

Chrome插件学习小心得

0x00  前言

话说我厂有很多非常不合理的电子系统,来提(jiang)高(di)员工的工作效率。

有个电子系统,我们每周都要填报一些东西,不填可能还会影响奖金,尽管有些人会提醒,但以为自己之前填了结果没填就还是跪了。。。

本着不断改(hua)进(shui)的念头,我用了一些上班时间,写了个chrome的插件,功能非常简单:可以定时刷新自己目前有没有填写这个表,以前一直没学过,这回稍稍学习了一下chrome插件的开发方法。

因为我厂的信息安全策略,显然我是不可能有代码的。分享一些关于插件开发的经验,找点栗子来举。

0x01 Start!

同样的,在学习一样东西时,我想先看官方文档,然后再找找有没有中文,拿点栗子来学习学习。不过谷歌官方的文档不出意外地。。。墙了。

不过搜了些博客稍微了解了以后,发现有个360的插件扩展开发文档,正好是用来开发chrome插件的,因为他的所谓的”极速浏览器“其实就是chrome的内核,文档还不错,还是中文的,上手比较快。

http://open.chrome.360.cn/extension_dev/overview.html

0x02 功能:查询显示状态

我在公司做的插件是做查询状态的工作,基本思路如下:

定时访问一个页面->查看其中内容的状态->回显在插件的图标上

一个插件必须要有一个manifest文件,做一些全局的配置;一些html+js文件,用来实现插件想要的逻辑;还可选有一些资源文件如图片等来丰富页面效果的内容。

在这里也是将360那个文档稍作一个二次消化,文档中也有一些chrome官方的例子可以下载。

 

0x03 跨域

因为background页面的域是在本地的,如果想从background页面上通过javasccript提交请求到你想要的页面,例如我们想要查询的是一个微博好友,其域就在weibo.com上。浏览器默认是不会允许这样的跨域访问的。(使用js的XMLHttpRequest跨域有点像CSRF攻击,设计上不允许)

这时候就需要给插件去申请权限,让其能够访问某地址内容的权限,这样就可以使用跨域访问了。

相应的,安装插件时就会提醒“这个插件将被允许在什么url上进行操作”,是不是有点像Android系统装应用时询问是否允许某项权限一样?哈哈,谷歌设计这两个东西的思路是一样的。

因此,在使用chrome时尽量使用chrome应用商店的插件,不要信任来路不明的插件,需要看看允许访问的url有哪些。打开开发者模式安装不是自己开发的插件是具有很大风险的。当然,如果这个插件的源码全都被吃透了,确保没有问题,那才可以使用。

0x04 浏览器存储

因为是个状态查询的插件,所以有可能需要浏览器开的时候才起作用,有的时候周期并不会很长,而且也不是时时刻刻都保存着一个合法的会话cookie。所以我想让关掉的时候储存之前查询的日期和状态,好在chrome支持HTML5的LocalStorage属性。

原理也十分简单,就是存储在浏览器文件里了,每一次的浏览器打开都会重新载入之前序列化后的localStorage,这样就可以避免被消除。

0x05 未探索的content script

因为做查询插件没有做content script,这一部分功能相当强大,就是可以生成一些“钓鱼网页”,在原网页loading完后跟着执行content script,这样就可以按照开发者想要的方式来改变页面原来的呈现形态,包括执行任意的js脚本。

这个功能可以用来优化一些浏览时的体验,比如以前大家在大学时期,选课系统总会做得稀烂,点进去才发现已经没名额了,这时候嵌入了一些脚本执行一些异步调用,马上将还有名额的课程显示在页面上。就是用的这个原理了。

python官方文档阅读笔记[1] 字符串的format 正则表达式

目前读到standard library 关于字符串和正则的部分,这一期主要讲述一下python中的字符串format和正则,我认为是较为精华的部分。如果只是对那些知识进行罗列,或者直接拷贝,那我觉得是违背一个博客的初衷的。我将官方文档的内容进行了一小点的二次加工,所以可能会有问题,也请看官看到的能够指正,谢谢。

看的是2.7版,链接 如果需要看正解,务必以官方文档为准。

https://docs.python.org/2.7/library/strings.html

以下主要我会讲解冷门的例子中的一些解释,注重一下实践中的学习:

  • 字符串的format各进制的整数的输出的例子

[code lang=”python”]
>>> width = 5
>>> for num in range(5,12):
… for base in ‘dXob’:
… print ‘{0:{width}{base}}’.format(num, base=base, width=width),
… print

5 5 5 101
6 6 6 110
7 7 7 111
8 8 10 1000
9 9 11 1001
10 A 12 1010
11 B 13 1011
[/code]

解释一下,使用带大括号的字符串使用string的format方法,每一个大括号的元素将会对应format中的参数。

0就会对应num width对应width base对应base
width永远是5,表示每次的输出字符串有5的宽度,使这些内容能够输出成表格形式,且默认右对齐。

如果有嵌套的大括号,其实就可以认为是一个不断迭代解开括号的过程,以第一行第一列为例,字符串即为’5:{width}{base}’.format(base =’d’, width = 5) 也就是5以有符号整数形式输出。其余的X为以16进制输出,o则是以八进制输出,b则是以二进制输出。

  • 正则表达式 capturing与non-capturing

正则表达式是一个伟大的发明,在文字处理时,可以做到使用一个很短的正则表达式表达一个复杂的逻辑来进行搜索、替换、匹配的操作,在编译过程中进行词法分析就经常可以用到正则表达式的一个方式。

python作为一个脚本语言,标准库中对操作字符串处理的正则表达式自然是十分强大而且方便,学习这一方面主要是2点,第1点是正则表达式的语法,想必这是每个程序员或者hacker的基本功,不仅适用于python,还适用于任何其他的变成语言和工具。第2点就是python的相关API的使用。

按照惯例贴上官方文档的链接,请以官方文档为准
https://docs.python.org/2.7/library/re.html

最简单的[]的用法,{,}的用法,|的用法,常用的后加个字母代表的意义也就不说了,今天主要讲讲capturing和non-capturing
使用(…)括起来的在很多情况下可以作为一个捕获型的子匹配,会将这个子匹配存在内存中,在这之后可以用num来引用这个匹配的字符串表示将这个字符串再重复一遍,达到一个动态变化的作用,可以用于如XML的标签的匹配上,而且还可以在Python使用时使用match对象中的group来对(…)中的内容进行提取。

但是在(?:…)这种写法中,这个正则表达式不会保存括号中的内容进行下一次匹配。

举个例子:
下列第一行中,abc标签用def闭合(不符合XML的语法,但是举例子),在匹配1时,会匹配捕获到的abc的内容,所以第一行中没有匹配上
第二行中abc标签闭合能与abc完美的符合。
第三行中,因为?:开始的字符串匹配不会进行存储,所以正则表达式匹配时在内存中根本没有1这个元素,所以造成了异常。
[code lang=”python”]
>>> re.match(r'<(abc|def)>.*</1>’,'<abc>content</def>’)
>>> re.match(r'<(abc|def)>.*</1>’,'<abc>content</abc>’)
<_sre.SRE_Match object at 0x0000000002A00288>
>>> re.match(r'<(?:abc|def)>.*</1>’,'<abc>content</def>’)

Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
re.match(r'<(?:abc|def)>.*</1>’,'<abc>content</def>’)
File "E:DevelopingPythonlibre.py", line 137, in match
return _compile(pattern, flags).match(string)
File "E:DevelopingPythonlibre.py", line 242, in _compile
raise error, v # invalid expression
error: bogus escape: ‘\1’
[/code]

 

 

python官方文档读书笔记[0] enumerate map with…open

根据之前定的计划,开始水一些小笔记,主要是为了给自己看,不是做教程,所以只选取一些以前不太了解的小知识。

代码高亮插件待配置

目前python官方文档扫了一遍Tutorial,然后开始看Standard Library built-in functions篇,有些以前不太熟但是感觉很有用的用法。

  • enumerate()函数 同时遍历元素和索引值

当我们遍历一个序列时,如果需要用到每一个元素的值时,习惯上会这么写:
[code lang=”python”]
>>> lst = [10,20,30,40]
>>> for elem in lst:

[/code]

当需要同时用到每一个iterator以及它的索引值时,就可以使用到enumerate()函数,将序列作为其参数,可以在每个iterator中产生(索引号,元素值)的元组,用法如下:
[code lang=”python”]
>>> lst = [10,20,30,40]
>>> for i, elem in enumerate(lst):

[/code]

  • map()函数用法 将一个或多个序列中的元素批量进行修改转化成新的序列B

map(func,seq1[,seq2…])

第一个参数func为一个函数对象,这个函数将运用在后续的seq1,seq2…中,map函数将会遍历计算return_value[i] = func(seq1[i],seq2[i],…) 形成一个新的序列。

通常会与lambda表达式一起使用,会使得程序代码量变得十分简洁。

举个例子吧:一个序列中全是整数,我想将这个序列的值全都乘以2
[code lang=”python”]
>>> l = [5, 10, 15, 30]
>>> map(lambda x:x*2, l)
[10, 20, 30, 60]
[/code]

  • with…open,一个资源释放方便的文件读写方式

一般在文件读写时python要使用open函数,然后进行读或写,还要记得使用close函数释放文件句柄,当大量文件句柄忘记释放,则会造成程序异常,资源耗尽的现象。

with…open实际上将一个文件的读写集中在一个try block中,并且当with…open语句结束后,文件句柄自然被释放,是一个较为安全、简洁的写法。

例子:
[code lang=”python”]
>>> with open(‘workfile’, ‘r’) as f:
… read_data = f.read()
>>> f.closed
True
[/code]

一点小愿望

最近看过一篇知道创宇的技能树列表,十分有意思

http://docs.huihoo.com/knownsec/Knownsec_RD_Checklist/v2.2.html

里面有一句提到了

  • Python
    • 官方手册
      • 至少过一遍,这都没过一遍,视野会局限
      • 行之说:「我没看过Python的书,却熟读官方手册……」

真是“无形装逼,最为致命”,不过我也是喜欢这种geek范的话。

我很喜欢这样的东西,一个技能树,可以把这一行要干的事列出一个outline。

我个人是一个非常技术导向的人,工作一年半了,总觉得现在工作位置的现实稍微有些压制了我技术的发展,就算我技术变得高超,并不会使我在现在的岗位上过得更好,不一定会得到提升和更多的绩效。现在的我,还是感觉有点弱,不能讲清楚自己的技能在哪,也不能讲清楚自己目前干了什么。假如说我能站得更高,就有更多可以看,人生有更多选择的空间。

周末在家胡混了一天,感觉又浪费了一天成为砖家的积累,看着自己1600小时的dota时间记录,想想要是拿一半时间出来应该已经能Get不错的一项技能了吧。要不也订个计划吧!让自己的生活过得充实一些,更好一些。应该有些技术的,也应该有些陶冶情操的。

技术砖家的养成计划:

  1. python官方文档(必修)   2个月内完成
  2. apache, nginx学习 源码阅读
  3. UNIX环境高级编程 网络编程 看书(必修) 3个月内完成
  4. gdb jdb pdb xxxdb的调试技能
  5. 想像的零食APP
  6. 常用Kali工具熟练运用,如MetaSploit

陶冶情操养成计划:

  1. 创作属于自己的漫画
  2. 学一种舞蹈
  3. 电影观摩影评
  4. 各种各样的DIY 泥塑
  5. 配音
  6. 恋爱

上面所说的,可能也不一定会做,我是一名懒癌患者。。。

想起来读书的时候,女生笔记总是记得很好,无论是学霸还是个学渣,都会把笔记做得很认真,因为买了本心爱的漂亮的本子,然后笔记做得好显得很“认真”的样子。

一样的,我列出这些计划,可能也只是为了装点这个作为我小黄鸭的博客吧。如果有些不错的心得,我可能会写在这里的。

 

 

大家好,我是倪思宇

大家好,我是倪思宇,是一个普通的IT从业者,这是我的博客。

比较懒,以前开过一个博客,感觉好像没什么可写的,于是欠费停机了,最近突然觉得想要做些什么,想要提升一点姿势水平,捣鼓捣鼓一下VPS,也是想要留点东西给自己看看。然后可能把自己的一篇篇naive的东西私密吧,蛤蛤。

没有做什么皮肤,也许以后会自己搞个博客系统,也许也不会。。。难说。。。

之前看到过一个叫“小黄鸭调试法”的东西,我想:这里的博客我不说估计也没人看得到,虽然域名就是我的名字。。。就把这里作为我的小黄鸭,让它不厌其烦地听听我的一些感想吧。