Избавится от printf , используя таблицу imports в IDA

Тема в разделе "WASM.BEGINNERS", создана пользователем 2Hard2Forget, 12 окт 2019.

Метки:
  1. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    У меня на этом ноуте асм не стоит и решение должно быть без асм, можно узнать , что такое -858993460,-858993460,-858993460 , просто это поможет написать loadlibrary по-другому?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Это машинный код, разбитый на дворды в little endian, преобразованные в десятичные числа со знаком. Преобразованы тупо функцией wsprintfA с маской "%d". По умолчанию гцц подставляет тип int (32-битное число со знаком), другие типы данных без букв будут недоступны. Решение без ассемблерных вставок, без букв, для произвольного С-компилера. Не надо придумывать новые критерии находу, всем заявленным требованиям код соответствует.
     
    Mikl___, M0rg0t и ormoulu нравится это.
  3. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Помнишь, ты написал конвентор? можешь показать его в действии для своей программы, а то у меня нет для запуска асм ничего. А как выглядит такое преобразование ? Я впервые сталкиваюсь с машинным кодом , только про dword(4 байта) и little endian(справа налево) знаю а преобразовывал wsprintf ты в какой-то тестовой программе на Си? То есть как ты подавал значения в эту wsprintf c маской %d ?
     
    Последнее редактирование: 13 окт 2019
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Сначала собирается шеллкод raw.asm в raw.bin (вот этим вот https://flatassembler.net)
    В тексте test1.asm подключен файл raw.bin, нужно только его собрать и вывалить stdout в файл: test1.exe>test1.txt
    И в принципе всё конвертирование на этом закончено.
     
  5. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Хм, а говоришь,что в решении нет ассемблера:). Можешь глянуть мой вопрос про wsprintf выше?
     
  6. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    ТС утверждал что опции компилятора менять нельзя. Хотя может у него снова условия задачи поменялись.
     
  7. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    меня беспокоит, что тут в решении есть ассемблер, а где опции компилятора поменялись? -o ? он же создаст объектный файл
     
  8. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Кроме имени "main" :Ъ
    --- Сообщение объединено, 13 окт 2019 ---
    Фактически таки да, имя входной процедуры искать будет линкер, а не комлилятор, это верно )
     
    2Hard2Forget нравится это.
  9. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    "Ассемблерной вставкой" в си называется вполне определенное явление. Его там нет.
    Про мейн уже было сказано, что можно указать компилеру другую точку входа и что препод согласился main() оставить как есть, опции компилера оставить дефолтные.
    https://access.redhat.com/documenta..._GNU_Compiler_Collection/overall-options.html
    --- Сообщение объединено, 13 окт 2019 ---
    Брал дворд
    Код (ASM):
    1. mov eax,DWORD[binInputData + ebx]
    и передавал wsprintfA просто как аргумент
    Код (ASM):
    1. push arg
    2. ;...
    3. lea eax,[esp + n*4]
    4. push eax
    5. lea eax,[szMessage]
    6. invoke wsprintfA,eax
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    меня беспокоит, что ты сам не знаешь, что хочешь, при этом упорно продолжаешь людям голову совокуплять... тебе бы просто си на базовом уровне освоить для начала, а не это все...
     
  11. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Смогу. Вот мой пример, без шеллкода:
    Код (C):
    1.  
    2. * _7 = 0; // null ptr
    3. _43[] = {1953067607, -1, 1852785509, -1, 1701605235, -1, 65, 65535, 0};
    4. _44[] = {1400137031, -1, 1632134260, -1, 1701602414, -1, 3840, 255, 0};
    5. _45[] = {1953069125, -1, 1668248144, -1, 7566181, -1, 0};
    6. _46[] = {1819043144, 1919899503, 2188396};
    7. * _47 = 0;
    8. _11 = 0;
    9. _12[100];
    10. __10(_1) {
    11.     _12[0] = _1 & 3;
    12.     _11 = _12[0] ? (*(_7 + _1 / 4) >> (_12[0] * 8)) | (*(_7 + _1 / 4 + 1) << ((4 - _12[0]) * 8)): *(_7 + _1 / 4);
    13. }
    14. __8(_1, _2, _3) {
    15.     __10(_2 + (_3 << 3)); _12[3] = _11;
    16.     _12[88] = _12[3] ? (__10(_1 + (_3 << 2)),
    17.         _12[1] = _11, __10(_2 + (_3 << 3) + 4),
    18.         _12[2] = _11, _12[1]  &= _12[2],
    19.         _12[3] &= _12[2],
    20.         _12[3] == _12[1] ? __8(_1, _2, _3 + 1) : 0) : (0, _12[5] = 1);
    21. }
    22. __7(_1, _2) {
    23.     _12[5] = 0;
    24.     __10(_1); _12[1] = _11 + _12[9];
    25.     __8(_12[1], _2, 0);
    26.     _12[88] = _12[5] ? (_12[1] = ((_1 - _12[12]) >> 2),
    27.         __10(_12[13] + (_12[1] << 1)),
    28.         __10(_12[11] + ((_11 & 65535) << 2)),
    29.         _12[5] = _11 + _12[9])
    30.         : __7(_1 + 4, _2), 0;
    31. }
    32. __5(_1) {
    33.     _1 &= 4294963200;
    34.     __10(_1);
    35.     _12[88] = (_11 & 65535) != 23117 ? __5(_1 - 4096) : (
    36.     _12[1] = _1 + 60,
    37.     _12[9] = _1,
    38.     __10(_12[1]), _12[1] = _11 + _1,
    39.     __10(_12[1] + 120), _12[10] = _11 + _1,
    40.     __10(_12[10] + 28), _12[11] = _11 + _1,
    41.     __10(_12[10] + 32), _12[12] = _11 + _1,
    42.     __10(_12[10] + 36), _12[13] = _11 + _1,
    43.     __10(_12[10] + 16), _12[14] = _11,
    44.     __7(_12[12], _43),
    45.     _12[30] = _12[5],
    46.     __7(_12[12], _44),
    47.     _12[31] = _12[5],
    48.     __7(_12[12], _45),
    49.     _12[32] = _12[5]
    50.     );
    51. }
    52. __99(_1, _2) {
    53.     *(_7 + _1 / 4) = _2;
    54. }
    55. __2(_1) {
    56.     _47 = &_1;
    57.     _12[1] = _47[-1];
    58.     __99(&_47[-1], _1);
    59.     __99(&_47[0], _12[1]);
    60. }
    61. __4() {
    62.     __5(_12[99]);
    63.     _12[50] = __2(_12[31], -11);
    64.     __2(_12[30], _12[50], _46, 12, &_12[31], 0);
    65.     __2(_12[32], 0);
    66. }
    67. __3(_1) {
    68.     _1 != 100 ? __3(_1 + 1): 0, *(&_1 - 1) = __4;
    69. }
    70. // set __1 to entry point
    71. __1(_2) {
    72.     _12[99] = *(&_2 - 1);
    73.     __3(0);
    74. }
    75.  
    Компилирую в VC++ 2010:
    vs.png
    Проверил и Debug и Release, с разными оптимизациями, вроде работает.
     
    Последнее редактирование: 13 окт 2019
    ormoulu, 2Hard2Forget и q2e74 нравится это.
  12. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Thetrik, можешь ,пожалуйста , рассказать, как ты это сумел? Тут на васм лс есть? Можно написать в лс?
     
    Последнее редактирование: 13 окт 2019
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    ну раз вы играете по таким правилам, то функция вычисления фибоначчи может быть такой:
    Код (Text):
    1.  
    2. _3 = 0;
    3. _1(_2) {
    4.  _3 = _2 <= 1 ? (1) : _1(_2 - 1) + _1(_2 - 2);
    5. }
    6.  
    сишечка по-умолчанию (если не объявлены) считает типы переменных, возврата функций и аргументов функций интами...
     
    ormoulu и M0rg0t нравится это.
  14. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Я в первом посте написал.
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    да, только это неправильно работает, вот так вроде работает, как надо:
    Код (Text):
    1.  
    2. __1 = 1;
    3. __2 = 1;
    4. __3 = 0;
    5.  
    6. _1(__4) {
    7.  __4 > 2 ? (
    8.  __3 = __2,
    9.  __2 = __2 + __1,
    10.  __1 = __3,
    11.  _1(__4 - 1)) : (0);
    12. }
    13.  
     
    2Hard2Forget нравится это.
  16. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    f13nd,
    Подсистема -> консоль
     
    2Hard2Forget нравится это.
  17. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Я должен dll'ки подгрузить , верно?
    upload_2019-10-14_1-52-38.png
    --- Сообщение объединено, 14 окт 2019 ---
    Я подключил консоль, как ты и сказал, но я не знаю,что делать с ошибками dll, можешь подсказать?
    --- Сообщение объединено, 14 окт 2019 ---
    Мне просто очень хочется разобраться
     
    Последнее редактирование модератором: 14 окт 2019
  18. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Как проект создаете?
     
  19. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Как обычно, открываю VS17, создаю новый проект , в нём выбираю пустой проект и добавляю файл Си в исходные файлы, поменял точку старта на __1 и вывод в консоль, а теперь появились ошибки dll
     
  20. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    Мне одному кажется странным использование в октябре 2019 года любой MSVS, кроме новой(VS2019)?