格式化漏洞利用原理

2019-03-24  本文已影响0人  鸡龙

在printf()函数正常使用中,printf(s),printf("%s",s)都能够输出s字符串的值,但如果在s字符串中存在%,计算机无法判断是否为参数,所以可以在printf(s)中s填入带有%的符号,能达到泄漏地址的作用。
一般我们想要泄漏栈上多个地址,往往可以采用输出多个%x来达到。如果想直接获得某个地址,可以用%n$x。

#include <stdio.h>
int main() {
  char s[100];
  int a = 1, b = 0x22222222, c = -1;
  scanf("%s", s);
  printf("%08x.%08x.%08x.%s\n", a, b, c, s);
  printf(s);
  return 0;
}

可以用以上C代码来验证输入%08x.%08x.%08x,你会发现他在第二个printf中输出的是调用printf函数时调用栈上的部分地址
也可以输入AAAA%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p,你会发现其中有一段为对应的414141,41为A的ASCII码

当然,能得到地址,当然也能覆盖地址,%n为将参数量赋值给当前地址,可以作为覆盖地址的渠道

#include <stdio.h>
 
int main(void)
{
    int c = 0; 
    printf("%.100d%n", c,&c);
    printf("\nthe value of c: %d\n", c);
    return 0;

这个函数就成功的将c修改为100,所以只要能找到c的地址,再适当的使用%n植入对应的参数数量,就能将c地址覆盖为你想要地址

上一篇下一篇

猜你喜欢

热点阅读