|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- void add()
- {
- std::cout << "add"<<std::endl;
- }
- int a()
- {
- int integer{};
- std::cout << "请输入一个整数:";
- std::cin >> integer;
- return integer;
- }
- int b()
- {
- int i{};
- int i2{};
- int i3[10]{};
- do
- {
- i3[i] = a();
- i2 =i2+ i3[i];
-
- } while (i3[i++]);
- return i2;
- }
- int main()
- {
-
- std::cout << "\n add地址 \n\n " << add << std::endl;
- std::cout << "\n b地址 \n\n " << b << std::endl;
- std::cout << "\n a地址 \n\n " << a<< std::endl;
- std::cout << b();
- }
复制代码
- 00A61063 83 EC 34 sub esp,34h
复制代码
大佬们帮忙看看,要利用b()来调用add函数,利用数组越界第15次输入地址为什么还不能覆盖call返回的地址?下面是我的分析的数据,汇编太多就算了。
10000
10004 1 EAX([0])
10008 2 EAX([1])
1000C 3 EAX([2])
10020 4 EAX([3])
10024 5 EAX([4])
10028 6 EAX([5])
1002C 7 EAX([6])
10030 8 EAX([7])
10034 9 EAX([8])
10038 10 EAX([9])
1003C 11 输入的值
10040 12 和
10044 13 循环的次数
10048 14 CALL前的EBP
1004C 15 CALL返回的地址
- #include <iostream>
- #include <string.h>
- void add()
- {
- int i;
- std::cout << "Hello,World"<<std::endl;
- std::cin >> i;
- }
- int a()
- {
- int integer;
- std::cout << "请输入一个整数:";
- std::cin >> integer;
- return integer;
- }
- int b()
- {
- //调整变量定义顺序,把数组定义在前面,不会在越界的时候覆盖计数器 i
- int i3[10];
- int i = 0;
- int i2 = 0;
- int * p = i3 +10;
- std::cout << "栈内容:" <<std::endl ;
-
- //把栈的内容输出,以便找到函数返回地址
- for(i=0 ; i< 5 ; i++)
- {
- std::cout << "[" << p << "]" << (int*)*p << std::endl;
- p++;
- }
-
- i = 0;
- do
- {
- //输出数组地址,与前面输出对比,确认你要覆盖的是返回地址
- std::cout << "[" << &i3[i] << "]";
- i3[i] = a();
- i2 =i2+ i3[i];
-
- } while (i3[i++]);
- return i2;
- }
- int main()
- {
- //输出十进制函数地址
- std::cout << "add地址:" << add << " " << (int)add << std::endl;
- std::cout << "b地址:" << b << " " << (int)b << std::endl;
- std::cout << "a地址:" << a << " " << (int)a<< std::endl;
- std::cout << b();
-
- return 0;
- }
复制代码
|
|