C语言 易受攻击的代码中的空指针和属性构造函数

bkhjykvo  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(119)

我应该在代码中找到漏洞,我觉得它隐藏在__attribute__((constructor))或指针中。在这里,我可以看出它是一个空指针,但我从未遇到过带有()(也找不到)那么这是什么类型的指针,(void(*)())&name中的(void(*)())是用于类型转换还是其他什么?另外,这里的属性构造函数是否扮演了一个感觉像空默认构造函数的角色

#include <stdio.h>
#include <string.h>
//Ignore this thing
__attribute__((constructor))
void setup(){
  setvbuf(stdout,NULL,2,0);
  setvbuf(stderr,NULL,2,0);
  setvbuf(stdin,NULL,2,0);
}

int main()
{
  printf("What's you name?\n");
  char name[100];
  fgets(name,100,stdin);
  void(*Kekpointer)() = (void(*)())&name;
  Kekpointer();
  return 0;
}

我试着分析这些函数,所以我得出结论,指针,fgets函数或属性构造函数,但我无法继续。我还得到了这个提示"for challenge,你的目标是得到一个 shell 。2标志存储在远程服务器上。3仔细阅读源代码并尝试找出漏洞。4这是一个初级挑战!但是它并没有指引我去任何地方。我期待着更多关于指针的信息,特别是

lg40wkob

lg40wkob1#

在任何现代的托管系统上,这段代码都是100%安全的。为name分配的内存将没有可执行属性,任何从那里执行代码的尝试都将以异常结束。
您需要使此内存可执行:

int main()
{
  char name[100];
  size_t pagesize = getpagesize();

  mprotect(name, pagesize,PROT_EXEC);

  printf("What's you name?\n");
  fgets(name,100,stdin);
  void(*Kekpointer)() = (void(*)())&name;
  Kekpointer();
  return 0;
}
vqlkdk9b

vqlkdk9b2#

Re:这是什么类型的指针?“(void()())&name”中的“(void()())”是用于类型转换还是其他什么?

  • 左手边:*
void(*Kekpointer)()

----〉kekpointer是一个指向不带参数并返回void的函数的指针。

  • 右手边:*
(void(*)())&name

----〉&address-of操作符,类型转换代表一个指向不带参数并返回void的函数的指针,所以address-ofname被类型转换为一个指向不带参数并返回void的函数的指针(什么都不返回),它匹配左边。
表达式将name缓冲区类型转换为函数指针,然后用其地址初始化左侧。

相关问题