延迟绑定
延迟绑定静态链接:静态链接是将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一起,生成一个可执行文件
程序运行速度快,但是浪费空间,更新库函数代码也困难,需要重新编译链接
动态链接:动态链接是在程序运行时将程序与共享库链接起来,允许多个程序共享一个库。当一个程序被加载到内存中运行时,动态链接器会检查程序所需的共享库,并将它们加载到内存中,然后动态链接器也会将程序中对共享库中函数和变量的引用重定位实际的地址。
动态链接的优点是它可以减少内存占用和磁盘空间的浪费,并且多个程序可以共享同一个库,也更容易更新升级。但是由于把链接推迟到了程序运行时,所以每次执行程序时都需要链接,性能会降低。
因为Gcc默认是动态链接,所以为了解决动态链接缺点的问题有了延迟绑定
延迟绑定是动态链接器用来减少程序启动时间的一种技术。延迟绑定就是在函数第一次被调用的时候再和函数地址绑定
GOT 全称是全局偏移量表(Global Offset Table),用来存储外部函数在内存的确切地址。GOT 存储在数据段(Data Segment)内,可以在程序运行中被修改。
PLT 全称是程序链接表(Procedur ...
调用约定
调用约定函数的调用约定就是函数调用时的一些规则:
1、函数参数的压栈顺序
2、由调用者还是被调用者把参数弹出(内平栈/外平栈)
3、产生函数修饰名的方法
_cdcel是C和C++默认调用约定:
1、从右至左依此压栈
2、由调用者维护参数内存栈(外平栈)
3、修饰名格式是在原函数名前加一个下划线,如_function
_stdcallC和C++标准调用方式,Win32 API中的函数一般是这种调用方式:
1、从右至左依此压栈
2、被调用者维护参数内存栈(内平栈)
3、修饰名格式是在原函数名前加一个下划线,原函数名后加一个@,如_function@
_fastcallfastcall就是快速调用约定,通过寄存器传递参数,相比于去内存栈中读取参数,fastcall更快:
1、使用ECX和EDX寄存器传递前两个DWORD或者更小的参数,其他参数依此从右往左依此入栈
2、被调用者维护参数内存栈(内平栈)
3、修饰名格式是在原函数名前和后各加一个@,并且在后面跟函数参数的字节数,如@function@16
_thiscallC++类成员函数缺省的调用约定,在C++中,由于类成员有一个th ...
ret2text
ret2text一、原理控制程序执行程序本身已有的代码(.text)。这种攻击是一种笼统的描述,被称为ROP攻击,即通过面向返回编程来攻击。ROP攻击利用了程序中已经存在的代码段(称为“gadget”),并通过操纵程序的返回地址来控制程序的执行流程。
GCC编译ret2text文本文件:
12gcc -fno-stack-protector -z noexecstack -no-pie -z norelro -m32 - ret2text.c -o ret2text //编译的文件禁用栈保护、开启NX保护、关闭RELRO并且是32位sudo -s echo 0 > /proc/sys/kernel/randomize_va_space //关闭进程地址随机化
二、程序分析通过checksec检查程序
32位程序小端存储,除了NX栈不可执行开启,其它都是关闭状态。因为开启了栈不可执行,所以无法在栈中进行跳转,那么就考虑调用程序本身的函数,或者使用ROP技术获取gadget
使用ida静态分析程序,main函数中调用gets()函数来获取数据,因为此函数没有数据限制,所以 ...