是否可以利用以下代码?

问题描述 投票:1回答:1

我试图利用以下代码,但没有成功。我给了输入60 + 1 karakters,但没有用。

启用了使用标签的CFI。堆栈金丝雀,不可执行的堆栈和ASLR被禁用。您可以使程序打印“您赢了!\ n”吗? (假设isAdmin是一个全局变量,而不是main()中定义的变量。仍然可以利用该代码吗?)

void g() {
   char buff[60];
   gets(buff);
}

void main() {
   int isAdmin = 1;
   g();
   isAdmin = 0;
   g();
   if (isAdmin) { printf("You won!\n"); }
}
c buffer-overflow
1个回答
0
投票

是的,您可以利用它,但不能使用标准输入。基本上,首先将isAdmin压入堆栈,然后在调用g时压入60个字节,然后再压入60个字节。当您设法在字节120-124(sizeof(int = 4))中写入1时,isAdmin将为1。使用gets()时,您只能使用Ascii字符。没有输入1的键,在这种情况下,我不确定get的行为。

© www.soinside.com 2019 - 2024. All rights reserved.