baby-sum

简而言之的话就是格式化字符串加上特殊栈空间排布

welcome 函数泄露出栈地址;cala 里面有个循环写入的功能函数,写入内容之后会调用 vuln ,里面就一个格式化函数漏洞;

使用 scanf(‘%8s’, &num) 在堆栈上读取 3 个输入 (0,1,2),num 是堆栈上指向 numbers[] 数组的指针,该数组每轮递增,偏移量:

  • 6 –> 起始地址
  • 7 –> 数字地址[0]
  • 8 –> 下一帧指针(指向偏移量 16)
  • 9 –> 从 calc() 返回 vuln() 的地址
  • 10 –> 数字 [0] 在 [rbp-0x30]
  • 11 –> 数字 [1] 在 [rbp-0x28]
  • 12 –> [rbp-0x20] 处的格式将在 calc() 开始时设置为“%8s”
  • 13 –> sum 变量,在 calc() 开头未定义…(可以通过welcome() 函数设置,qword 在(名称字符串+ 0x28)
  • 14 –> i 在 [rbp-0x10] 处的变量在每轮增加 (0,1,2)
  • 15 –> [rbp-8] 处的 num 指针每回合递增,指向开头的 &numbers[0] ..
  • 16 –> 下一帧指针(指向偏移量 20)
  • 17 –> calc() 的返回地址

思路大概就是:先将计数变量置为负数;放 %1$p 到数组上面等下用来泄露;将 scanf 输入的格式化字符串替换为 %ld ,后面用来写入地址;用 welcome 泄露的地址找到 main 函数返回地址从而泄露出 libc 地址;写 onegadget