flex and yacc/bison
flexyacc/bison语法学习flexflex是用于编译.lex文件为可执行文件的工具,lex文件常见格式如下
基本格式第一段定义段123456789 //c/c++头文件定义%{ #define LT 1 intyylval;%}//定义一些正则表达式的规则letter [A-Za-z]digit [0-9]id {letter}({letter}|{digit})*
第二段词法规则段这一段用%%…..%% 包裹起来,中间的…..是正则表达式
12345678%%a+ { numpat1++; REJECT; }a*b { numpat2++; REJECT; }.|\n /* do nothing */{id} {return id}%%
在{} 中可以写一些c/c++的代码,而{id} 表 ...
apple2 attack summary
apple2利用方式以及模板整理原理apple2的原理建议直接看原文章,也可以看我copy的house of apple 2
利用条件照原文讲解我们要想能够控制程序的rip,需要能够劫持任意一个IO_FILE_Plus结构体,该结构体组成了_*IO_2_1_stderr_ ,_*IO_2_1_stdin_ _*IO_2_1_stdout_* 的三大重要IO链条。而这三大IO链条又通过IO_list_all 这个头指针指向它们
常见的我们劫持stderr的plus结构体,劫持的方式有如下两种
存在任意地址写,直接修改_*IO_2_1_stderr_*地址的内容,写入想要的plus结构体变量
利用largebinattack(或者其他方式)劫持IO_list_all 让他指向可控堆地址,在该堆地址上伪造IO_FILE _plus结构体
利用方式apple2的控制rip的本质就是利用_wide_vtable; 进行虚表调用的时候没进行检查,从而我们通过偏移就能控制rip。(具体不详细讲解—看原文)
然后要想触发apple2走的控制链条如下
12345_IO_wfile_overfl ...
c++primer第七章类
第七章类定义类成员函数12345class Sales_data{public :std::string isbn() const { return bookNo;}std::string bookNo;}
上面的代码再Sales_data的类中定义了一个成员函数isbn 该函数的作用是返回当前类的bookNo 成员变量,我们的使用方法如下
12 Sales_data s ;s.isbn();
我们看到该isbn函数并没有传入当前的s对象的地址,可是却能访问s对象中的成员变量bookNo,这是为啥呢?
这就涉及到this指针了,this指针是一个隐式指针,当我们调用s.isbn()函数时,会隐式的将s对象的地址传递给this指针,this指针是
Sales_data *const类型的指针,也就是说this是一个底层指针,该指针this只能指向当前的s 对象,而由于在isbn函数中我们并不需要去修改s对象中的成员变量的值,因此我们最好就是让this 指针变成一个常量指针(顶层指针),如果是函数传参的方式应该如下
1std::string ...
Makefile和Cmake学习
Makefile和Cmake
参考01星球的课件哦
什么是Makefile
用于工程项目管理的文本文件,文件名为makefile/Makefile,如果Makefile和makefile两个文件都存在,那么系统默认执行makefile
makemake是一个执行Makefile的工具,是一个解释器用于对Makefile中的命令进行解析并执行一个shell指令。
makefile的用途描述整个工程的编译,链接规则,软件项目的自动化编译,相当于给软件写一份脚本文件,让我们不再需要手动输入命令。
makefile的语法下面是一个常见的makefile文件
123456789# Makefile中的注释是以#开头# 语法格式:# 目标:依赖# 通过依赖生成目标的指令# 注意:指令前面必须使用同一个tab键隔开,不能使用多个空格顶过来hello:hello.o g++ hello.o -o hellohello.o:hello.cpp g++ -c hello.cpp -o hello.o
语法格式1234语法格式:目标:依赖 通过依赖生成目标的指令注意指令前面必须使用同一个ta ...
tcp/ip网络编程 第三章地址族与数据序列
第三章地址族与数据序列分配套接字IP地址和端口号
IP地址是internet Protocol(网络协议)的简写,是为了收发网络数据分配给计算机的值
端口号是用于区分计算机不同程序建立的socket,不同程序socket对应不同的端口号
网络地址(Internet Address)为了让计算机连接到网络,因此我们需要向计算机分配一个IP地址。IP地址用于区分不同计算机。IP分为如下两类
IPv4(Internet Protocol version 4) 4字节地址族
IPv6(Internet Protocol version 6) 16字节地址族
IPv4和IPv6的作用是一样的,不过由于IPv4是4字节,因此能够容纳的数字范围小于IPv6,而前面讲的不同计算机要分配一个不同的IP,因此IPv6用于未来解决IPv4的数量不够分配的情况。但是目前使用的最多的仍然是IPv4.
IPv4的组成IPv4由网络地址(网络ID)和主机地址(主机ID)组成,并且分为ABCDE4类,下面是不同类IPv4对应的分配情况
网络地址(网络ID)是为了区分网络而设置的,比如学校里面建立的校园网络,和政府 ...
tmux+zsh优化终端
zsh+tmux整合原装/bin/sh太难用了,下面是进行优化的工具
zsh使用原因zsh + oh-my-zsh 就能够实现各种主题切换,以及一些好用的插件,比如
z 指令 能够解决原装cd指令必须要输入完全路径,有了z指令后比如我们要跳转到/home/wake/ctf 只要我们cd进入过这个目录,我们就能够直接使用z ctf 从而直接进入ctf这个目录
代码自动补全指令(能够自动根据历史记录补全代码)
代码高亮 让输入的指令正确显示就绿色,否则就是红色
table万物皆可table 无论是忘记了完整的命令,还是忘记了当前目录下有哪些文件,都能进行table进行选择
使用方式
参考下面文章—啥都有了我这里整合一下zsh使用zsh-插件补充
tmux用于将控制台进行分屏,有些时候打pwn体分屏是一种很好体验,比如下面这样
下载1sudo apt-get install tmux
使用方式终端输入tmux 进入tmux控制台,
上下分屏 ctr + b 停顿 + "
左右分屏 ctr + b 停顿 + %
窗口切换 ctr + b 停顿 +上 ...
getchar源码分析
也可以看我的notion讲解丰富一点 getchar源码分析
getchar源码分析调用链123456getchar() _IO_getc_unlocked __uflow _IO_default_uflow _IO_file_underflow (也叫做_IO_new_file_underflow) _IO_SYSREAD (fp, fp->_IO_buf_base,fp->_IO_buf_end - fp->_IO_buf_base); //关键函数
流程分析这里分析只getchar一般流程首先getchar是调用了_IO_getc_unlocked
1234567891011intgetchar (void){ int result; if (!_IO_need_lock (stdin)) return _IO_getc_unlocked (stdin); _IO_acquire_lock (stdin); result = _IO_getc_unlocked (stdin); _IO_release_lock ( ...
c++primer第三章读书笔记
string/vector/数组string类123string s5 = "123"; //拷贝初始换string s6("123"); //直接初化string s7(10,'c');
对string的操作
读取操作>>>进行读取
在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止。
getline读取
然后把所读的内容存入到那个string对象中去(注意不存换行符)
string的empty和size操作empty函数根据string对象是否为空返回一个对应的布尔值(空返回1,非空返回0)
size函数返回string对象的长度,size返回string::size_type类型的值
size_type是一个无符号数,因此需要注意不要和有符号数进行比较,比如s.size< n(n为int),当n为负数转换成无符号数是很大的数,此时就出现了意料外事情。
比较string对象
相等性运算符 ...
linux物理分配全链路实现
物理分配全链路实现
参考文章https://www.cnblogs.com/binlovetech/p/17019710.html
基本上都是看的上面的文章,这里只是总结一些我认为重要的内容,建议直接看原作者。
0x1物理内存page分配接口我们知道内核以page为最小单位进行分配物理内存分配,进程要想获取到物理内存page页,就需要调用我们封装好的内存分配接口(通俗来说就是一些用于page内存获取的函数,然后linux内核通过调用这些函数[接口],从而得到物理内存页),那linux中存在哪些关于物理内存页分配的接口呢?
这里直接上一张图片,这张图片可以我们一共存在4个接口,用于不同的情况
struct page *alloc_pages(gfp_t gfp, unsigned int order); 该函数是众多接口的底层函数,用于向底层伙伴系统申请 2 的 order 次幂个物理内存页组成的内存块。对应下面两个参数
gfp_t gfp 规范物理内存分配行为修饰符,简单来说就是内核能够怎么去获得所需的内存页
unsigned int order order是分配阶,内核一次只能 ...