这个问题实际上是关于C语言中堆栈溢出的。我有一个作业,但是我无论如何也做不出来,我已经查看了所有gdb信息,但还是无法理解。
问题如下:
int i,n;
void confused()
{
printf("who called me");
exit(0);
}
void shell_call(char *c)
{
printf(" ***Now calling \"%s\" shell command *** \n",c);
system(c);
exit(0);
}
void victim_func()
{
int a[4];
printf("[8]:%x\n", &a[8]);
printf("Enter n: "); scanf("%d",&n);
printf("Enter %d HEX Values \n",n);
for(i=0;i<n;i++) scanf("%x",&a[i]);
printf("Done reading junk numbers\n");
}
int main()
{
printf("ls=736c --- ps = 7370 --- cal = 6c6163\n");
printf("location of confused %x \n", confused);
printf("location of shell_call %x \n", shell_call);
victim_func();
printf("Done, thank you\n");
}
好的,我成功解答了第一个问题,即在主路径中没有明确调用的两个函数中任选一个进行任意调用。顺便说一句,这必须在运行程序时不进行任何修改。
我通过运行程序,将N
设置为7
,这让我进入了victim_func
帧的函数指针,我使用混淆的内存地址或shell_call
来写a[7]
,然后它就可以工作了。(我有一台64位机器,所以我必须把它设置为7,因为EBI指针是2个整数宽度,而不是1个)
我的问题是,我如何控制将哪个参数传递给shell_code
函数?也就是说,如何向char* c
写入string
。
整个重点在于通过仅运行程序执行unix命令,例如ps等。
我想到过使用ps
的十六进制表示来写入EBI指针,并将shell_call
的参数列表设置为此值,但这并没有起作用。我还尝试输入argsv
参数,并将shell_call
的参数列表设置为main
的arg_list
,但这也没有起作用。
我认为第二个版本应该可以工作,但我相信我没有正确设置新栈帧的参数列表(我是通过将a[8]
写为0
来执行的,因为它是函数指针的第一部分,并且写入了a[9]=736c
和a[10]=0000
,但这可能不对,因为这些是victim_func
的参数。那么我如何访问shell_call
的参数?