所以我正在GDB中调试我的随机游戏,以打破如何轻松猜数字。我在代码中引用的行是:winning_number= (rand() % 20) + 1在我分解函数后,它看起来像这样:的数据所以红色下划线是一条指令,我认为它将值存储在EAX寄存器中。如何检查它的值来查找兰德()函数返回的数字?我需要(gdb)指令集。
winning_number= (rand() % 20) + 1
nvbavucw1#
C中的rand返回%eax中的int。您可以使用print $eax命令在GDB中查看其值。参见GDB手册的Examining Data部分。该值仅在对rand的调用完成后且在执行mov $0x66666667,%eax指令之前有效,因此您可能希望使用stepi或nexti命令单步执行程序,或者在地址*0x08049019处设置断点。红色下划线的是一条指令,我认为它将值存储在EAX寄存器中mov %eax,%ecx将保存在%eax中的值复制到%ecx。
rand
print $eax
mov $0x66666667,%eax
stepi
nexti
*0x08049019
mov %eax,%ecx
c90pui9n2#
我解决了这个问题:我是这样分解的。我发现整个指令winning_number=(rand() %20) + 1被反汇编成这样:的数据在底部行中,在EAX寄存器中有一个输出就绪,并且它被移动到winning_number值的地址(红色下划线)。根据建议,我在地址 *0x804903b处添加了一个断点。
winning_number=(rand() %20) + 1
2条答案
按热度按时间nvbavucw1#
C中的
rand
返回%eax中的int。您可以使用print $eax
命令在GDB中查看其值。参见GDB手册的Examining Data部分。该值仅在对
rand
的调用完成后且在执行mov $0x66666667,%eax
指令之前有效,因此您可能希望使用stepi
或nexti
命令单步执行程序,或者在地址*0x08049019
处设置断点。红色下划线的是一条指令,我认为它将值存储在EAX寄存器中
mov %eax,%ecx
将保存在%eax中的值复制到%ecx。c90pui9n2#
我解决了这个问题:
我是这样分解的。我发现整个指令
winning_number=(rand() %20) + 1
被反汇编成这样:的数据
在底部行中,在EAX寄存器中有一个输出就绪,并且它被移动到winning_number值的地址(红色下划线)。根据建议,我在地址 *0x804903b处添加了一个断点。