HWitty 发表于 2023-7-13 14:53:08

汇编代码求解-2

https://wodetu.cn/image/TElgu图片链接


问题1:开头的argc = dword ptr 4
                     argv = dword ptr 8
                     envp = dword ptr 0c                  是它们在栈中的位置吗?如果不是,那它是什么意思。


问题2:的意思不是取这个相加地址的值吗?把它给ecx,为啥就是argv了?   难道ecx里面是地址?只有地址+4才指向下一个的嘛。


问题3:or ,bl          咋就变成    二维数组   argv   |=   argc-1

陶远航 发表于 2023-7-13 14:53:49

问题1:argc = dword ptr 4, argv = dword ptr 8, envp = dword ptr 0c 是指示这些变量在栈中的位置。具体来说,dword ptr 是数据类型说明符,表示这些变量是32位的双字(即4字节)指针。

问题2: 表示在栈指针 esp 的基础上,偏移 10h(16字节)加上 argv 的值,得到一个内存地址。然后将该地址存储在寄存器 ecx 中。 表示取 ecx 寄存器中的值,加上偏移 4 得到的地址上存储的数据,即 argv 数组的第一个元素。

在这个上下文中,ecx 确实保存了一个地址,它是由 计算得出的。通过将这个地址存储在 ecx 中,然后使用 可以访问 argv 数组的第一个元素。

问题3:or ,bl 表示将寄存器 edx 指定的内存地址上的值与寄存器 bl 的值进行按位或运算,并将结果存储回 edx 指定的内存地址。在这种情况下,edx 存储的是 argv 的地址,bl 存储的是 argc-1 的值。

因此,这条指令实际上是将 argv(即 argv 数组的第一个元素)与 argc-1 进行按位或运算,并将结果存储回 argv 的地址中。这可能是在某种特定的上下文中进行的逻辑操作。

希望能够解答你的问题!如果还有其他问题,请随时提问。

sfqxx 发表于 2023-7-13 14:55:46

问题1:是的,这些是传递给程序的命令行参数的位置。

问题2: 是一个计算出来的地址,它指向 argv 数组的第一个元素。将该地址加载到 ecx 寄存器中之后, 实际上是指向 argv 的指

针。因为 argv 数组中的每个元素都是指向以 null 结尾的字符串的指针,所以这个指针实际上指向了 argv 的第一个字符。

问题3:在这段代码中,edx 实际上指向 argv 字符串的第一个字符。or , bl 指令将 edx 指向的字节与 bl 寄存器中的值进行按位或运算,然后将结果

存储回 edx 指向的位置。由于 bl 中存储的是 argc-1,所以这条指令实际上将 argv 的值与 argc-1 进行了按位或运算。因此,argv |= argc-1 中的 |=

表示按位或运算并将结果存储回原地址。

求最佳答案{:10_254:}

HWitty 发表于 2023-7-13 15:07:10

陶远航 发表于 2023-7-13 14:53
问题1:argc = dword ptr 4, argv = dword ptr 8, envp = dword ptr 0c 是指示这些变量在栈中的位置。具体 ...

问题2: 表示在栈指针 esp 的基础上,偏移 10h(16字节)加上 argv 的值,得到一个内存地址。然后将该地址存储在寄存器 ecx 中。 表示取 ecx 寄存器中的值,加上偏移 4 得到的地址上存储的数据,即 argv 数组的第一个元素。



上面加粗加下划线的地方是不是少了:   对这个内存地址取值这步操作,,因为 [] 这个符号不是有取值的意思吗,那么得到的一个地址,并对它取值,取出来的值只不过是个地址,然后把这个取值出来的地址放到ecx中,所以意思就是:地址+4指向下一个元素。


可以这样理解吗?

陶远航 发表于 2023-7-13 15:15:19

HWitty 发表于 2023-7-13 15:07
问题2: 表示在栈指针 esp 的基础上,偏移 10h(16字节)加上 argv 的值,得到一个内存地 ...

你的理解是正确的, 的确是对一个内存地址取值,然后将这个值(也是一个地址)存储在 ecx 中。我之前的回答可能没有写得很清楚,抱歉。你可以这样理解:

= *(esp + 10h + argv) // 取内存地址上的值,用 * 表示 ecx = // 将这个值(也是一个地址)赋给 ecx = *(ecx + 4) // 取 ecx 中的值(也是一个地址)加上 4 的内存地址上的值 = argv // 等价于 argv 数组的第一个元素

希望这样能够让你更清楚地理解。如果还有其他问题,请随时提问。
页: [1]
查看完整版本: 汇编代码求解-2