0x0 程序保护和流程
保护:
流程:
输入1能够读入长度为0x100的字符串到s而s距离rbp的距离为0x90存在明显的栈溢出,输入2能够输出s,输入3则退出程序。
0x1 利用过程
1.因为程序保护中开启了canary所以直接进行栈溢出就会触发canary。所以可以利用puts函数的特性一直输出字符直到遇到**\x00**,将canary的值输出出来。当输入0x87*‘a’+’/n’时不会有多余数据输出,而当输入0x88*‘a’+’/n’就会有多余数据输出,说明canary中有**\x00**。
2.获得canary的值之后就可以进行栈溢出了。有两种方法进行溢出,第一种是直接使用one_gadget在libc中查出的地址进行getshell,第二种是利用system函数进行getshell。但是第二种方法在服务器上不能够getshell。
0x2 exp
from pwn import *
context.log_level = 'debug'
local=0
if local:
sh=process('./a')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
one_gadget=0x45226
else:
sh=remote