gcc天问之路
gcc链接器探坑之路因为要为malloc的漏洞利用写demo,需要不同版本的共享库,之前一直再逃避写demo这件事,一直用的可执行文件,利用patchelf来更改链接器路径,但是为了深入学习还是得自己写demo,需要掌握编译链接的全过程。
一定要记住GUN不止GCC,gcc的时候也不是仅仅用gcc,遵从stfm的原则,想深入了解一下汇编链接的全过程去查看了一下gcc的文档,好无知,哈哈哈,明明更改动态链接库的版本需要的是ld,为什么要看gcc的文档呢,还是因为-Wl选项救了我,一看解释居然是给链接器传递参数。哈哈哈。接着赶快去看linker的文档,主要用上了这两个选项:
--rpath=...--dynamic-linker=....
–rpath选项按文档上说是链接时查找的共享对象,但是我对这个共享库也知道甚少,因此对于其也仅仅会用的状态。
–dynamic-linker选项按文档的解释是更改linker的可执行文件,彻底激发了我的好奇心,原来linker可以被直接使用的,一直以为是个库,哈哈哈哈,无知的我。然后就去查了ld的文件类型。结果:
l@L:/usr/bin$ file ...
heap利用(入门)
off-by-one在一个可以写的区域伪造chunk(通过off-by-one使系统的指向chunk的指针能指向伪造chunk)
注意chunk的大小的构造
其中指针有多层,因此可以泄露并且修改,p2地址泄露之后,覆盖p2为想要操作的地址,将p4将内容改为想要的内容
p1->p2->内容
p1->p4->内容(更改p1的值)
3.p1->p4->新内容(更改p1的指向的值)
对于一二步骤p1在第二层,但是对于第一步骤p1在第一层
想更改p1的间接内容,需要更新p1的指向为p4,需要把p1移到第二层(先泄露&p1,然后再一个块的内部伪造一个新的chunk,其中放入&p1,成功将其到第二层),通过fakechunk的一些操作可以更改p1的值(也就是改为&p4),这样可以更改p4指向的内容,那么p1应该改成什么(改成泄露的重要地址,此题通过p1的指向来泄露,也就是&p4和&p2有着千丝万缕的关系)
更改p的值,和p的指向的值
from pwn import *context.log_level="deb ...
关于parser的语法树生成算法(实现)
Week 5 and Week 6
首先是提出算法实现前的一些铺垫,主要包括以下知识:
1.Top-Down and Bottom-Up
2.Shift-Reduce Parsing
3.一些notation为了算法实现做铺垫
1.Top-Down and Bottom-UpTop-Down对应先前讲的leftmost,而Bottom-Up则对应先前讲的rightmost,Week 4是从易于理解的角度讲解,而本周则是从实现的角度讲解。主要涉及到了如何shift,如何reduce,以及如何生成树,但是没有讲什么时候。
2.Shift-Reduce Parsing基于Top-Down and Bottom-Up引出的语法解析实现的简单模型,初步引入了一些notation,如
主要解决了在哪reduce的问题
期间讲了一个插曲,也就是冲突(conflict)的解决方法:
一个为:shift和reduce的冲突,可被precedence and associativity declaration修复,类似于leftmost 或者rightmost,如加法和乘法的优先级。
另一个: red ...