对抗canary保护技术

  • 泄露canary值
  1. 直接泄露栈上canary
    利用输出函数,不输入’\x00’,让canary的值被打印出来
    栈溢出时在覆盖时把canary覆盖成它本身的值

  2. 泄露fs:28内的值
    假设有任意读的功能的函数,则去读取fs:28h地址的值(验证值)
    当我们已经泄露libc基址时即可以算出该地址位置,且每次程序执行该地址与libc基址偏移固定不变
    (程序开始时会把fs:28的值保存在栈上作为canary,程序结束时会把canary的值和fs:28h比较,不一样则调用__stack_chk_fail,一样则正常返回)
    【补图】

  • 覆写副本值
    如果有任意写的能力可以考虑把fs:28h的值覆写掉

  • 劫持stack_chk_fail
    可以修改全局偏移表(GOT)中存储的__stack_chk_fail函数地址(如通过格式化字符串),便可以在触发canary检查失败时,跳转到指定的地址继续执行。

  1. stack smashing
  • 当canary被覆盖之后,会call到__stack_chk_fail打印argv[0]这个指针指向的字符串,默认argv[0]是程序的名字
  • 如果我们把它覆盖成其他的地址时,它就会把其他内存地址的信息给打印出来

于是可以通过这个机制泄露相应内容(观察栈的结构查看该指针的位置并计算偏移)
【补图】

  1. 逐字节爆破
    逐字节覆盖canary,正常执行则说明正确