x64dbg中内存窗口的疑问
起因是在看逆向教程时,老师提到了:有些时候在提示窗口的字符串旁边就是密码。我根据这个说法想要进行一个尝试,#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int Key = 0;
printf("输入密码:");
scanf("%d",&Key);
if(Key == 123456)
puts("Ture");
else
puts("Flase");
system("pause");
return 0;
}
这是小程序的代码,经过编译后运行无误之后用dbg打开,用户模块搜索字符串
这一步很轻松的就找到了,只是一个普通的程序,随后我转到内存窗口
内存窗口中没有找到字符串,我不太明白这是什么原因所以想要请问一下() 因为你使用整型(int)来对比密码,而不是字符串。
通常进行字符串对比的时候,堆栈可以看到函数的变量值。因此出现错误弹窗的时候,如果没有清理该变量,就能看到。
64 位的程序又有点不同,因为寄存器多,可能会将变量存储到某个寄存器中。不过看你截图你编译的还是 32 位程序,和这个应该关系不大。 爱飞的猫 发表于 2024-4-21 17:38
因为你使用整型(int)来对比密码,而不是字符串。
通常进行字符串对比的时候,堆栈可以看到函数的变量 ...
感谢,不过似乎这个程序还是一个64位程序,至少默认打开的是x64dbg,我阅读了你的回复后了解到了因为我是使用int类型进行判断,所以导致引发的疑惑,随后我对代码进行了更改
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char str;
char key[] = "123456";
char t[] = "Ture";
char f[] = "Flase";
printf("Key");
scanf("%s",&str);
if(!strcmp(str,key))
printf("%s\n",t );
else
printf("%s\n",f );
system("pause");
return 0;
}
编译成功以后我对这个程序进行了调试
(如果你说为什么我把Flase和Ture都写成变量的话,主要是第一次我没有意识到我输入的密码
也会写入。所以添加了这两个变量在printf调用之前读取的时候我能够找到位置)
搜索->所有用户模块->跨模块调用
我搜索printf的调用找到了判断点,然后下断点(如图)
随后向后跟进了几步,printf调用前读取了f字符串,我对f字符串转到内存窗口看到了
后续就是我设置的密码和t字符串的内容,我也发现了我输入的字符串12345在这个的后面,第二次修改我将ture和flase设为常量,
在判断点前暂停,在栈窗口中我发现了我输入的内容,
随后就是转到内存窗口,也看到了位于我输入字符串前设置的密码。
但是还有一个问题能问一下么?
在我使用ce的时候,一般对一个变量打开内存布局首位都是这个变量。但是在使用x64dbg时转到内存窗口开头并不是我选中的内容(就像上面内存窗口,
我是点击Flase转到内存窗口的,但是实际上Flase的内容在内存窗口的中间。对于这里我有一点疑惑。
char t[] = "Ture";
ture ??? 不是true????? sbwfnhn 发表于 2024-4-22 16:24
char t[] = "Ture";
ture ??? 不是true?????
az,记错了 richard_ljd 发表于 2024-4-22 10:52
感谢,不过似乎这个程序还是一个64位程序,至少默认打开的是x64dbg,我阅读了你的回复后了解到了因为我是 ...
因为 x64dbg 的内存视图(memory dump)的地址是对齐到 0x10。ce 的这个地方可以不对齐。
我不清楚有没有选项可以改变这一行为。
页:
[1]