Fd
1、标准输入输出和错误
linux下使用标准输入文件stdin和标准输出文件stdout,来表示每个命令的输入和输出,还使用标准错误输出文件stderr用于输出错误信息。三个标准流都与系统与控制终端设备相连(如:键盘)。
因此,在标准情况下,每个命令通常从相应的控制终端中获取输入,并将输出打印到控制终端屏幕上,如本题解题过程。也可以将程序重新定义,将stdin,stdout重定向。最基本的使用方法是定义到一个文件上,从一个文件获取输入,输出到另外的文件中。如read(),write()函数的使用。
2、文件描述符
在底层操作系统是不会通过文件指针来查找文件的,而是通过文件表示符来操作的。
文件标识符以一系列证书,从0开始依次递增。但是一般系统标识符都是从3开始的。
文件描述符0、1、2和终端相关。如果希望命令从文件中读取输入或输出到文件中,就需要使用文件重定向。
系统默认打开三个流:
文件描述符 | 缩写 | 描述 |
---|---|---|
0 | stdin | 标准输入(命令的输入,缺省和终端键盘关联) |
1 | stdout | 标准输出(命令的输出,缺省和终端屏幕关联) |
2 | stderr | 标准错误输出(命令的错误信息输出,缺省和终端屏幕关联) |
3、重定向标准输出
1 | whoami > filename #把命令标准输出重定向到一个文件中(如果文件存在,则内容覆盖) |
4、重定向标准输入
1 | whoami < filename # 以filename文件作为命令whoami的标准输入 |
5、重定向标准错误
1 | whoami 2> filename # 把whoami命令的标准错误重定向到文件中(如果文件存在,则内容覆盖) |
collision
1、\xc9 为字符串。使用python print后会输出?是因为计算机不识别的这个字符
2、大端序 or 小端序
端序:又称字节序、尾序、位序。在计算机领域是指机器存放多字节数据的字节顺序。在涉及到低层数据存储和网络数据传输研究中都会涉及端序。
大端序:高位字节放在内存的低地址,低位字节放在内存的高地址。
小端序:低位字节放在内存的低地址,高位字节放在内存的高地址。
例:int a = 0x12345678 从左到右字节位降低 两个数为一个字节 12是高位78是低位,字节位具有相对性。1
2
3
4
5
6
7
8
9
10
11
12大端序存放方式:
0x00000001 -- 12
0x00000002 -- 34
0x00000003 -- 56
0x00000004 -- 78
地址位从低到高,字节位从高到低
小端序存放方式:
0x00000001 -- 78
0x00000002 -- 56
0x00000003 -- 34
0x00000004 -- 12
地址位从低到高,字节位从低到高
3、lsb文件基本都是小端序文件
bof
1、gets(s)存在溢出
scanf遇到输出不能有空格,所以用gets输入字符串,但是gets出现了一个潜在问题,gets将不停地往s中塞东西,不管s的可用空间是否足够,就存在溢出漏洞问题,超过s空间长度会导致系统崩溃。
2、esp汇编中为栈顶置针,栈中数据都是从栈顶进入的。
栈顶 |
---|
esp |
… |
s |
… |
ebp |
返回地址 |
arg0 |
esp = s + ebp(4字节) + 返回地址(4)
flag
upx压缩文件1
upx -d file #upx解压文件
passcode
1、scanf(“%d”, &a)
scanf函数会把获取的值送到一个地址,如果不加&会把a的值当作地址传送。
待更新…