Mình đang test thử cái lỗi Buffer Overflow trên linux mà chạy shell code không được:
Chương trình mình đơn giản như sau :
#include <stdio.h>
void notcall()
{
}
int main(){
char buffer[6];
return 0;
}
dịch ra file asm:
g++ a.cpp -o asm
Nếu mình nhập chuỗi lớn cho buffer thì dữ liệu tràn khỏi bộ nhớ
khi dùng gdb disassemble hàm notcall
gdb disassemble notcall :
0x080484ea <_Z7notcallv+0>: push %ebp
0x080484eb <_Z7notcallv+1>: mov %esp,%ebp
0x080484ed <_Z7notcallv+3>: sub $0x8,%esp
0x080484f0 <_Z7notcallv+6>: movl $0x80485e0,(%esp)
0x080484f7 <_Z7notcallv+13>: call 0x80483b0 <printf@plt>
0x080484fc <_Z7notcallv+18>: mov $0x0,%eax
0x08048501 <_Z7notcallv+23>: leave
0x08048502 <_Z7notcallv+24>: ret
trong linux có lệnh printf để in ra màn hình.trong option của lệnh này có xHH để xuất ra dạng HEX.
0x080484ea là địa chỉ đầu 1 hàm.
Nhưng em không chạy được hàm notcall bằng cách viết :
Code:
printf "AKJHFAKHFKAGFAKF\xea\x84\x04\x08" | ./asm
nhưng nó không chạy được hàm notcall :(
Theo tớ biết thì HDH thì có 2 cách quản lý bộ nhớ là phân segment và paging.Các Cpu đời cũ dùng các
thanh ghi 16bit thì phải phân segment rồi(do đó mới có các thanh ghi segment),còn các CPU thế hệ mới(32bit-64bit) thì trên linux dùng kiểu nào,trên windows dùng kiểu nào?hay là dùng cả 2 cái theo từng trường hợp cụ thể :-?