Tôi đã xem xét các khái niệm cơ bản về lỗ hổng tràn bộ đệm và cố gắng hiểu cách ngăn xếp hoạt động. Đối với điều đó tôi muốn viết một chương trình đơn giản thay đổi địa chỉ của địa chỉ trả về thành một số giá trị. Ai có thể giúp tôi với việc tìm ra kích thước của con trỏ cơ sở để có được bù đắp từ đối số đầu tiên?Sửa đổi địa chỉ trả về trên ngăn xếp
void foo(void)
{
char ret;
char *ptr;
ptr = &ret; //add some offset value here
*ptr = 0x00;
}
int main(int argc, char **argv)
{
foo();
return 1;
}
Mã lắp ráp được tạo ra trông như sau:
.file "test.c"
.text
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
leaq -9(%rbp), %rax
movq %rax, -8(%rbp)
movq -8(%rbp), %rax
movb $0, (%rax)
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
call foo
movl $1, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (GNU) 4.7.1 20120721 (prerelease)"
.section .note.GNU-stack,"",@progbits
Phần liên quan của phân khúc khung foo sẽ trông như thế này:
[char ret] [con trỏ cơ sở] [địa chỉ trả lại ]
Tôi có vị trí đầu tiên chỉ có kích thước 1 byte. Có phải chỉ thêm 1 byte vào con trỏ cơ sở hoặc kích thước của từ như được đề cập trong http://insecure.org/stf/smashstack.html? Và làm cách nào để tôi biết kích thước của con trỏ cơ sở?
+1 Biên dịch lại luôn có thể di chuyển các biến. Chỉ để kiểm tra OP, trong trường hợp cụ thể này địa chỉ trả về là '& ret + 17', điều này không có khả năng thay đổi miễn là các biến cục bộ trong hàm đó không thay đổi. – ughoavgfhw
offset của 17 tác phẩm. bạn có thể giải thích làm thế nào bạn xác định nó? – fliX
@fliX Trong assembly, lệnh 'leaq -9 (% rbp),% rax' đang lấy địa chỉ trên ngăn xếp. Vì nó được sắp xếp theo byte và chỉ tính toán địa chỉ, đó phải là vị trí 'ret'. Lấy 9 và thêm 8 cho con trỏ cơ sở 64 bit trước đó, bạn nhận được 17. – ughoavgfhw