问题实际上是关于C中的堆栈溢出.
我有一个不能为我的生活做的事情,我已经看了gdb中的所有内容而我无法想象它.
我有一个不能为我的生活做的事情,我已经看了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帧的函数指针,我写了一个[7]与内存地址confused或shell_call,它的工作原理. (我有一台64位机器,这就是为什么我必须把它变为7,因为EBI指针是2英寸宽,而不是1)
我的问题如下,我怎样才能控制哪个参数传递给shell_code函数?即.如何将字符串写入char * c.
重点是通过仅运行程序来执行像ps等unix命令.
我想用EB的十六进制表示编写EBI指针并将shell_call的arg列表设置为,但这不起作用.我也尝试输入argsv参数并将shell_call的arg列表设置为main的arg_list,但也没有用.
我认为第二个版本应该可以工作,但我相信我没有正确设置新堆栈帧的arg列表(我是通过将[8]写入0来实现的,因为它是函数指针的第一部分,并且写入a [9] = 736c和[10] = 0000,但它可能不正确,因为那些是victim_func的参数.那么如何访问shell_call的参数?