проблема с экплойтом

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by KwKeeper, 27 Oct 2009.

  1. KwKeeper

    KwKeeper New Member

    Joined:
    21 Oct 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    пишу эксплойт , вызывающий переполнение буфера, программа читает буфер и устанавливает eip = ss:[len+6] ; тут то и проблема если я задаю адрес 0x2122f5f5 то он записывает в eip(но это не правильный адрес), если я записываю 0x0022f5f5 то он почему то не учитывает 0х00 а вместо него берет 0x2c. почему?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    всмысле не учитывает? ты смотри на память. Что кидаеш в буфер и что попадает в стек. Возможно на какомто этапе перезатирается значение (такое часто бывает когда функция юзает локальные переменные).
     
  3. KwKeeper

    KwKeeper New Member

    Joined:
    21 Oct 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    да втом то и дело что смотрел!!!!!!!!!
    уже голову сломал ап стену!!!!!!!!!!!!!!!!!! :mad:

    причем странно если я пишу адрес возврата 0x0022f55f то eip становится 2C22F55A
    если 0xyy22f55f то yy22F55A
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    скорее всего тогда просто идет работа со стеком, где эти данные и изменяются
    ты сделать проверку чтобы был адрес eip
    1) 00 00 00 00 - увидиш что меняется
    2) FF FF FF FF - аналогично предыдущему, но чуть по другому
    3) 60 70 80 90 / 90 80 70 60- если вдруг чтото конвертится. т.е. бывает случае когда конвертятся некоторые символы алфавита. Чтото типа UTF8 кодировки
    тут ты и провериш на какие символы влияет это. если вообще дело в этом
     
  5. KwKeeper

    KwKeeper New Member

    Joined:
    21 Oct 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    1) 00 00 00 00 получаю 696e202c
    2) FF FF FF FF получаю FF FF FF FF
    3) 60 70 80 90 / 90 80 70 60 получаю 60 70 80 90 / 90 80 70 60

    ему однозначно не нравится 0 байт))
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    судя по всему дело обстоит так:
    Уязвимая функция определяет длину строки и в конце неё дописывает другие данные.
    В твоем случае часть этого текста - "in ,"

    p.s. а зачем тебе именно настолько нижние адреса?
     
  7. KwKeeper

    KwKeeper New Member

    Joined:
    21 Oct 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    и что делать?

    я с начало вшил шеллкод в буфер(он 0..1024)
    программа обращается к [1030] за адресом. но т.к. у меня в шеллкоде содержатся \х00 то из-за них не возникало ошибки.
    я взял по адресу [1030] разместил адрес на [1031] куда и положил шеллкод.
    адрес я беру из olly'ки смотрю где расположен шеллкод и на него ссылаюсь . вот код

    int handling(SOCKET c)
    {
    char buffer[BUFFER_SIZE], name[NAME_SIZE];
    int bytes;
    strcpy(buffer, "My name is: ");
    bytes = send(c, buffer, strlen(buffer), 0);
    if (bytes == -1)return -1;
    bytes = recv(c, name, sizeof(name), 0);
    if (bytes == -1)return -1;
    name[bytes - 1] = '\0';
    sprintf(buffer, "Hello %s, nice to meet you!\r\n\0", name);
    bytes = send(c, buffer, strlen(buffer), 0);
    if (bytes == -1)return -1;
    return 0;
    }

    p.s. я только начинаю разбираться в этом. статьи которые читал(их не так много) с ошибками идут.
     
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    sprintf(buffer, "Hello %s, nice to meet you!\r\n\0", name);

    ну вот собственно говоря где оно и затирается )
    алгоритм работы такой:
    1) в буфер запишется строка "Hello "
    2) к нему прибавится всё что есть в name до первого 0x00
    3) к полученному тексту прибавятся данные ", nice to meet you!\r\n\0"

    вот теперь из последней строки возьми 4 байта и разверни их наоборот
    ", ni" = "in ," и ты получаешь то, о чем я говорил. что они затираются. так что в полюбому затрутся данные начиная с 0x00 по этому придется както ухитрится и не юзать 0
     
  9. KwKeeper

    KwKeeper New Member

    Joined:
    21 Oct 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    да я это уже увидел.
    а можешь подкинуть ссылки где решается эта проблема?
     
  10. KwKeeper

    KwKeeper New Member

    Joined:
    21 Oct 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    это вообще возможно?!??!?!?!
    я представляю как можно избавить сам шеллкод от нулей, но как адрес?!?!
    ведь мы же не можем ничего с ним сделать, и он должен указывать на наш код.
     
  11. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    возможно, но только это будет ооочень похоже немецкое порно )))
    Да и не забывай что данные находятся в стеке, а стек может иметь переменное местожительство.
     
  12. KwKeeper

    KwKeeper New Member

    Joined:
    21 Oct 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    так в каком направлении двигаться?
    если по адресу [1030] лежит адрес, я не могу ни чего другого записать кроме адреса, если бы туда можно было запихнуть инструкцию или как то сдвинуть все то тогда я понимаю. Причем все функции работающие со строками они не предоставляют возможность пропустить 0 байт
    я ума не приложу как это сделать.
    причем адреса в винде все начинаются с 00.

    разве положение данных в стеке не одно и тоже?
    я сколько раз запускал адрес не меняется.
    вернее адрес на начало стека программе выдается всегда один и тот же .
    или я что то путаю?!?