ps:突然发现单独学习pwn的题目太狭隘了,准备这两天整理下思路再从逆向开始。
当canary打开的时候,会在如图位置放一个canary区域,canary中存放一个随机值,当程序读取canary区域时发现随机数发生变化,则会直接退出。
返回导向编程:
Ret2syscall
使用的自带函数中,例如printf并不是简单实现的,而是调用写好的存放在系统层的功能,通过动态链接调用。libc中存放了大量库函数。
为什么要动态链接调用呢?
因为系统libc在不断更新,不可能更新后去更改所有二进制的指向。通过修改软连接的指向就可以达成。
被调用的库函数会在被调用时进入shared libraries段中的libc的对应库函数的地址。是对系统调用的包装,
这是一段系统调用,先将execve的系统调用号存入eax,在其他寄存器中去存放参数,最后是一个系统调用中断号。而这一段代码的作用是system所包装的,和system调用sh的作用是一样的。
ROP的目的:程序中没有完整的可以调出这样的汇编代码,但有对应的代码片段,用rop执行分离的代码也能达成相同的作用。
Pop_寄存器_ret 这样的片段就是要的gadget
通过 ROPgadget --binary 文件名 --only "pop|ret"来寻找有pop或者是ret的片段。
在gdb动态调试中,相当于把程序放在一个自己的虚拟层中去运行,因此偏移是可靠的,但是地址可能和实际的地址有出入。
main是栈中的第一个栈帧,在main之前的函数没有栈帧。
在调试修改后的ret2shellcode的题目时,在本地运行出错,在ctf题目中也会经常遇到远程能打通,本地打不通的情况,特别是调用libc动态链接库的程序,在环境差异的情况下,很有可能会出现。
题目做法放到明天了