2017-01-17 4 views
0

Я только что начал с переполнения буфера, и когда я ищу учебники, у каждого есть printf @ plt и получает @ plt в их коде ассемблера, но я их не вижу. Я делаю что-то неправильно?printf и не отображается в коде ассемблера

код Источник:

#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"); 
} 

ассемблерный код:

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) 
+2

См.: [Почему 'gets()' слишком опасно для использования - когда-либо!] (Http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should- это-не-быть использованы). –

+0

Запустите 'strings -a binary', и вы, вероятно, увидите строки для этих функций. –

+0

@ Джонатан Леффлер, вот в чем смысл. OP хочет экспериментировать с переполняющими буферами. – ikegami

ответ

3

Добавить отладочные символы в исполняемые файлы при компиляции программы C с соответствующим переключателем для C компилятора. Например, если вы используете gcc, используйте переключатель -g, как описано here:. После этого вы сможете увидеть оригинальные имена C при выполнении своего двоичного кода под gdb

Относительно вашего комментария - возможно, ваши объектные файлы не были перекомпилированы с нуля. Попробуйте сделать чистым, если вы используете make-файлы или просто удалите все файлы объектов (.o), а затем перекомпилируете свою программу с помощью переключателя -ggdb (это то же самое, что и ключ -g, но генерирует информацию об отладке специально для gdb). После перекомпиляции посмотрите в своем двоичном файле для debug infor - пару строк, таких как 'printf @ plt' и 'gets @ plt'.

+0

Он все еще не показывает их. Я сделал это: gcc -g -fno-stack-protector -m32 -D_FORTIFY_SOURCE = 0 -oa /Users/Tridie2000/Documents/Programmeer-projecten/CotEditor/simple.c, за которым следует gdb a и disas main –

+1

Возможно, ваши объектные файлы weren 'перекомпилирован с нуля. Попробуйте 'make clean', если вы используете make-файлы или просто удаляете все файлы объектов (.o), а затем перекомпилируете свою программу с помощью переключателя' -ggdb' (это то же самое, что и '-g', но генерирует информацию об отладке специально для' gdb') – SergeyLebedev

+0

BTW: некоторые printf-ы заменяются puts, даже с отключением оптимизации. – dbrank0

Смежные вопросы