关于canary的绕过
一般canary 在ebp的物理相邻低地址处,而且,canary最后一位低地址处字节\x00字符截断,因此直接将其覆盖即可绕过,我们可以刚好覆盖数据到\x00前一位,利用sendline中发送机制,最后被发送的字符串中会增加一位“'\n”其ascii码位10.
ciscn_2019_es_7中的收获
- 在IDA看的栈的结构并不一定真实,例如本题,并没有leave这个东西,而是直接pop ebp而后retn从gdb调试中可以看见,从read输入点往后偏移0x10 + 0x8开始就是函数返回地址了,此处压根就不用覆盖ebp的。
- 对系统调用的理解:
可以将系统调用理解为一类函数调用,而这个类,根据rax这个系统调用号的不同而不同,
p.send("/bin/sh"+"\x00"*(0x1+0x8)+p64(sigreturn_addr)+p64(syscall_ret)+str(sigframe))
而系统调用的使用就是:先找到gadget(能够改写rax的值,并且指令后边附带retn)而后执行syscall(其后附带retn),这就完成了系统调用。
而srop就是在系统调用结束之前(这里入write系统调用结束之前),将rt_sigreturn后边的Signal frame布局好,只等sigreturn 系统调用。恢复之后,接着rip指向的指令开始执行。
其实就是两个系统调用,先系统调用sigreturn布局程序上下文,而后恢复之后的程序执行的是系统调用(获得shell)。