C printf和get未显示在汇编代码中
我刚从缓冲区溢出开始,当我寻找教程时,每个人都有printf@plt及gets@plt在他们的汇编代码中,但我没有看到他们。我做错什么了吗 源代码:C printf和get未显示在汇编代码中,c,assembly,gdb,buffer,exploit,C,Assembly,Gdb,Buffer,Exploit,我刚从缓冲区溢出开始,当我寻找教程时,每个人都有printf@plt及gets@plt在他们的汇编代码中,但我没有看到他们。我做错什么了吗 源代码: #include <stdio.h> #include <string.h> int main() { char password[16]; int passcheck = 0; void secret(); printf("\nWhat's the password?\n"); gets(password); if
#include <stdio.h>
#include <string.h>
int main()
{
char password[16];
int passcheck = 0;
void secret();
printf("\nWhat's the password?\n");
gets(password);
if (strcmp(password, "password1"))
{
printf("\nYou fail/n");
}
else
{
printf("\nCorrect password\n");
passcheck = 1;
}
if(passcheck)
{
secret();
}
return 0;
}
void secret()
{
printf("\nYou got it!!!\n");
}
#包括
#包括
int main()
{
字符密码[16];
int passcheck=0;
无效秘密();
printf(“\n密码是什么?\n”);
获取(密码);
if(strcmp(密码,“password1”))
{
printf(“\n您失败/n”);
}
其他的
{
printf(“\n正确的密码\n”);
passcheck=1;
}
if(通行证)
{
秘密();
}
返回0;
}
无效机密()
{
printf(“\n您知道了!!!\n”);
}
汇编程序代码:
0x00001e50 <+0>: push %ebp
0x00001e51 <+1>: mov %esp,%ebp
0x00001e53 <+3>: push %edi
0x00001e54 <+4>: push %esi
0x00001e55 <+5>: sub $0x40,%esp
0x00001e58 <+8>: call 0x1e5d <main+13>
0x00001e5d <+13>: pop %eax
0x00001e5e <+14>: lea 0x101(%eax),%ecx
0x00001e64 <+20>: movl $0x0,-0xc(%ebp)
0x00001e6b <+27>: movl $0x0,-0x20(%ebp)
0x00001e72 <+34>: mov %ecx,(%esp)
0x00001e75 <+37>: mov %eax,-0x24(%ebp)
0x00001e78 <+40>: call 0x1f28
0x00001e7d <+45>: lea -0x1c(%ebp),%ecx
0x00001e80 <+48>: mov %ecx,(%esp)
0x00001e83 <+51>: mov %eax,-0x28(%ebp)
0x00001e86 <+54>: call 0x1f22
0x00001e8b <+59>: lea -0x1c(%ebp),%ecx
0x00001e8e <+62>: mov -0x24(%ebp),%edx
0x00001e91 <+65>: lea 0x118(%edx),%esi
0x00001e97 <+71>: mov %esp,%edi
0x00001e99 <+73>: mov %esi,0x4(%edi)
0x00001e9c <+76>: mov %ecx,(%edi)
0x00001e9e <+78>: mov %eax,-0x2c(%ebp)
0x00001ea1 <+81>: call 0x1f2e
0x00001ea6 <+86>: cmp $0x0,%eax
0x00001ea9 <+89>: je 0x1ec8 <main+120>
0x00001eaf <+95>: mov -0x24(%ebp),%eax
0x00001eb2 <+98>: lea 0x122(%eax),%ecx
0x00001eb8 <+104>: mov %ecx,(%esp)
0x00001ebb <+107>: call 0x1f28
0x00001ec0 <+112>: mov %eax,-0x30(%ebp)
0x00001ec3 <+115>: jmp 0x1ee3 <main+147>
0x00001ec8 <+120>: mov -0x24(%ebp),%eax
0x00001ecb <+123>: lea 0x12e(%eax),%ecx
0x00001ed1 <+129>: mov %ecx,(%esp)
0x00001ed4 <+132>: call 0x1f28
0x00001ed9 <+137>: movl $0x1,-0x20(%ebp)
0x00001ee0 <+144>: mov %eax,-0x34(%ebp)
0x00001ee3 <+147>: cmpl $0x0,-0x20(%ebp)
0x00001ee7 <+151>: je 0x1ef2 <main+162>
0x00001eed <+157>: call 0x1f00 <secret>
0x00001ef2 <+162>: xor %eax,%eax
0x00001ef4 <+164>: add $0x40,%esp
0x00001ef7 <+167>: pop %esi
0x00001ef8 <+168>: pop %edi
0x00001ef9 <+169>: pop %ebp
0x00001efa <+170>: ret
0x00001efb <+171>: nopl 0x0(%eax,%eax,1)
0x00001e50:推送%ebp
0x00001e51:mov%esp,%ebp
0x00001e53:推送%edi
0x00001e54:推送%esi
0x00001e55:子$0x40,%esp
0x00001e58:调用0x1e5d
0x00001e5d:pop%eax
0x00001e5e:lea 0x101(%eax),%ecx
0x00001e64:movl$0x0,-0xc(%ebp)
0x00001e6b:movl$0x0,-0x20(%ebp)
0x00001e72:mov%ecx,(%esp)
0x00001e75:mov%eax,-0x24(%ebp)
0x00001e78:调用0x1f28
0x00001e7d:lea-0x1c(%ebp),%ecx
0x00001e80:mov%ecx,(%esp)
0x00001e83:mov%eax,-0x28(%ebp)
0x00001e86:调用0x1f22
0x00001e8b:lea-0x1c(%ebp),%ecx
0x00001e8e:mov-0x24(%ebp),%edx
0x00001e91:lea 0x118(%edx),%esi
0x00001e97:mov%esp,%edi
0x00001e99:mov%esi,0x4(%edi)
0x00001e9c:mov%ecx,(%edi)
0x00001e9e:mov%eax,-0x2c(%ebp)
0x00001ea1:调用0x1f2e
0x00001ea6:cmp$0x0,%eax
0x00001ea9:je 0x1ec8
0x00001eaf:mov-0x24(%ebp),%eax
0x00001eb2:lea 0x122(%eax),%ecx
0x00001eb8:mov%ecx,(%esp)
0x00001ebb:调用0x1f28
0x00001ec0:mov%eax,-0x30(%ebp)
0x00001ec3:jmp 0x1ee3
0x00001ec8:mov-0x24(%ebp),%eax
0x00001ecb:lea 0x12e(%eax),%ecx
0x00001ed1:mov%ecx,(%esp)
0x00001ed4:调用0x1f28
0x00001ed9:movl$0x1,-0x20(%ebp)
0x00001ee0:mov%eax,-0x34(%ebp)
0x00001ee3:cmpl$0x0,-0x20(%ebp)
0x00001ee7:je 0x1ef2
0x00001eed:调用0x1f00
0x00001ef2:xor%eax,%eax
0x00001ef4:添加$0x40,%esp
0x00001ef7:弹出%esi
0x00001ef8:弹出%edi
0x00001ef9:弹出%ebp
0x00001efa:ret
0x00001efb:nopl 0x0(%eax,%eax,1)
通过为C
编译器使用适当的开关编译C
程序,将调试符号添加到二进制文件中。例如,如果您使用gcc
,请使用-g
开关,如下所述:。之后,在gdb
下执行二进制代码时,您将能够看到原始的C
符号名称
关于您的评论-可能您的对象文件不是从头开始重新编译的。如果您使用makefile,或者只是删除所有对象(.o)文件,然后使用-ggdb开关重新编译您的程序,请尝试进行清理(它与-g开关相同,但专门为gdb生成调试信息)。重新编译后,在二进制文件中查找调试信息-两个字符串,如'printf@plt“还有”gets@plt“。通过为
C
编译器使用适当的开关编译C
程序,将调试符号添加到二进制文件中。例如,如果您使用gcc
,请使用-g
开关,如下所述:。之后,在gdb
下执行二进制代码时,您将能够看到原始的C
符号名称
关于您的评论-可能您的对象文件不是从头开始重新编译的。如果您使用makefile,或者只是删除所有对象(.o)文件,然后使用-ggdb开关重新编译您的程序,请尝试进行清理(它与-g开关相同,但专门为gdb生成调试信息)。重新编译后,在二进制文件中查找调试信息-两个字符串,如'printf@plt“还有”gets@plt“.请参见:。运行
字符串-二进制文件,您可能会看到这些函数的字符串。@Jonathan Leffler,这就是重点。OP想要试验溢出的缓冲区。请参阅:。运行字符串-二进制文件,您可能会看到这些函数的字符串。@Jonathan Leffler,这就是重点。OP想要试验溢出的缓冲区。它仍然没有显示它们。我这样做了:gcc-g-fno stack protector-m32-D_FORTIFY_SOURCE=0-o a/Users/Tridie2000/Documents/projecten/CotEditor/simple.c后跟gdb a和disas main可能您的对象文件不是从头开始重新编译的。如果您使用makefiles或只是删除所有对象(.o)文件,然后使用-ggdb
开关重新编译您的程序,请尝试makeclean
(它与-g
开关相同,但专门为gdb
生成调试信息)。顺便说一句:有些printf-s确实会被put取代,即使关闭了优化,它仍然没有显示它们。我这样做了:gcc-g-fno stack protector-m32-D_FORTIFY_SOURCE=0-o a/Users/Tridie2000/Documents/projecten/CotEditor/simple.c后跟gdb a和disas main可能您的对象文件不是从头开始重新编译的。如果您使用makefile,或者只是删除所有对象(.o)文件,然后使用-ggdb
开关重新编译您的程序,请尝试makeclean
(它与-g
开关相同,但专门为gdb
生成调试信息)。顺便说一句:一些printf-s确实会被put取代,即使在优化关闭的情况下。