鱼C论坛

 找回密码
 立即注册
查看: 1415|回复: 4

[已解决]汇编代码求解-2

[复制链接]
发表于 2023-7-13 14:53:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


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


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


问题3:or [edx],bl          咋就变成    二维数组   argv[1][0]   |=   argc-1
最佳答案
2023-7-13 14:55:46
问题1:是的,这些是传递给程序的命令行参数的位置。

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

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

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

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

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

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-13 14:53:49 | 显示全部楼层

回帖奖励 +1 鱼币

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

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

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

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

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

希望能够解答你的问题!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-13 14:55:46 | 显示全部楼层    本楼为最佳答案   
问题1:是的,这些是传递给程序的命令行参数的位置。

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

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

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

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

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

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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+argv] 表示在栈指针 esp 的基础上,偏移 10h(16字节)加上 argv 的值,得到一个内存地址。然后将该地址存储在寄存器 ecx 中。[ecx+4] 表示取 ecx 寄存器中的值,加上偏移 4 得到的地址上存储的数据,即 argv 数组的第一个元素。



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


可以这样理解吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

希望这样能够让你更清楚地理解。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 12:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表