我应该在代码中找到漏洞,我觉得它隐藏在__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这是一个初级挑战!但是它并没有指引我去任何地方。我期待着更多关于指针的信息,特别是
2条答案
按热度按时间lg40wkob1#
在任何现代的托管系统上,这段代码都是100%安全的。为
name
分配的内存将没有可执行属性,任何从那里执行代码的尝试都将以异常结束。您需要使此内存可执行:
vqlkdk9b2#
Re:这是什么类型的指针?“(void()())&name”中的“(void()())”是用于类型转换还是其他什么?
----〉
kekpointer
是一个指向不带参数并返回void
的函数的指针。----〉
&
是address-of
操作符,类型转换代表一个指向不带参数并返回void
的函数的指针,所以address-of
name
被类型转换为一个指向不带参数并返回void
的函数的指针(什么都不返回),它匹配左边。表达式将
name
缓冲区类型转换为函数指针,然后用其地址初始化左侧。