问题实际上是关于 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
帧的函数指针,我a[7]
用混淆或的内存地址写入shell_call
,它可以工作。(我有一台 64 位机器,这就是为什么我必须将其设置为 7,因为 EBI 指针是 2 个整数宽,而不是 1)
我的问题如下,我如何控制将哪个参数传递给函数shell_code
?IE。我怎么写string
。重点是通过仅运行程序来执行ps等char* c
unix 命令。
我想用ps的十六进制表示来编写 EBI 指针并将 arg 列表设置shell_call
为此,但这不起作用。我也尝试输入argsv
参数并将 arg 列表设置shell_call
为arg_list
main,但也没有工作。
我认为第二个版本应该可以工作,但我相信我没有正确设置新堆栈帧的 arg 列表(我是通过写入a[8]
来完成的0
,因为它是函数指针的第一部分,并且写入a[9]=736c
and a[10]=0000
,但它可能不对,因为这些是 的参数victim_func
。那么如何访问 的参数shell_call
?