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

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

Метки:
  1. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Этот вопрос - продолжение этого . Вроде становится яснее , что избавится от printf возможно, используя таблицу импортов. То есть я понимаю, что нужна ucrtbased.dll и мне нужно её подключить в программе своей(возможно используя LoadLibrary). Я диззасемблировал свой .exe в IDA , и нашел __stdio_common_vfprintf_0 и __stdio_common_vsprintf_s_0 . Они должны мне как-то помочь избавится от printf в оригинальной программе(то есть проанализировав диззассемблированный файл, я должен внести изменения в листинг своей программы и избавится от printf).
    Мне нужно печатать некоторые слова и числа в консоль , но уже не printf'ом.
    Правила всё те же - мне нельзя использовать буквы алфавита, поэтому приходится идти на такие ухищрения.
    Вот оригинал программы , которая еще с символами:
    Код (C):
    1. #include<stdio.h>
    2. int main()
    3. {
    4.     int i, f1 = 1, f2 = 0, x;
    5.     for (i = 2; i <= 5; i++)
    6.     {
    7.         x = f1 + f2; // следующее число
    8.         f2 = f1;
    9.         f1 = x; // сдвиг значений
    10.     }
    11.        
    12.     return 0;
    13. }
    Затем я начал избавлятся от них:
    Код (C):
    1. #include<stdio.h>
    2. _12, _1 = 1, __2 = 0, _10;
    3. main()
    4. {
    5.     for (_12 = 2; _12 <= 8; _12++) // не обращайте внимание на for, меня пока интересует printf
    6.     {
    7.         _10 = _1 + __2; // следующее число
    8.         __2 = _1;
    9.         _1 = _10; // сдвиг значений
    10.         printf("Fib num %d is %d \n", _12, _1); //  вот выводить нужно без printf и символов алфавита
    11.     }
    12. }
    Вот от этого printf мне нужно избавится - printf("Fib num %d is %d \n", _12, _1);
    Ко всему прочему нужно еще и не использовать буквы алфавита, но все равно вывести текст
    В архиве - диззассемблированная программа
     

    Вложения:

    • Project93.rar
      Размер файла:
      96,4 КБ
      Просмотров:
      319
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Ну можно по хешам найти либу и функцию. Давал код, правда на асме, но буквенный интринсик придется использовать (_readfsdword/_readgsqword).
    А вообще, если точка входа установлена в main, то можно попробовать чекнуть адрес возврата из main, потом найти kernel32/ntdll, а там уже все что хочешь можно сделать.
     
    2Hard2Forget нравится это.
  3. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    А как найти адрес возврата из main? А даже если найду, то зачем kernel32/ntdll? А что значит всё что хочу ? Я хочу не используя printf выводить на консоль символы и цифры, а ещё и сами буквы заменить на восьмеричный(16-ричный) , но чтобы выводились всё равно буквы
    --- Сообщение объединено, 13 окт 2019 ---
    Просто я смотрю в таблицу импортов и вижу вариации printf'ов и loadlibary , у меня видны адреса этих функций , значит я как-то могу эти адреса использовать в совей программе ? Ведь они-то точно статичные , значит я должен ещё и dll'ку подгрузить в свой проект на VS17 , верно?
    --- Сообщение объединено, 13 окт 2019 ---
    Вот, что я вижу upload_2019-10-13_1-42-40.png
     
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Почитай матчасть, что такое таблица импортов, а лучше посмотри в отладчике, как идет вызов твоей принтф.

    Объясни нормально, чего ты хочешь? Скрыть вызов в сорцах? В коде? В импорте?
    Зачем, спрашивать не буду, вероятно опять препод задал что-то такое. Готовит тебя, наверное, к межпланетной олимпиаде, судя по уровню заданий.
     
  5. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Мне нужно избавится от букв в листинге на Си. Можно оставить main (на крайней случай - какие-либо другие буквы). Нужно выводить числа Фиббоначи в таком формате:
    Fibonacchi Number 1 is 1
    Fibonacchi Number 2 is 1
    Fibonacchi Number 3 is 2
    Fibonacchi Number 4 is 3
    и так далее...​
    Загвоздка в том, что опять же нельзя использовать буквы алфавита в листинге программы на Си(то есть никаких имен переменных ,int, while, if,for, #define,и прочего)
    Я такой:"окей". Значит либо рекурсией, либо циклом. Я решил,что рекурсией такое делать будет сложно.Возможно создам функцию(с именем решу что сделать) и вызову её из main,где сделаю такой же цикл. Но пока решил избавиться от printf, а вместе с ним ещё и от букв , которые в нём есть(в кавычках). Я посмотрел , какие dll вызываются и понимаю, что printf будет лежать всегда в одном адресе, нашел в таблице импортов dll'ки , которые содержат хоть что-то про printf. Я посмотрел , как реализован в stdio.h этот printf и увидел такие же названия в реализации printf(я про __stdio_common_vfprintf, например), что и в таблице импортов. Тогда появляется новый вопрос: значит я должен эти нужные dll как-то в проект добавить? Но это же опять какой-нибудь LoadLibrary , который состоит из букв , которые мне нельзя использовать! Значит добавить в проект через свойства ? Ну предположим через компоновщик добавил. Но что делать дальше ?
     
  6. voffka0

    voffka0 Member

    Публикаций:
    0
    Регистрация:
    22 янв 2019
    Сообщения:
    136
    компиляторы разные, "язык c" - абстракция типа чёрного квадрата, чистый машинный код - правильное программирование. to be or not to be - that's question!(c):derisive:
     
  7. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Перечитал 3 раза, так и не понял как ты планируешь при помощи иды избавиться от printf. Ну допустим эта мишура есть в импорте ехи, ее подсосали туда висишные либы, с чего ты взял, что можешь их использовать из исходника? Если у тебя есть возможность заказать любые апи в опциях проекта, нафига тебе нужны именно эти апи?

    Не будет. Студия компилит как ей вздумается, а базы библиотек в памяти выбираются рандомно. Языки высокого уровня как современный автомобиль - считают себя умней и ответственней тебя самого. Ты не имеешь права полагаться на то, что реальное внутреннее устройство программы останется прежним, если добавишь в нее еще одну строчку, соберешь другой версией компилера, при другом курсе акций майкрософт или другом президенте США.

    ЗЫ: заставь уже препода написать техзадание, его формулировки идиотские, поставленная задача наркоманская, только ему одному понятно чего он хочет. Это задание не привьет тебе практических навыков и не даст полезных знаний. То, что этого человека допустили до обучения других - ошибка.
    --- Сообщение объединено, 13 окт 2019 ---
    ЗЗЫ: и чтоб ему не показалось это слишком просто, техзадание не должно содержать символов алфавита.
     
    M0rg0t и Mikl___ нравится это.
  8. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    999
    Соглашусь. Если студент не может даже правильно воспроизвести задание в разных формулировках, то он явно не готов к его исполнению. Одно дело из си прийти в асм, к системным вызовам, а другое оставаться всеми путями в рамках текстового файла для cl . В этом ни смысла, ни пользы.
    Изучить си? Да ведь это уже все равно не си. Си это именно текст main, if, struct и т.д.
    Изучить ключи компилятора? Так ведь их менять нельзя, в чем тогда учеба?
    Изучить таблицы импорта? Какое отношение это имеет к выпиливанию букв?
    Научить обфускации? Причем тут буквы и неизменность ключей компилятора?

    Т.е. задача (если она существовала когда-либо вне головы топик стартера) - тест ради теста. Из разряда цирковых фокусов. Жонглирующий медведь на одноколесном велосипеде, очень полезный вне циркового представления навык.
     
    Mikl___ нравится это.
  9. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Очень просто, он расположен наверху в стеке.

    Ну там уже найдешь LoadLibrary/LdrLoadDll (по хешам) и загрузишь msvcrt в которой найдешь printf(по хешу). Либо же просто заюзать WriteConsole из кернела немного изменив логику программы.

    Достучавшись до выводящей функции, дальше просто в массив заливай числовые константы соответствующие символам/группам символов.

    Если у тебя в импорте уже есть эта функция (хотя она должна отрубаться линкером если не используется), то тут все еще проще. Находи адрес образа (к примеру через main) и там уже по таблице импорта ищи функцию.
    --- Сообщение объединено, 13 окт 2019 ---
    А в чем проблема буквы цифрами записать? Это ведь те же самые бинарные данные.
     
  10. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Он даже тип данных переменной задать не может, потому что буквофобия часть задачи.
     
  11. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Скину пример позже.
     
  12. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Сможешь без "void" передать управление?
    Код (C):
    1. __[] = {-858993460,-858993460,-858993460};
    2. main(){
    3.         void (*_) (void);
    4.         _ = (void *)__;
    5.         _();
    6. }
    --- Сообщение объединено, 13 окт 2019 ---
    О хосспаде, копилится так:
    Код (C):
    1. main[] = {-858993460,-858993460,-858993460};
    Препод может утереться.
    --- Сообщение объединено, 13 окт 2019 ---
    Результат
    Код (C):
    1. main[] = {
    2. -2082109099,1684044012,12449,205556480,-1390645109,-1995947893,1217103941,-1950285508,
    3. -1056868279,-1961338485,-1040113583,-2079374517,484,-1707832501,828425729,-12481079,
    4. -1199365955,-1965936147,-775802858,822244330,-511688214,-1040943865,-802092824,4096070,
    5. -789060747,2082471741,-1066049079,19157387,481759170,475106138,210485761,-1873966694,
    6. -393198335,15,1684107084,1919052108,1165587041,1342194040,-2054138369,1971589056,
    7. -1996488703,233346117,1191182336,1951626341,1851869284,6646884,-7834113,-1064988587,
    8. 22184975,1166606336,911512,1816199168,1130590060,1869835887,-16751252,1442809973,
    9. 264275344,77700,-1673164544,2792,1769101056,1766221172,-16751252,1442809973,
    10. 264275344,69508,-1606055680,2536,1953721344,1852140658,1979646017,-1873412216,
    11. -2079342459,240,1789150601,-402626048,11,1919251317,1680749107,-16749460,
    12. -1064987563,13534223,1166606336,714892,1937178624,1852404336,4286068,-1873412272,
    13. -2079342459,176,1789412745,-1739194379,141934725,1788630527,-1739194379,-2079342459,
    14. 148,-945011319,110661,2105737216,-2096158288,128,61898115,-1070529165,
    15. -2094666944,1963176061,-1270495471,1,696,-1203402496,1300958955,-1270510664,
    16. 1300875265,-1203402316,-1334444208,7656,1651066368,1667329647,543778915,1651340622,
    17. 622883429,1936269412,224666912,1435303946,1442796224,281314216,1388336525,1789154815,
    18. -1135244032,1435324498,1979667136,-1604976724,-374323713,-138,12831073};
    GCC из MinGW собирает: gcc -0 test test.c
     
    M0rg0t, ormoulu и 2Hard2Forget нравится это.
  13. 2Hard2Forget

    2Hard2Forget Member

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

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Нашел возможность шеллкод воткнуть, не используя ни одной загогулины из букваря. Добавил к этому пару старинных копипаст и транслятор flat assembler. По идее на любой винде должно работать, но Штирлиц допускает, что мог проколоться. На линуксе не заработает.
     

    Вложения:

    • raw.zip
      Размер файла:
      1,7 КБ
      Просмотров:
      330
    2Hard2Forget нравится это.
  15. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    Есть такой трюк - в C вместо функции main можно подсунуть линкеру код, содержащий массив с таким же именем, - на него будет передано управление при старте. А в массив можно уже положить шеллкод.
     
    2Hard2Forget нравится это.
  16. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    А если всё-таки подключать библиотеку dll, то как буквы LoadLibrary можно заменить на числа?
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    от мейна можно тоже избавиться, передав ключ "-E" по-моему у гцц...
     
  18. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Подключить импорт по ординалам можно так https://docs.microsoft.com/ru-ru/cpp/build/exporting-from-a-dll-using-def-files?view=vs-2019
    Но я не уверен, что в исходнике можно вызывать функции по ординалам. Хотя может быть в .def можно выбрать собачье имя функции типа "___" и вызывать ее.
     
  19. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    А что за числа такие -2082109099,1684044012,12449 , как их можно переконвертировать обратно? или как ты их получил?
     
  20. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Конвертёр сделал.
     

    Вложения:

    • test1.zip
      Размер файла:
      1,3 КБ
      Просмотров:
      346