首页
社区
课程
招聘
c++语法问题咯
发表于: 2016-12-26 15:44 3717

c++语法问题咯

2016-12-26 15:44
3717
在汇编中,函数的一个参数是eax,但是函数中会读[eax+8]这个值,此时[eax+8]=b

我需要在c++中模拟这个函数,所以我需要传入参数eax,(我定义成 int a ,并且要使[a+8]=b)

但是怎么在c++中写[a+8]=b?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 31
活跃值: (44)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
这种内存相关的你需要反汇编看编译器怎么分配内存的,在函数中的局部变量可能被编译器打乱了,所以你这里的[eax+8] 是一个不确定的位置,下面是我的一个思路。
假设申请变量的时候,编译器按照内存地址从低到高的顺序分配变量(具体顺序我忘记了)。
int x, y, z;   // 假设这里 x 的地址是0,y的地址就是4,z的地址就是8
int a = &x;  // 这里,a的值就是x的地址,[a+8] 寻址到的变量就是z
z = b;

那么[a+8] 就能得到z的值。

这里是很明显的指针运算,注意指针运算的类型。
2016-12-26 16:33
0
雪    币: 291
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=character;1458666]这种内存相关的你需要反汇编看编译器怎么分配内存的,在函数中的局部变量可能被编译器打乱了,所以你这里的[eax+8] 是一个不确定的位置,下面是我的一个思路。
假设申请变量的时候,编译器按照内存地址从低到高的顺序分配变量(具体顺序我忘记了)。
int x, y, z;   // 假设这里 x 的地址是...[/QUOTE]

谢谢,完美解决
2016-12-26 16:51
0
雪    币: 102
活跃值: (142)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
楼上给出的方案在大多数的情况下是没有问题的,但是可能会因为编译器的优化会对变量进行删减,可能会出现问题。
正确的做法应是创建类或结构体。以首个成员向后偏移。
2016-12-26 17:03
0
雪    币: 31
活跃值: (44)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
确实,我忘记了编译器优化的问题。创建类或者结构体的方法可以保证中间长度是8,但是还需要保证这个结构没有被编译器优化了。这种黑方法在工程上还是尽量少用为好。
2016-12-27 17:38
0
雪    币: 291
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=character;1458666]这种内存相关的你需要反汇编看编译器怎么分配内存的,在函数中的局部变量可能被编译器打乱了,所以你这里的[eax+8] 是一个不确定的位置,下面是我的一个思路。
假设申请变量的时候,编译器按照内存地址从低到高的顺序分配变量(具体顺序我忘记了)。
int x, y, z;   // 假设这里 x 的地址是...[/QUOTE]

接下来又遇到问题了,用了你的定义,然后a作为参数传给函数,一切看上去都没问题,结果,函数里面会出现一个代码, 读取地址 a+0x12的值,然后秀逗了, 因为 a的内存段都是存的都是变量的地址,都是4字节4字节,a+0x12, 0x12不是4的倍数,然后第二点,要是我定义了一个新数据,又会往a的内存段写入一个新值,又会和函数代码冲突了!  不知道我说明白问题没有..
2016-12-30 18:40
0
雪    币: 31
活跃值: (44)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
如果方便的话请贴出来c代码和汇编代码,告知编译环境,因为这些跟环境强相关,没法直接回复。

如果不方便的话还请留下联系方式我们再讨论。
2017-1-3 13:18
0
雪    币: 291
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
以前的写法是
unsigned char 接受包 [ ] = { 0xFD , 0xFF , 0xB0 , 0x37 , 0xF5 , 0x00 , 0x00 , 0x09 , 0x10 , 0x03 , 0x4E , 0x9D };
unsigned char 发送包 [ ] = { 0xFD , 0xFF , 0xD3 , 0x96 , 0x29 , 0x00 , 0x05 , 0x06 , 0x19 , 0xF6 , 0x01 , 0xAC , 0xAC };
struct {
        int 凑数;
        int 凑数2;
        int 凑数3;
        int 凑数4 [ 0x5A1 ];
        int 凑数5;
        int 凑数61;
        int 凑数62;
        int 凑数6;
        int 凑数63;
        int 凑数64;
        int 凑数7;
}student1 = {省略};
student1.凑数5 = ( int ) &发送包;
student1.凑数6 = ( int ) &接受包;
int a = &student1.凑数1;  // 这里,[a+8] 寻址到的变量就是 student1.凑数3
//作为参数传进如下函数
sub_68CBE0 ( int(a), ( int ) &_7D0000 [ 0x1B9C ] , ( int ) &_7D0000 [ 0x201C ] );
//但是函数里面需要读[a+5778],发现5778不是4的倍数,student1里面都是int类型

-------------------------------------------------------------------------------------------------------
第二种
//如下就OK了, 把a定义成了数组.

unsigned char a[ ] = {
                0x94 , 0x9E , 0x18 , 0x00, 0x9E , 0x18 , 0x00, 0x9E , 0x18 , 0x00,......(太长,省略,有6000个数据)};
        int *z = (int *)&接受包;
        memcpy ( &a[ 8 ] , &z , 4 );//覆盖[a+8]
        int *z2 = ( int * ) &发送包;
        memcpy ( &a[ 5778 ] , &z2 , 4 );//覆盖[a+5778],其实不止8和5778,还有好几个
//作为参数传进如下函数
sub_68CBE0 ( int(a), ( int ) &_7D0000 [ 0x1B9C ] , ( int ) &_7D0000 [ 0x201C ] );

第二种,我定义成数组解决了,函数调用也正常, 感觉第一种其实也OK,定义结构体,得凑多少数啊,头晕了, 我的Q 11689421
2017-1-3 17:16
0
雪    币: 31
活跃值: (44)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=浅滩晓海;1459729]以前的写法是
unsigned char 接受包 [ ] = { 0xFD , 0xFF , 0xB0 , 0x37 , 0xF5 , 0x00 , 0x00 , 0x09 , 0x10 , 0x03 , 0x4E , 0x9D };
unsigned char 发送包 [ ] = { 0xFD...[/QUOTE]

加你QQ了 我们QQ聊
2017-1-4 19:39
0
游客
登录 | 注册 方可回帖
返回
//