问题实际上是关于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
为7
,让我进入victim_func
框架的功能指针,我a[7]
用困惑的内存地址写,或者shell_call
它的工作原理.(我有一台64位机器,这就是为什么我必须把它变为7,因为EBI指针是2英寸宽,而不是1)我的问题如下,我怎样才能控制哪个参数传递给
shell_code
funcion?即.我怎么写string
来char* c
.整点是通过仅运行程序来执行像ps等的unix命令.我想用写的十六进制表示的EBI指针PS和设置的ARG列表
shell_call
到这一点,但没有奏效.我也试着输入查询argsv
参数和设置的ARG列表shell_call
到arg_list
的为主,但也不能工作.我认为第二个版本应该工作,但是我相信我没有正确设置新的堆栈帧的ARG列表(我这样做是通过写
a[8]
来0
的,因为它的函数指针的第一部分,写a[9]=736c
及a[10]=0000
,但它可能不对,因为那些是参数victim_func
.所以我该如何访问参数shell_call
?
1> SoapBox..:我可能不应该为你做功课.但基本上:
您需要在内存中的某处获取字符缓冲区来存储您要执行的字符串.显然,您可以像调用其他函数一样(即将文本也放在堆栈中).编写完成后,需要在shell_code函数期望找到其参数的位置写入指向堆栈的指针.
在没有我完成所有工作的情况下解决这个问题的最好方法是在一张纸/白板上写下你的堆栈/内存内容.如果从程序内部正常调用shell_code,请记下它的外观.然后在victum_func中写下堆栈的样子,并找出要改变的东西,让它看起来像"自然"一样(当然要记住一些东西"不关心",如返回地址).
这就是你今天要从我这里得到的所有慈善事业!:-P