读书人

C语言中栈有关问题

发布时间: 2013-02-02 12:27:16 作者: rapoo

C语言中栈问题
我想用C语言修改函数的返回值,就是main-》a-》b然后b修改栈中的返回地址直接跳回main函数



#include<stdio.h>
extern int main();
int b(unsigned int a){
unsigned int i = 0;
printf("b start\n");
printf("address[%p] , value[0x%x]\n",(&i - 3),*(&i - 3));
*(&i -3) = a;
printf("address[%p] , value[0x%x]\n",(&i - 3),*(&i - 3));
printf("b end\n");
return 0;
}
int a() {
unsigned int a = 1;
printf("a start\n");
printf("address[%p] , value[0x%x]\n",(&a - 1),*(&a-1));
printf("address[%p] , value[0x%x]\n",(&a - 2),*(&a-2));
printf("address[%p] , value[0x%x]\n",(&a - 3),*(&a-3));
b(*(&a - 3));
printf("a end \n");
return 1;
}

int main() {
printf("a %p\n",a);
printf("main %p\n",main);
a();
printf("main end\n");
return 0;
}

[解决办法]
b修改栈中的返回地址直接跳回main函数
b哪里修改了?
[解决办法]
C语言本身有提供这样的功能吗?用汇编搞搞试试呢
[解决办法]
看一下编译时加GS没
[解决办法]
先看下汇编b(*(&a - 3));&a-3是不是main的返回值,而且在b中没有看到你对他的修改
[解决办法]
仅供参考
#include <stdio.h>
#include <setjmp.h>
jmp_buf mark;
int i=0;
void c() {
printf( "c in\n");
if (1==i%2) longjmp( mark, i );
printf( "c out\n");
}
void b() {
printf( "b in\n");
c();
printf( "b out\n");
}
void a() {
printf( "a in\n");
b();
printf( "a out\n");
}
void main( void )
{
int jmpret;
jmpret = setjmp( mark );
printf( "Start %d\n",jmpret);
if( jmpret == 0 ) {
printf( "First\n");
a();
i++;
a();
} else {
printf( "Second\n");
}
}
//Start 0
//First
//a in
//b in
//c in
//c out
//b out
//a out
//a in
//b in
//c in
//Start 1
//Second
//

[解决办法]
2次ebp,是为了16字节对齐

3*4比较靠谱些
[解决办法]
引用:
引用:仅供参考C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <stdio.h>#include <setjmp.h>jmp_buf mark;int i=0;void c……


我知道有setjmp这个库,但是我想在就想知道,为什么直接修改栈的返回值不能跳过a函数字节返回到main中。


搜“栈平衡”

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!


[解决办法]
引用:
仅供参考C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <stdio.h>#include <setjmp.h>jmp_buf mark;int i=0;void c() { printf( "c in\n……

赵老师 用嵌入式汇编如何解决?
[解决办法]
引用:
引用:引用:仅供参考C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <stdio.h>#include <setjmp.h>jmp_bu……

赵老师 顺便看下我的问题http://bbs.csdn.net/topics/390336432

读书人网 >C语言

热点推荐