AVL树Insert与Delete函数分析(C++)
最后更新时间:
插入函数Insert
先放一下代码。因为是照着黑皮书《数据结构与算法分析》学的,所以代码大致和书上的一样,我并没有做太多修改。只是在理解原理的时候有些比较棘手的地方,所以在这里记笔记,方便以后查看。
+}AVL树Insert与Delete函数分析(C++)
Last Update:
插入函数Insert
先放一下代码。因为是照着黑皮书《数据结构与算法分析》学的,所以代码大致和书上的一样,我并没有做太多修改。只是在理解原理的时候有些比较棘手的地方,所以在这里记笔记,方便以后查看。
1 |
|
如果你也有这本书,并且已经看过这一部分关于avl的描述了,那么关于“什么是avl树”以及这些代码的作用至少是明白的,这里我主要是对书中所写的insert函数做些笔记。
@@ -113,7 +113,7 @@其他情况也是相同,判断是否旋转,并判断应该选择哪一种旋转。
且在每一轮的递归里,都重新计算了高度。
至此,整个函数完成了删除节点的全部流程。
-
灰与鹿糜
最后更新时间:
路边破碎的玻璃瓶里积满了昨天下过的雨,折射出上个世纪以来不曾改变的炫目的光。在梦境边际急转回旋的羽翼开始焦黑,可即便坠入深海,却在刻薄的海水包围下被焚烧殆尽。一切都不过如盛夏的烟花般绚烂而短暂,晦涩的字句会被吞进幽深大海,如灰烬一般悄然盛开。
+}灰与鹿糜
Last Update:
路边破碎的玻璃瓶里积满了昨天下过的雨,折射出上个世纪以来不曾改变的炫目的光。在梦境边际急转回旋的羽翼开始焦黑,可即便坠入深海,却在刻薄的海水包围下被焚烧殆尽。一切都不过如盛夏的烟花般绚烂而短暂,晦涩的字句会被吞进幽深大海,如灰烬一般悄然盛开。
上个世纪的惨剧酿成了现在这副绝景——满城的寂静与颓然。就连空气都如猛毒般剧烈,呼吸也沦为苦难。即使灾难与厄难都已经远去,这里仍被所有人抗拒。异变的巨鼠分明早已灭绝,疯长的藤蔓也已被拔除,可即便满城堆积的繁茂且多余的饰品已被清除干净,卸下了那副臃肿丑陋的样貌,异物还是异物。
土墙上透风的孔正如这个萎焉的国家,再无余力重建灯火与宫阙。这里早已是我们的乐园,是不受拘束的乐土,更是没有催债人嘶吼与殴打的伊甸。全国各地的流浪者都涌向这里,让卑劣与低贱在这里流行起来。
靠吞服安眠药睡去的日子也慢慢远去了,它们渐渐不再起效。我每日每夜都在期待再也不会醒来的日子到来,但这十年来一次也没有发生。背包里装着一叠又一叠的相片,是这数十年来徒步旅行中的各类见闻,可直到它们全都泛黄了,我也没能拍下任何一张能令自己满意的风景。我几欲烧掉这些不能为我换来哪怕半块面包的东西,但又觉得毫无意义,终究还是最为窝囊的维持着现状。
@@ -104,7 +104,7 @@落叶与大地寻往自由,枯干托起沉重;卸下纠缠的层层泥土,埋没银怀表。
何故要去留恋与土地纠缠的岁月,又何故愿被修剪枝叶?拔去利刺的荆棘与藤蔓何异,可这雨林容不下尖刺与棘。它那垂下的荆条向着无害的方向进化,顽固则被卸除,装作理智的绵羊将要复苏,悬空终要回归大地……
他拥抱坠落的废墟,被埋进泥海;曾到往星海的瓦砾,携不来半片星骸。淌出的青汁汇入沟壑,鼓动如岩浆蔓延。纷争亦不过是风化的褐岩,没有我所写下的一切。
-泯痕卸负
最后更新时间:
此刻,独自伫立于雨中的他,被锁在了积水交汇的低洼。雨丝从天空坠落,将他的皮肤寸寸割裂,数不清的鲜红于寒雨坠落处喷涌,最后一并汇聚于脚下。疼痛、疲乏,它们一并交融聚合,然后溃灭消散。
+}泯痕卸负
Last Update:
此刻,独自伫立于雨中的他,被锁在了积水交汇的低洼。雨丝从天空坠落,将他的皮肤寸寸割裂,数不清的鲜红于寒雨坠落处喷涌,最后一并汇聚于脚下。疼痛、疲乏,它们一并交融聚合,然后溃灭消散。
长久以来,这座荒凉的小镇已经被遗弃了不知道多少年。在岁月的无情冲刷下,没有人能够再次想起这里,就连旧迹也在时光折磨之下逐渐溢散。也许在不久的将来,小镇就会从这荒唐的故土消失吧。
寒风过境,掀起阵阵沙土,似要以此淹没小镇。远方,孤身一人的旅者行走在这片荒凉的土地上。寒风刮起一阵尘土,将旅人的视线遮蔽。他用手挡下迎面扑来的风沙,透过指缝,将视线投向了寒风远去的方向,于土丘被掀开的空隙,一座孤镇映入瞳孔。在它将要消逝的最后一刻,迎来了它的最后一名旅人。
寒风催促着旅人快些进入古镇,可旅人却始终迈着沉重的步伐缓步前行着。他的背上背负了太多行李。此生积累的所有错误与已经腐烂的尸骸,他都不舍得丢弃。本就举步维艰,却能够拖着沉重的步伐移动,真是十分了不起的觉悟。凭借着心中的执着,他踏入了这座古镇的最后一刻。
@@ -35,7 +35,7 @@森雨闪烁着寒芒,仍在他的身上留下密密麻麻的骇人的血孔。他的身体终于不堪重负,被压垮在水洼里。狂风撕咬着小镇的血肉,让它再无法继续维持自己的存在。旅人同样也被啃噬殆尽。尽管吞食这毫无营养的血肉没有任何意义,但在这荒凉的土地上却也不会再有别的美餐了。
血肉渐渐从枯干上被剥离,暴露出灰色的骨架;意识早在此前的苦难中被抹杀,留存下的仅剩肮脏的本能。身上的重负终是被他卸下,可谁都没有将它们断罪。是啊,它们同旅人和小镇一起消逝在时间的洪流里,所有的痕迹都被抹杀殆尽。又有谁是不能原谅的可怜虫呢?
雨停了,久久不见天日的故土终于重见天日。本应立于土丘之上的某物,如今却与土丘融为一体;本该有一位旅人来过此处,如今就连行囊也不见了踪影。即便乌云褪去,阳光洒在故土之上,也再无能够得见天空的旅人,与其所背负的沉重……
-通感症Synaesthesia
最后更新时间:
X001
+}通感症Synaesthesia
Last Update:
X001
当我从战场上归来的时候,躯壳几乎难以容纳灵魂。浑身上下,除却头部以外净是血洞,鲜血止不住地向外涌出,聊胜于无的绷带试图留住它们,也不过是毫无意义的徒劳。
我艰难地向着故乡的方向走去,但双腿却无论如何也迈不出去。刚抬起来,又落下去,拄着拐杖的手也颤抖不止,鲜血顺着手臂从拐杖上滑落,将它染成了残阳的颜色。就连猩红与赤红都难以区分的我,坚持这种神志不清地逃亡又能持续到何时呢?
脚边偶尔传来的阵沙沙声让我越发的烦躁,可我就连低头的力气都没有了。我担心自己一旦低下了头,就再也抬不起来了。身体轻盈如纸,感知却沉重如山,我略感欣喜,却愤怒不已。也许我会因身体前所未有的轻盈而喜,又可能会为此刻的寸步难行而怒。就连精神都被着残阳炙烤到歪曲,我想,我也许只能到此为止了。
@@ -178,7 +178,7 @@我打算离开了,再不要留在这里同他一起风化。为了方便起见,我将那副镣铐戴在了自己的左臂上。不带半点怜悯,没有丝毫犹豫,径直离开了沙漠。不被挽留,不假思索,我回到了那座工房,我回到了故土。我的愿望破灭了,我的愿望实现了。
X000
你可以尽情地嘲笑我,我很清楚自己的分量。我既是那片伊甸的创造者,亦是那里的神。可只有我没能得到它的入场券,只有我不被允许逃进那片伊甸,没有人会为我指路,亦无人肯为我立墓。
-记python2安装Opencv-python库报错解决方案
最后更新时间:
报错信息:
+}记python2安装Opencv-python库报错解决方案
Last Update:
报错信息:
调错思路:(感谢群里师傅提供的帮助)
echo $EXT_SUFFIX
@@ -27,7 +27,7 @@反思:
最终只是修改了一下安装的版本便不再报错,算是明白看不懂报错信息是多么致命的缺陷了…..
个人并没有细究python的种种,平日也很少用到这一语言。这次的错误算是给自己一个教训吧,总之要先把错误报告看懂,再思考怎么解决……
-红葡萄酒之疫
最后更新时间:
序言:
+}红葡萄酒之疫
Last Update:
序言:
这个故事发生在一座名为“瑞蒂克洛斯”的城市。那里具体发生了什么我也不太清楚,但我有幸目睹了那场混乱的片段(我并不太清楚到底从哪个时间点开始才能算作算开端,所以不清楚自己是否得知全部的细节)。我既是旅人也是小说家,但本职或许是个记者,偶尔会写写报道和小说什么的,于是我觉得自己应该为这个人写点什么。哪怕我既怠惰又无能,也想把这份不被称为艺术的艺术留下。于是,就有了这么一则灰白色的故事。
正文:
认识他的人,都说他是败类,是人类的残渣,可事实上,谁都没有这么说过。人们从没把他当一回事,只是热衷于对他犯下的恶行进行批判罢了。或许,这就是这座城市的潮流。
@@ -59,7 +59,7 @@我们并没有碰过面,更没有实际交流过。或许这一切都只是我的臆想和愿望,希望他是我所期望的人,但这都无关紧要。我毕竟没能与他讨论艺术,自然也不可能明白他所期望的结局是什么样的,但他的作品无论有我没我,都早已完成了。哪怕多出这么一片关于他的故事,想必也不会有任何改变吧。
只是我在那之后很快就离开了那里,由的于工作原因,我必须漂泊于世界各地,于是他的照片迟迟没能发布,现在也被珍藏在瑞蒂克洛斯——他曾经的住所中。
——糜鹿手记
-散列Hash
最后更新时间:
注:学习过程参照《数据结构与算法分析——C语言描述》,虽然我个人是用C++实现,但代码大致上与书中一致。如果您发现了某些错误,欢迎指正。
+}散列Hash
Last Update:
注:学习过程参照《数据结构与算法分析——C语言描述》,虽然我个人是用C++实现,但代码大致上与书中一致。如果您发现了某些错误,欢迎指正。
[toc]
一种映射方式。给定一个关键字,将它映射到一张表上对应的单元格。这里展示一种Hash函数:
1 |
|
1 |
|
很好理解的,书上给的代码相当易懂,就不解释了。
-优先队列(堆)
最后更新时间:
学习过程跟进《数据结构与算法分析》,主要代码大致与树种例程相同,若有疏漏或错误,请务必提醒我,我会尽力修正。
+}优先队列(堆)
Last Update:
学习过程跟进《数据结构与算法分析》,主要代码大致与树种例程相同,若有疏漏或错误,请务必提醒我,我会尽力修正。
目录:
SQL注入相关
最后更新时间:
本篇文章转载自:https://www.anquanke.com/post/id/205376#h2-0
+}SQL注入相关
Last Update:
本篇文章转载自:https://www.anquanke.com/post/id/205376#h2-0
对SQL注入的学习结束后将会对本文进行改编和补充,届时将会重新发布自己编写的版本。
//————————————–//
[toc]
@@ -442,7 +442,7 @@相当于访问了select database().子域名.dnslog.cn,于是会留下DNSLOG记录,可从这些记录中查看SQL返回的信息。 -
常用命令 与 其他注释
最后更新时间:
因为网上各种各样的笔记都不如自己写一遍来得方便查阅,所以按照自己的喜好整理一下汇编的笔记。目前跟着Kip Irvine的书才学到第六章(条件跳转),所以再之后的笔记暂时保留,等之后学完了再整理吧。
+}常用命令 与 其他注释
Last Update:
因为网上各种各样的笔记都不如自己写一遍来得方便查阅,所以按照自己的喜好整理一下汇编的笔记。目前跟着Kip Irvine的书才学到第六章(条件跳转),所以再之后的笔记暂时保留,等之后学完了再整理吧。
部分表格来源于:
https://blog.csdn.net/qq_36982160/article/details/82950848
插图ID:87882344
@@ -340,7 +340,7 @@1 |
|
排序Sort(代码与笔记)
最后更新时间:
[toc]
+}排序Sort(代码与笔记)
Last Update:
[toc]
插入排序:
1 |
|
堆排序:
1 |
|
PE结构详解
最后更新时间:
本篇笔记以我个人能够理解为基础,尽可能将其写成其他人也能明白的笔记。如果发现其中存在错误,请务必指正。
+}PE结构详解
Last Update:
本篇笔记以我个人能够理解为基础,尽可能将其写成其他人也能明白的笔记。如果发现其中存在错误,请务必指正。
范本与工具:010Editor & Notepad.exe & kernel32.dll
PE文件种类:
种类
@@ -148,7 +148,7 @@1 |
|
1 |
|
UPack PE文件分析与调试
最后更新时间:
参考文章:https://blog.csdn.net/learn112/article/details/112029389
+}UPack PE文件分析与调试
Last Update:
参考文章:https://blog.csdn.net/learn112/article/details/112029389
您可以将本篇文章当作该参考文章的拓展版、翻译版、压缩版,总之算是结合之后自己上手的过程记录。若您发现文章中出现错误,请务必指正。
封面插图id:81508349
范例:notepad_upack.exe
@@ -68,7 +68,7 @@在图示附近存在存在一个大循环,观察堆栈信息猜测其为程序的解码过程。
Ctrl+F7自动步进调试,最终卡在该处。将数据循环写入ESI当前位置,判断其真的是一个解码过程。至此完成调试。
-内嵌补丁 与 洞穴代码分析案例
最后更新时间:
示范案例:unpackme#1.aC.exe,学习过程参照《逆向工程核心原理》
+}内嵌补丁 与 洞穴代码分析案例
Last Update:
示范案例:unpackme#1.aC.exe,学习过程参照《逆向工程核心原理》
如您发现了某些错误和不规范,请务必指正。
插画ID:85939258
内嵌补丁:
@@ -60,7 +60,7 @@该文件完成补丁。
注:
还存在一个问题。在实际调试过程中,反调试极有可能出现异常导致中断。原因出自于覆写字符串这一行为并不具有权限,因此调试很可能停在rep movsb上。将文件可写打开之后发现并没能解决问题。解决方案在得到答案后将会补齐。
-XXTEA加密流程分析
最后更新时间:
插图ID:87326553
+}XXTEA加密流程分析
Last Update:
插图ID:87326553
代码与图解来自:https://www.jianshu.com/p/4272e0805da3
对于我这种相关知识欠缺的人来说,光是如此有些难以理解,因此基于该作者的图片与代码试着分析了一下实际的加密过程(也因为网上没能找到具体的文字描述过程,甚至图解的字符解释也没有,所以只能自己对着代码分析了)。
图解:
@@ -63,7 +63,7 @@1 |
|
Linux学习笔记
最后更新时间:
常规命令格式:command [-option] parameter1 parameter2 ……
+}Linux学习笔记
Last Update:
常规命令格式:command [-option] parameter1 parameter2 ……
文件列表格式:
[-rwxrwxrwx] 链接数 文件拥有者 所属用户组 文件大小 最后被修改时间 文件名
第一节为十个字符,rwx分别表示“可读”“可写”“可执行”,后九个分别表示三个用户组所拥有的权限。第一个字符表示文件类型(d-目录/“-”-文件/l-链接文件/b-设备/c-端口设备/)
@@ -100,7 +100,7 @@放置共享文件的地方,在这个目录下放置的数据几乎是不分硬件架构均可读取的数据, 因为几乎都是文本文件嘛。在此目录下常见的还有这些次目录:/usr/share/man:联机帮助文件/usr/share/doc:软件杂项的文件说明/usr/share/zoneinfo:与时区有关的时区文件
/usr/src/
一般原始码建议放置到这里,src有source的意思。至于核心原始码则建议放置到/usr/src/linux/目录下。
-《IDA权威指南》 Note
最后更新时间:
插图ID:87390511
+}《IDA权威指南》 Note
Last Update:
插图ID:87390511
笔记主要用作字典,记录仅为了方便自己的查阅
调用约定:
1 |
|
热键D:将代码转换为数据(可类似字符串),也可用于修改一定义数据的类型
热键G:跳转至目标地址
热键U:取消当前定义(当IDA错误的将某些数据视作了函数,使用该方法可以修正这种错误)
-红羊幻梦——随笔杂记
最后更新时间:
匙站在塔罗拉那一望无际的荒原上,这里既没有彩虹,也没有牛羊。有的只是那些乏味的黄褐色枯草和望不到边际的腾跃着尘埃的彼方。他从未离开过塔罗拉,好像双脚扎根在这片贫瘠的土地上,动弹不得。
+}红羊幻梦——随笔杂记
Last Update:
匙站在塔罗拉那一望无际的荒原上,这里既没有彩虹,也没有牛羊。有的只是那些乏味的黄褐色枯草和望不到边际的腾跃着尘埃的彼方。他从未离开过塔罗拉,好像双脚扎根在这片贫瘠的土地上,动弹不得。
可是现在,他终于打算离开这里了。他的父母早在数年前离世,而他的妻子也在上个月病逝。他的牵挂已经全都断裂,若孤魂野鬼、亦或游离的躯壳,他现在只想出去散散心,找个僻静而安逸的地方,就此结束这平庸而无谓的一生。
塔罗拉的人们都习惯把自己葬在这片荒漠里,他们虔诚地信仰着塔罗拉神,相信自己的死亡是回归大地的仪式。于是,满眼都是墓碑,四周净是坟墓。触手可及的漆黑石碑早已被风化,有些未曾相识的人的姓名也不可辨认;那些隐现在尘埃的薄纱中的小小石碑,好像在烈日的灼烤下跳起癫狂的舞。或许这在旁人眼中是一片萧条,但塔罗拉人都觉得——这就是繁荣。
抽出一截风蚀裸露的白骨,祭拜其原主之后,匙拄着它继续前行。
@@ -40,7 +40,7 @@身体与双腿离异,黄沙灌入瞳眸。胸腔塞满了被卷入尘暴的各式各样的碎屑,腕关节脱臼、膝关节失踪、踝关节龟裂、鼻梁骨错位。视界中的一切都开始退化,金黄色的暴风被涂成血红,口腔里是沙砾与腥甜的味道。
涂抹了一遍又一遍的凄惨,一截落在了妻子的墓旁,另一截不知所踪。
不过是多了一座不完整的墓碑,与一场不完整的回归。
-BUUCTF-RE-SimpleRev笔记与思考
最后更新时间:
封面ID: 89209550
+}BUUCTF-RE-SimpleRev笔记与思考
Last Update:
封面ID: 89209550
背景:
初学逆向,遇到的最大问题是“在知道原算法的情况下要如何得出逆算法”;一般的加减乘除确实只需要做相反操作即可,但对于异或和取余等运算则有些麻烦,于是试着写一些可能的解决方案。似乎是数论的内容,但题主目前还未学到那种程度,诸多密码学内容尚且不明,所以以后再作更新。
@@ -59,7 +59,7 @@
这些字符明显和结果是逆序的,由于我是直接抄出了join函数的实现所以做题的时候并没有遇到这个问题,但事后才发现还有还存在这种问题。
起因来自Intel架构中的小端序存储方式,具体内容不在此赘述,从结论上来说便是所看到的与实际结果将成逆序。
-BUUCTF - Youngter-drive笔记与思考 (线程)
最后更新时间:
插图ID: 89210183
+}BUUCTF - Youngter-drive笔记与思考 (线程)
Last Update:
插图ID: 89210183
Ⅰ. 解题步骤(省略细节的描述)
Ⅱ. 知识拓展(对各函数作用进行解释)
Ⅰ.
@@ -69,7 +69,7 @@一个进程将被加载入一块虚拟内存,而其创造的所有线程都能够访问虚拟内存的任何地方
也就是说,线程的虚拟内存总是共享的;相反的,其寄存器从不会共享,不同线程无法调用其他线程的寄存器
既然虚拟内存是共享的,也就是说,每个线程的栈堆是共享的;只要线程能够获取其他线程的指针,就能够调用该线程的栈堆(由此也可推出:将一个线程中的变量入栈,则其他线程便能够调用它)
-GWCTF 2019 - xxor 笔记与思考
最后更新时间:
插图ID : 85072434
+}GWCTF 2019 - xxor 笔记与思考
Last Update:
插图ID : 85072434
对我这种新手来说算是比较怪异的一题了,故此记录一下过程。
解题过程:
直接放入IDA,并找到main函数,得到如下代码(看了一些其他师傅的WP,发现我们的IDA分析结果各不相同,最明显的就是HIDOWRD和LODWORD函数,该差异将在下文分析)
@@ -78,7 +78,7 @@
-加壳原理及实现流程与导入表结构分析
最后更新时间:
封面ID : 89322214
+}加壳原理及实现流程与导入表结构分析
Last Update:
封面ID : 89322214
前言:
笔者在学习制作软件外壳之前,一直对这种技术抱有过于简单的看法——即所谓的壳就是将代码段加密之后,往新节区写入解密代码并让OEP转为新节区处。
总体来说,这种解释并没有什么问题;但这种认识却是非常片面也过于简单的,以至于在实现的过程中接连发生了许多难以预料的问题。这些问题将在本篇下方逐一解释。
@@ -107,7 +107,7 @@九阳道人:
-WUSTCTF2020-level3 笔记与自省
最后更新时间:
+}WUSTCTF2020-level3 笔记与自省
Last Update:
解题过程:
直接放入IDA分析,跳入main函数,得到如下内容
1 |
|
所以最后还是自己瞎忙活一通,算是吃个瘪长个教训吧……
插画ID:89345225
-Zer0pts2020 - easy strcmp 分析与加法
最后更新时间:
+}Zer0pts2020 - easy strcmp 分析与加法
Last Update:
无壳,放入IDA自动跳到main函数
1 |
|
相差正好为66;因此结果也变得显然了:
字符串大数相加的实现为:将大数做成多个字节,将每个字节与对应的字符串字符相加(指相同字节位对齐相加,多者溢出)
插图ID:90683044
-2019红帽杯 - easyRE 分析与自省
最后更新时间:
+}2019红帽杯 - easyRE 分析与自省
Last Update:
稍微……有那么一点离谱
程序无壳,可以直接放入IDA,通过字符串找到如下函数:
1 |
|
从此得到flag
这次我该吸取的教训是:不要因为事情看起来复杂就认为考点不在这里
插画ID : 90097136
-2019红帽杯 - childRE 分析与拓展
最后更新时间:
+}2019红帽杯 - childRE 分析与拓展
Last Update:
十分特殊也有趣的一题,特此记录。流程并非难以理解,但有些需要注意的点。
无壳,可以直接用IDA分析,但由于存在一些动态变量,一旦开始动调,代码将会变得更难理解,因此目前只用静态调试来审计
1 |
|
个人觉得这要比我手绘二叉树来得简单得多,供参考吧
插画ID:90581839
-BUUCTF - 网鼎杯 2020 青龙组 - jocker 分析与记录
最后更新时间:
+}BUUCTF - 网鼎杯 2020 青龙组 - jocker 分析与记录
Last Update:
无壳,IDA打开可以直接进入main函数:
第12行调用VirtualProtect函数更改了offset encrypt处的访问保护权限
@@ -89,7 +89,7 @@我也试着将这个提交成功的flag输入进去,但它仍然不会输出成功的标识,可能是出题人的一点“恶意”吧……最后要靠猜测来得到结果,说实在的,有点难以释然,总觉得是不是自己看漏了什么重要内容……
插画ID:90713460
-Chaconne
最后更新时间:
她走了,走的毫无征兆。又或许,我早就知道会有这么一天了,只是我们谁都没料到,这一天会来的这么早。一切都如往常一样,青藤仍旧攀进窗沿,昙花今天也未盛开,只有她不在了。
+}Chaconne
Last Update:
她走了,走的毫无征兆。又或许,我早就知道会有这么一天了,只是我们谁都没料到,这一天会来的这么早。一切都如往常一样,青藤仍旧攀进窗沿,昙花今天也未盛开,只有她不在了。
我知道她的绝望,也知道她的无助,但即便如此,我也仍然无能为力,又或许,是我仍然无动于衷。我甚至能够直视她所有的痛苦,亦能够如我所见的那样存活,但我就像毫无选择的孩童那样,只能看着她沉沦,就同过去的我一样。这无疑是傲慢而又无耻的,因为我本以为一切都会如我所希望的那样发展,哪怕这就像是趁人之危。可我却一败涂地,一切都没能如愿,她仍旧离开了,再也回不来了。迟早有一天,我会忘掉这一切,忘掉所有该被珍视的记忆,也忘掉所有被我珍藏的宝物;健忘的人从来没有珍视的过往,所有的过去都同脊岩那样风化,沦为我脚下的齑粉,褪去原本的颜色,最后被我当作垃圾舍弃。但似乎一切又都如她所期望的那样,我将不再记得有关她的任何事。我似乎不会再痛苦了,却也因此忘记了自己为何心有不甘,那久久盘旋的苦涩又为何物。那我该作何反应呢?理智几乎麻痹了神经,哪怕我本就忧郁而悲伤,却也不会再添加任何杂质;却又似催促一样,告诉她我毫不介意。
我……我没能救她。哪怕我从来不将活着视为一种救赎,却也不会把那缺乏美感的死亡当作拯救。而即便如此,我也希望她能活下来,哪怕她已经和那时候的她大相径庭,正如我当时的苟且。我本期望她能得救的,正如我期望她能秉持她一如既往的正确一样。但她却被自己的正确压垮了,被所有错误和凶恶迫害了。我读过她的诉状,我听过她的控诉,用我卑鄙而肮脏的话术骗取了她的信任,让她能够向我倾诉。她曾问我是谁,“稻草人”,我是这样回答她的,正如草人那样的虚妄之物,我不过是个伪物,是麦田里装作人类的赝品罢了。她也曾问我出于何种目的对她如此友善,可答案就连我自己都不知道。或许是为了满足我那散发恶臭的伪善,又或许是为了见证戏剧性的颠转,也可能只是因为常年的孤独有了同伴,又或是……可它们无疑都是真实的,哪怕它们的宿主是虚伪的稻草人。这些混乱的自我杂揉在一起,本该明朗的目的也变得混浊,变成口中断断续续的措辞和闪躲的话语。
那么事到如今,我又在做什么?我像是在纪念她,装作为她的离去而痛哭流涕的样子。这是她一生都未曾见过的模样,是目前的我所能够展现出的最为脆弱、也最为痛苦的模样。我一反常态地不再维持理性地外貌,仍由另外一个自己在她的坟前发疯般地恸哭,任凭泪水浸湿稻草,苦涩与麻木的回甘翻涌于胃袋。时隔一年,我变回了那个无知而又懦弱的自己,不再装作无所不知,也不再装出一幅谦虚的皮囊,被过去的傲慢和偏激寻回,也拾回了偏见和歧视。我喝得烂醉,倒在街角的灌木丛背后,说着那些她最不愿意听到的,盛满卑劣的话语。我又开始对那些不了解的政见评头论足,再一次为了地上的五角钱和乞丐大打出手,邋遢而满脸胡茬,又一次成了她最无法想象的那种人。
@@ -25,7 +25,7 @@我只能看着她被压垮,就像过去的我那样。可她死在了无垠的荒原上,那里既没有麦田也没有极光。稻草人今天守在她的墓旁,稻草人明天守在她的墓旁,只是总有一天,稻草人会忘记这些往事。他会离开这片荒原,再一次与乌鸦作伴,用他最擅长的骗术把这些往事掩盖,藏到极地的冰窟里,埋在昏黑的极夜里。直到极光来的时候,一如我没能救她,我也走失在那片荒原,我也坠向深空,我也……
毫无征兆的,稻草人烧起来了;如约而至般,我……没能救她。
插画ID : 90581793
-第五空间2019 决赛 - PWN5笔记与借鉴
最后更新时间:
逻辑是简单的:
+}第五空间2019 决赛 - PWN5笔记与借鉴
Last Update:
逻辑是简单的:
系统生成一个随机数,并让用户分别输入用户名与密码,当密码与随机数相同时成功。
大佬给出的思路:
思路1:直接利用格式化字符串改写unk_804C044之中的数据,然后输入数据对比得到shell
@@ -35,7 +35,7 @@第二个参数则是原值与替换值的字典形式
还有第三第四参数,但并不常用,暂时不记录
插画ID:90640803
-GKCTF 2021 - checkin调试与分析
最后更新时间:
+}GKCTF 2021 - checkin调试与分析
Last Update:
目前笔者刚刚开始入门PWN,算是通过这题涨了点见识吧
主要函数:
1 |
|
[原创]pwn中one_gadget的使用技巧 :https://bbs.pediy.com/thread-261112.htm
gdb的基本命令:https://blog.csdn.net/qq_26399665/article/details/81165684
插画ID:90726137
-关于如何理解Glibc堆管理器(Ⅰ——堆结构)
最后更新时间:
+}关于如何理解Glibc堆管理器(Ⅰ——堆结构)
Last Update:
本篇实为个人笔记,可能存在些许错误;若各位师傅发现哪里存在错误,还望指正。感激不尽。
若有图片及文稿引用,将在本篇结尾处著名来源。
首先从 什么是堆 开始讲起吧。
在操作系统加载一个应用程序的时候,会为程序创建一个独立的进程,这个进程拥有着一套独立的内存结构。大致结构如下图:
@@ -67,7 +67,7 @@https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/
插画ID:72077484
-关于如何理解Glibc堆管理器(Ⅹ——完结、补充、注释——Arena、heap_info、malloc_*)
最后更新时间:
+}关于如何理解Glibc堆管理器(Ⅹ——完结、补充、注释——Arena、heap_info、malloc_*)
Last Update:
本篇实为个人笔记,可能存在些许错误;若各位师傅发现哪里存在错误,还望指正。感激不尽。
若有图片及文稿引用,将在本篇结尾处著名来源(也有置于篇首的情况)。
截至到本节内容,该系列算是正式完结了,后续或许会有补充,但基本上都将添加在本节内容中。在前几节中,笔者已经按照自己的思路尽可能详尽的将Glibc的堆管理器Ptmalloc2的方式做了一定的介绍,尽管Ptmalloc2的内容肯定不止这些,但已能大致了解其工作方式了
@@ -98,7 +98,7 @@Ar
当然,实际调试中会发现,我们开辟的chunk总是在Arena下方(往高地址处),我们也可以将其理解为每个线程自己的一个“主堆”,这样就能避开那些“可以不使用堆锁的情况”
插画ID:91629597
-关于如何理解Glibc堆管理器(Ⅱ——Free与Bins)
最后更新时间:
+}关于如何理解Glibc堆管理器(Ⅱ——Free与Bins)
Last Update:
本篇实为个人笔记,可能存在些许错误;若各位师傅发现哪里存在错误,还望指正。感激不尽。
若有图片及文稿引用,将在本篇结尾处著名来源。
Free与Bins:
malloc如果一旦和free混用,情况就变得复杂了。我们可以先思考一下下面的问题:
@@ -91,7 +91,7 @@https://nightrainy.github.io/2019/05/06/glic%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#bins
https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/
插画ID:90945914
-关于如何理解Glibc堆管理器(Ⅲ——从DoubleFree深入理解Bins)
最后更新时间:
+}关于如何理解Glibc堆管理器(Ⅲ——从DoubleFree深入理解Bins)
Last Update:
本篇实为个人笔记,可能存在些许错误;若各位师傅发现哪里存在错误,还望指正。感激不尽。
若有图片及文稿引用,将在本篇结尾处著名来源。
环境与工具:
Ubuntu16.4 / gcc / (gdb)pwn-dbg
@@ -104,7 +104,7 @@ 这个实际结果与上一章所述相同。在第12行代码中,堆管理器检查Small Bins发现可用,分割该chunk分配给 p5,并将该chunk取出Bins。
引用:
https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/implementation/free/#_3
插画ID:90981187
-
关于如何理解Glibc堆管理器(Ⅳ——从Unlink攻击理解指针与chunk寻址方式)
最后更新时间:
+}关于如何理解Glibc堆管理器(Ⅴ——从Large Bin Attack理解malloc对Bins的分配)
最后更新时间:
+}关于如何理解Glibc堆管理器(Ⅵ——从House of Orange理解Heap是如何被拓展的)
最后更新时间:
+}关于如何理解Glibc堆管理器(Ⅵ——从House of Orange理解Heap是如何被拓展的)
Last Update:
本篇实为个人笔记,可能存在些许错误;若各位师傅发现哪里存在错误,还望指正。感激不尽。
若有图片及文稿引用,将在本篇结尾处著名来源(也有置于篇首的情况)。
参考文章:
https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/house-of-orange/
@@ -66,7 +66,7 @@ 至于原本的Top chunk,如果读者细看了它的size变化,应该会发现少了0x20字节,其实只是被prev_size、size、fd、bk指针占用了而已
感觉这东西似乎没什么可说的,以至于笔者有点不知道该如何描述才能将这种思路表达清楚,还望见谅
插画ID:91095963
-
关于如何理解Glibc堆管理器(Ⅶ——Tcache Bins!!)
最后更新时间:
+}关于如何理解Glibc堆管理器(Ⅶ——Tcache Bins!!)
Last Update:
本篇实为个人笔记,可能存在些许错误;若各位师傅发现哪里存在错误,还望指正。感激不尽。
若有图片及文稿引用,将在本篇结尾处著名来源(也有置于篇首的情况)。
笔者本该将这一节的内容与第二节合并的,因为Tcache的并入并没有带来非常多的内容。但从结构上考虑,笔者一直以来都在使用glibc-2.23进行说明,在该版本下尚且没有引入Tcache Bins,因此这一节的内容一直拖欠到今。直到glibc-2.27开始,官方才引入了Tcache Bins结构,因此本节内容也将在该版本下进行说明(不过Ubuntu18确实用着比Ubuntu16来得舒服……)
@@ -132,7 +132,7 @@然后调用calloc函数,触发机制,将chunk0分配给用户,chunk1与chunk1->bk(即fake_chunk)被放入Tcache Bin中,且向fake_chunk->fd写入bin
然后用户再次请求一个同样大小的chunk时,由于Tcache Bin遵守LIFO(先进后出),因此将返回fake_chunk地址
插画ID:91536470
-关于如何理解Glibc堆管理器(Ⅷ——从源代码理解malloc)
最后更新时间:
+}关于如何理解Glibc堆管理器(Ⅷ——从源代码理解malloc)
Last Update:
本篇实为个人笔记,可能存在些许错误;若各位师傅发现哪里存在错误,还望指正。感激不尽。
若有图片及文稿引用,将在本篇结尾处著名来源(也有置于篇首的情况)。
关于glibc堆管理器Ptmalloc2的实际讨论在前几节已经大致结束了,但是笔者仍觉得对其分配机制缺少完整的认识,于是最后两节将直接通过源代码来对其分配和释放规则进行分析
@@ -143,7 +143,7 @@参考文章:
https://www.zzl14.xyz/2020/04/13/malloc%E6%B5%81%E7%A8%8B/#int-malloc
这位师傅用2.27的源代码也进行了详尽的说明,也比较推荐参考其博客
插画ID:91612724
-关于如何理解Glibc堆管理器(Ⅸ——从源代码理解free)
最后更新时间:
+}FastBinAttack实战 - babyheap_0ctf_2017
最后更新时间:
+}FastBinAttack实战 - babyheap_0ctf_2017
Last Update:
分析利用:
无壳,IDA打开后可以看出题目是基本的增删与展示(函数名为方便阅读而修改)
1 |
|
插画ID:91746115
-
SECCON CTF 2016 Quals - Chat 分析与思考
最后更新时间:
+}360chunqiu2017_smallest —— 从例题理解SROP
最后更新时间:
+}360chunqiu2017_smallest —— 从例题理解SROP
Last Update:
前言:
本篇博客为个人学习过程中的理解,仅记录个人理解,WIKI写的要比本篇详细得多。若与其存在矛盾,请以WIKI为准,也感谢读者指出问题。
正文:
SROP(Sigreturn Oriented Programming),与常规ROP的区别在于通过sigreturn函数来进行返回而不是retn指令
这里引用WIKI中对Signal机制的介绍:
@@ -74,7 +74,7 @@https://www.jianshu.com/p/09b4aed52e0d
https://www.jianshu.com/p/74aa44767a4b
插画ID:91506229
-pwnable - 3x17 分析与思考
最后更新时间:
+}pwnable - 3x17 分析与思考
Last Update:
有点炫酷的利用方式,不得不承认,确实让我长见识了。
正文:
1 |
|
https://xuanxuanblingbling.github.io/ctf/pwn/2019/09/06/317/
https://blog.csdn.net/gary_ygl/article/details/8506007
插画ID:91513024
-BUUCTF - inndy_rop 杂谈、32位与64位系统调用、与思考
最后更新时间:
+}BUUCTF - inndy_rop 杂谈、32位与64位系统调用、与思考
Last Update:
总之先从题目开始看吧,是一道非常简单但却让我长见识的题……
1 |
|
实际上就是把原本的指令字节分割一下,然后单独取出能被当作syscall的字节
嘛……这么来看还怪没有意义的……
插画IDA:92121278
-Asis CTF 2016 - b00ks —— Off-By-One利用与思考
最后更新时间:
+}Asis CTF 2016 - b00ks —— Off-By-One利用与思考
Last Update:
前言:
这道题做得有点痛苦……因为本地通常都很难和服务器有相同的环境,使用mmap开辟空间造成的偏移会因此而变得麻烦,并且free_hook周围很难伪造chunk,一度陷入恐慌……
不过本来应该很早就开始Off-By-One的学习的,竟然现在才注意到……惭愧
正文:
book结构:
@@ -112,7 +112,7 @@参考文章:
https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/off-by-one/#_1
https://www.cnblogs.com/bhxdn/p/14293978.html
插画ID:91452046
-plaidctf2015 - ebp —— FMT记录
最后更新时间:
本来是在看OFF-BY-ONE的,WIKI里将这个比赛的某题作为范例,但BUU只有“ebp”这题,于是顺手做了一下。然后才发现自己似乎一直以来有些太过依赖fmtstr_payload这种操作了,真到了需要自己一步步手动调试和操作的时候才发现,自己根本就不会构造payload……
+}plaidctf2015 - ebp —— FMT记录
Last Update:
本来是在看OFF-BY-ONE的,WIKI里将这个比赛的某题作为范例,但BUU只有“ebp”这题,于是顺手做了一下。然后才发现自己似乎一直以来有些太过依赖fmtstr_payload这种操作了,真到了需要自己一步步手动调试和操作的时候才发现,自己根本就不会构造payload……
具体的笔记等以后详细的学完了fmt再补吧,现在先记录一下这件事,并且补一个记录
“%?$p”
@@ -30,7 +30,7 @@https://www.cnblogs.com/wangaohui/p/4455048.html
-
一个汇编代码小实验
最后更新时间:
这几天闲着没事,突然想起自己已经把汇编忘得差不多了,于是重新拿起汇编做了个小实验
+}一个汇编代码小实验
Last Update:
这几天闲着没事,突然想起自己已经把汇编忘得差不多了,于是重新拿起汇编做了个小实验
测试代码:
1 |
|
不过x32dbg会在滚动之后又将汇编代码识别回 leave 且看上去真的执行了,只是观察寄存器后发现并没有执行leave,因此姑且认为,还是以IDA动调分析的汇编代码为准较好
另外补充一句:译码器在遇到不认识的机器码时,会直接崩溃,这一点经过笔者尝试得到了验证
插画ID:91687652
-Kernel Pwn环境搭建 可能遇到的问题
最后更新时间:
环境:Ubuntu18.04 / busybox-1.33.1 / linux-5.15.6
+}Kernel Pwn环境搭建 可能遇到的问题
Last Update:
环境:Ubuntu18.04 / busybox-1.33.1 / linux-5.15.6
busybox无法编译:
有人推荐使用ARM工具链,大概率是可行的,但也有给出对应的补丁以修复编译报错-https://bugs.gentoo.org/708350
内核编译错误: .config 中下述该行注释掉即可
@@ -27,7 +27,7 @@https://n0va-scy.github.io/2020/06/21/kernel%20pwn%20%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/
另:笔者试图在Ubuntu20上搭建相同环境,发现无论如何似乎都会出现意外情况,而在18下则没有类似状况发生,暂且搁置具体解决方案
插画ID:67986353
-SCTF2021——gadget报告
最后更新时间:
关键点总结:
+}SCTF2021——gadget报告
Last Update:
关键点总结:
1.架构切换(retf与retfq与ret)
2.侧信道攻击
首先应该认识到:
@@ -50,7 +50,7 @@Mark:http://liupzmin.com/2021/06/27/theory/stack-insight-01-md/
对我来说算是个冷知识:https://stackoverflow.com/questions/63975447/why-virtual-address-are-48-bits-not-64-bits
插画ID : 93869785
-《操作系统真象还原》chapter1-5笔记与总结
最后更新时间:
+}
《操作系统真象还原》chapter1-5笔记与总结
Last Update:
FS寄存器 和 段寄存器线索
最后更新时间:
问题始于一个简单的场景:“canary绕过”,一下子唤起我多年的问题,FS寄存器究竟是什么,在哪里?
+}FS寄存器 和 段寄存器线索
Last Update:
问题始于一个简单的场景:“canary绕过”,一下子唤起我多年的问题,FS寄存器究竟是什么,在哪里?
如下是段寄存器的结构示意图:
可以注意到,一个64位的段寄存器分为两个部分,Hidden Part部分包括了我们一般会用到的Base Address。常说的“用户无法访问FS寄存器”应该改为”用户无法直接访问FS寄存器”便不会引起误会了。
@@ -79,7 +79,7 @@https://github.com/pwndbg/pwndbg/blob/89b2df582a323b98c04c5d35e3323ad291514f63/pwndbg/regs.py#L268
A possible end to the FSGSBASE saga [LWN.net]
插画ID:93763504
-《操作系统真象还原》chapter7笔记与总结
最后更新时间:
PART 1
首先,计算机的中断根据其来源可分为内部和外部。外部中断常常是由外部设备发起,或是计算机遇到了某些遭难性错误而发生,相对于内部中断的发生频率来说要小些。因此也仅做了解。
+}《操作系统真象还原》chapter7笔记与总结
Last Update:
PART 1
首先,计算机的中断根据其来源可分为内部和外部。外部中断常常是由外部设备发起,或是计算机遇到了某些遭难性错误而发生,相对于内部中断的发生频率来说要小些。因此也仅做了解。
而内部中断则要更加常见,根据其发出中断来源分为软中断和异常。软中断是由软件主动或被动发起的,一般是 “INT” 族的指令主动调用的。这类指令均已在处理器中编码,并通过数据线连接到芯片上。即实际向处理器发出中断的是8259A芯片组。8259A芯片的几个IRQ接口(Interrupt ReQuest:中断请求接口)已经预先和其他的可能发出中断的设备连接好了,对应关系如下(但这些IRQ并不是所有引脚,8259A每个芯片似乎有28个引脚)。
如IRQ0的时钟中断会在处理器加电以后自动且定期地向8259A芯片发出中断(定期:根据8253计数器的设定频率发生)。
@@ -76,7 +76,7 @@PART 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 把操作的计数器counter_no、读写锁属性rwl、计数器模式counter_mode写入模式控制寄存器并赋予初始值counter_value */
static void frequency_set(uint8_t counter_port, \
uint8_t counter_no, \
uint8_t rwl, \
uint8_t counter_mode, \
uint16_t counter_value) {
/* 往控制字寄存器端口0x43中写入控制字 */
outb(PIT_CONTROL_PORT, (uint8_t)(counter_no << 6 rwl << 4 counter_mode << 1));
/* 先写入counter_value的低8位 */
outb(counter_port, (uint8_t)counter_value);
/* 再写入counter_value的高8位 */
outb(counter_port, (uint8_t)counter_value >> 8);
}
/* 初始化PIT8253 */
void timer_init() {
put_str("timer_init start\n");
/* 设置8253的定时周期,也就是发中断的周期 */
frequency_set(CONTRER0_PORT, COUNTER0_NO, READ_WRITE_LATCH, COUNTER_MODE, COUNTER0_VALUE);
put_str("timer_init done\n");
}
1 |
|
插画ID:93758526
-《操作系统真象还原》chapter8 笔记与警醒
最后更新时间:
+}
《操作系统真象还原》chapter8 笔记与警醒
Last Update:
《操作系统真象还原》chapter10 笔记与思考
最后更新时间:
+}
《操作系统真象还原》chapter9 笔记与注意
最后更新时间:
+}
《操作系统真象还原》chapter9 笔记与注意
Last Update:
《操作系统真象还原》chapter11 笔记与梳理
最后更新时间:
+}
《操作系统真象还原》chapter11 笔记与梳理
Last Update:
本章总算是开始我之前最关心的问题:用户进程的虚拟地址空间如何实现。
实际上在读前几章的时候就大概知道了,但还是对其具体的实现和细节方面抱有疑问,既然现在看完这章了,趁着还记得的时候留些笔记好了。
首先是关于TSS(Task Status Segment)的作用和开始时存在的疑问:
@@ -87,7 +87,7 @@
(不过就我个人来说,对这个事实还是有点难以释然,但这毕竟是说得通的,如果以后有更好的答案了再来补充吧)
插画ID:74657806
-《操作系统真象还原》chapter12 笔记与思考
最后更新时间:
本章内容只有一个:系统调用
+}《操作系统真象还原》chapter12 笔记与思考
Last Update:
本章内容只有一个:系统调用
实现的调用包括:sys_malloc、sys_free、sys_write、sys_getpid
前言
可惜的是,本书本章使用的是目前Linux已经弃用的_syscallX方式。在原版的Linux中,这种方式最多只支持6个参数,限制诸多且据本书作者说还存在安全问题(不过我查了一圈不知道具体是指什么样的安全事件)。目前记笔记时姑且这样继续,事后自己尝试的时候再试试能不能实现更加现代化一点的操作。
另外本书这节也实现了malloc和free,但其实现方式和我一直以来认知的堆管理似乎有很大的差别……考虑到实际的工程量问题,事后再尝试能否也做一些现代化的改造吧,当下先以笔记优先,姑且认同其实现方式。
@@ -65,7 +65,7 @@嘛,如果到时候有机会的话可以试着实现一个看看,不过目前先就这样放着吧。本书最终的操作系统毕竟只是一个用于理解原理的精简版,所以知道真是情况以后还是省察着看吧。
插画ID:90781328
-《操作系统真象还原》chapter13 笔记与整理
最后更新时间:
+}
TQLCTF-RE/PWN复现报告
最后更新时间:
《操作系统真象还原》chapter14/文件系统与遗憾
最后更新时间:
写在前面
本章没能看完,有些可惜。主要是因为寒假结束,没有那种能够安静看书的时间了,所以最后两章我的阅读效率下降的很快;另外还是因为本书已经快要看完了,心态有点浮躁,实在不适合继续看下去了,于是本章笔记只对本章前半部分做了相对详细的笔记,但后半部分笔者没能读下去,所以肯定是不足的。
+}D3CTF-PWN复现报告
最后更新时间:
HFCTF-2022 - TokameinE-二进制复现报告
最后更新时间:
前言
姑且参加了比赛,赛题感觉都不错,适当做了个复现。PWN那边还有一道内核没复现,主要是受限于目前笔者的技术水平,内核部分的知识还不太够用,以后有机会了会另外复现的。
+}HFCTF-2022 - TokameinE-二进制复现报告
Last Update:
前言
姑且参加了比赛,赛题感觉都不错,适当做了个复现。PWN那边还有一道内核没复现,主要是受限于目前笔者的技术水平,内核部分的知识还不太够用,以后有机会了会另外复现的。
最有意思的题目应该是 vdq 那题,属于是佩服做出来的师傅,那个最终的 payload 构造花了我一整天时间,整道题做了有两天半……怎么说呢,好痛苦啊。
另外 fpbe 和 mva 也挺好玩的,前者主要是给我科普了一波 ebpf ,后者主要是笔者觉得自己写的 exp 挺精巧的,自我感觉还行。不过博客的模板似乎不识别五级标题,看着确实有点不舒服了……
也欢迎师傅们捉虫。
@@ -261,7 +261,7 @@MISC
插画ID:96449673
-烟灰色戏言
最后更新时间:
1 |
|
烟灰色戏言
Last Update:
1 |
|