Вопросы_по_переполнению

Тема в разделе "WASM.BEGINNERS", создана пользователем under, 7 окт 2006.

  1. under

    under New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2006
    Сообщения:
    9
    Решил так сказать осовить тему переполнения, и вот, что мне интерсено, каким образом узнать, когда стек полностью переполнится, т.е. например я объявил переменную mess типа char емкостью 10, т.е. char mess[10], так вот опытным путем, выяснил, что переполнение произойдет после заполнения этой переменной 29 символами, так вот вопрос, можно это как-то вычислить не подставляя значения, или как?

    Код (Text):
    1. #include <stdio.h>
    2.  
    3. void main(int argc, char *argv[]) {
    4. char mess[10] = "";
    5. strcpy(mess, argv[1]);
    6. printf("You entered: %c\n", argv[1]);
    7. }
    далее компилю:
    cc buff.c -o buff
    ну и запускаю:
    1) ./buff shit
    You entered: shit

    2) ./buff `perl -e 'print "A" x 11'`
    You entered: AAAAAAAAAAA

    3)2) ./buff `perl -e 'print "A" x 12'`
    You entered: AAAAAAAAAAAA

    и т.д.
    потом:
    ./buff `perl -e 'print "A" x 29'`
    You entered: AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    Segmentaion fault (core dumped)

    вот так...

    еще вопрос, например я переполняю этими символами стек, и штобы в eip записать адрес куда нужно перейти мне нужно дописать к 29 символам (во всяком случае в Lin), еще 4, так вот в коде у меня есть ф-я, которая не вызывается, я узнал адрес 00402000, так вот что мне писать после 29 символов, не просто же 00402000, это нужнно как-то перевести, а вот как, плиз выручайте...
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    under
    Читай статьи и книгу о переполнении буфера, много вопросов отпадут. Книга лежит в документах на сайте.
     
  3. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Байты в обратном порядке, т.е. 00402000 -> 00204000. Их нужно записать вместо адреса возврата, т.е. в [ebp + 4] для stdcall и в [esp] для C.
     
  4. under

    under New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2006
    Сообщения:
    9
    to koderr, я имею ввиду как их преобразовать, если писать адрес непосредственно в командной строке...
    to IceStudent я читал http://www.wasm.ru/print.php?article=1020001, к сожалению не все понял...
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    спрашивай что не понял :)
     
  6. under

    under New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2006
    Сообщения:
    9
    напрмер я делаю так:
    ./buff `perl -e 'print "A" x 29'`
    You entered: AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    Segmentaion fault (core dumped)

    если написать так:
    ./buff `perl -e 'print "A" x 29'`ZZZZ
    то в eip попадет в hex Z, так вот в проге есть ф-я, ее адрес 00402000, как мне преобразовать его, чтобы вписать в командной строке, или как написать эксплойт??
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Точнее, не книга (книга у Касперски) - сборкник статей.

    Боюсь, ввести адрес с командной строки не выйдет - нужны байты 00,20,40,00, а си-строки оканчиваются нулём. Придётся вводить код только теми байтами, которые не имеют нуля.
     
  8. under

    under New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2006
    Сообщения:
    9
    т.е. если бы в адресе не было бы нулей, то можно было бы ввести с ком. строки?
    thx for stack.zip )
     
  9. under

    under New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2006
    Сообщения:
    9
    Объясните плиз зачем в начале проге делается следующее:
    push ebp
    mov ebp esp
    ?
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Это определяется стековый кадр. Чтоб потом можно было обращатся к переменным и параметрам через ebp. Почитай Зубкова.
    Ну там ещё некоторые символы есть, например 0x0D.