这是家庭作业,所以我只是想要一个轻推前进。
我有一个已编译的C程序和源代码,其中包含一些空白。我的任务是找到"秘密"使用GDB作为GDB简介的值。我已经在这里工作了几个小时并继续进行。
这是我给出的源代码:
#include<stdio.h>
int gfoo = ;//secret 1
int main()
{
static int sfoo;
int lfoo;
int *dfoo = (int *) malloc (sizeof(int));
sfoo = ;//secret 2
lfoo = ;//secret 3
*dfoo = ;//secret 4
return sfoo + lfoo + gfoo + *dfoo;
}
到目前为止,我已经在GDB中打开了可执行文件。然后我用
打开程序集(gdb) layout asm
然后我在main处设置休息并运行它。然后我可以打印&#34; gfoo&#34;的值。因为它是全局的(p gfoo),但是不能步入程序中的任何一个其他任何&#34;秘密&#34;值是可访问的。帮助
答案 0 :(得分:0)
编写您自己的给定代码版本,但为变量添加已知值。然后运行gdb,键入layout asm
并查找movl
和您指定的值。注意模式。然后加载具有未知值的可执行文件并查看asm布局。模式将是相同的。记下价值观。
#include <stdlib.h>
int gfoo = 1;//secret 1
int main()
{
static int sfoo;
int lfoo;
int *dfoo = (int *) malloc (sizeof(int));
sfoo = 2;//secret 2
lfoo = 3;//secret 3
*dfoo = 4;//secret 4
return sfoo + lfoo + gfoo + *dfoo;
}
¦0x4004d8 <main+1> mov %rsp,%rbp ¦
¦0x4004db <main+4> sub $0x10,%rsp ¦
¦0x4004df <main+8> mov $0x4,%edi ¦
¦0x4004e4 <main+13> callq 0x4003f0 <malloc@plt> ¦
¦0x4004e9 <main+18> mov %rax,-0x8(%rbp) ¦
¦0x4004ed <main+22> movl $0x2,0x200b35(%rip) # 0x60102c <sfoo.2366> ¦
¦0x4004f7 <main+32> movl $0x3,-0xc(%rbp) ¦
¦0x4004fe <main+39> mov -0x8(%rbp),%rax ¦
¦0x400502 <main+43> movl $0x4,(%rax) ¦
¦0x400508 <main+49> mov 0x200b1e(%rip),%edx # 0x60102c <sfoo.2366> ¦
¦0x40050e <main+55> mov -0xc(%rbp),%eax ¦
¦0x400511 <main+58> add %eax,%edx ¦
¦0x400513 <main+60> mov 0x200b0b(%rip),%eax # 0x601024 <gfoo> ¦
¦0x400519 <main+66> add %eax,%edx ¦
¦0x40051b <main+68> mov -0x8(%rbp),%rax ¦
¦0x40051f <main+72> mov (%rax),%eax
请注意movl
说明。
当您运行代码时,您会看到以下内容:
[Inferior 1 (process 49611) exited with code 012]
012是八进制或十进制10。您可以使用该值来验证您的答案。