Nano Hash - криптовалюты, майнинг, программирование

верификация анализа памяти основного файла

Приложение создает основной файл.

Вот основная информация.

Был получен стек ошибок, и цель состоит в том, чтобы проверить содержимое данных в переменной myStruct, поскольку это то, что передается в myFunction, когда происходит ядро.

(gdb) where
#0  0x000000000041bba1 in myFunction (myStruct=0x7ffff9dd0c20) at myTest.c:344
        :
        :
        :

Из вышесказанного я получил адрес myStruct 0x7ffff9dd0c20 и выгрузил 200 слов.

(gdb) x/200x 0x7ffff9dd0c20
0x7ffff9dd0c20: 0x01938640      0x00000000      0x00001c34      0x000002c8
0x7ffff9dd0c30: 0x00000400      0x00000000      0x01939760      0x00000000
0x7ffff9dd0c40: 0x00000014      0x00000000      0x00000000      0x00000000
0x7ffff9dd0c50: 0x00000000      0x0005000c      0x00000000      0x000d0000
0x7ffff9dd0c60: 0x00000004      0x00000000      0x00000000      0x00000000
0x7ffff9dd0c70: 0x00000000      0x00000000      0x00040000      0x00000000
0x7ffff9dd0c80: 0x0001000c      0x00000000      0x00000000      0x00000000
0x7ffff9dd0c90: 0x00000000      0x00000000      0x00000009      0x00000000
0x7ffff9dd0ca0: 0x00000000      0x00000000      0x410d999a      0x418d999a
0x7ffff9dd0cb0: 0x40b80000      0x41380000      0x000010cc      0x00000000
0x7ffff9dd0cc0: 0x0192edd0      0x00000000      0x00000a30      0x00000158
   :
   :
   :

Теперь я хочу убедиться, что правильно читаю вывод данных.

Вот информация о структуре.

typedef struct 
    {
    char *a;            
    unsigned int b; 
    unsigned int c; 
    int d;          
    } structA;

typedef struct
    {
    structA e;
    char *f;
    } myStruct;  <----------This is what gets passed in and what I am trying to examine.

Работая в Linux, была запущена программа для проверки размера типа данных.

Size of char* : 8
Size of int : 4

Зная адрес 0x7ffff9dd0c20 и структуру myStruct, я предполагаю, что начну с анализа structA, поскольку она первая.

Поскольку char *a — это первая часть structA, а char * — это 2 слова, я смотрю на это:

  0x01938640      0x00000000 

Далее есть по существу 3 целых числа (2 беззнаковых целых числа и 1 целое число), которые я рассматривал как эти из вывода:

0x00001c34      
0x000002c8
0x00000400

Это возвращает меня к structB и к атрибуту char *f, который должен состоять из 2 слов.
Означает ли это, что это правильный адрес:

0x00000000      0x01939760  

Я снова скопировал информацию о памяти, чтобы упростить поиск.

(gdb) x/200x 0x7ffff9dd0c20
0x7ffff9dd0c20: 0x01938640      0x00000000      0x00001c34      0x000002c8
0x7ffff9dd0c30: 0x00000400      0x00000000      0x01939760      0x00000000
0x7ffff9dd0c40: 0x00000014      0x00000000      0x00000000      0x00000000
0x7ffff9dd0c50: 0x00000000      0x0005000c      0x00000000      0x000d0000
0x7ffff9dd0c60: 0x00000004      0x00000000      0x00000000      0x00000000
0x7ffff9dd0c70: 0x00000000      0x00000000      0x00040000      0x00000000
0x7ffff9dd0c80: 0x0001000c      0x00000000      0x00000000      0x00000000
0x7ffff9dd0c90: 0x00000000      0x00000000      0x00000009      0x00000000
0x7ffff9dd0ca0: 0x00000000      0x00000000      0x410d999a      0x418d999a
0x7ffff9dd0cb0: 0x40b80000      0x41380000      0x000010cc      0x00000000
0x7ffff9dd0cc0: 0x0192edd0      0x00000000      0x00000a30      0x00000158

Является ли это правильным способом изучения и анализа данных?

Вот определение еще одной структуры.

typedef struct
    {
    short w;                    
    unsigned long x;            
    short y;                    
    short z;                    
    } otherStruct;

Это то, что должно храниться в f.

    char *f;

В gdb я пробовал следующее:

 p (otherStruct *)0x1939760

и он распечатывает:

 $12 = (otherStruct *) 0x1939760

Странная часть заключается в том, что когда я первоначально распечатывал данные, они отображали *f как следующее, что совсем не похоже на структуру:

  f = 0x1939760 "\315\314\274@"
14.02.2020

Ответы:


1

Вы плохо читаете данные. gdb знает определения структур, поэтому вы можете сказать ему распечатать структуру напрямую, используя команду p.

Например, учитывая этот код, используя ваши структуры:

int main()
{
    myStruct s = { { "aaa", 4, 5, 6 }, "bbb" };
    printf("hello\n");
}

Запуск кода под gdb:

(gdb) start
Temporary breakpoint 1 at 0x400535: file x1.c, line 19.
Starting program: /home/dbush/./x1 

Temporary breakpoint 1, main () at x1.c:19
19      myStruct s = { { "aaa", 4, 5, 6 }, "bbb" };
Missing separate debuginfos, use: debuginfo-install glibc-2.17-292.el7.x86_64
(gdb) step
20      printf("hello\n");
(gdb) p s
$1 = {e = {a = 0x400600 "aaa", b = 4, c = 5, d = 6}, f = 0x400604 "bbb"}
(gdb) 

Что касается поля f, на самом деле содержащего otherStruct *, вы можете распечатать то, что оно содержит, приведя f и разыменовав результат:

p *(otherStruct *)myStruct->f

При этом вы не учли отступы внутри структур. Поскольку structA содержит char * размером 8 байт, структура должна быть выровнена по 8-байтовой границе. Глядя на макет, это означает, что 4 байта заполнения находятся в конце структуры.

Таким образом, 6-е 32-битное слово в вашем дампе (0x00000000) на самом деле является этим дополнением. Таким образом, байты, составляющие f, на самом деле 0x01939760 0x00000000.

Глядя на дамп примера кода выше:

(gdb) p s
$1 = {e = {a = 0x400600 "aaa", b = 4, c = 5, d = 6}, f = 0x400604 "bbb"}
(gdb) p &s
$5 = (myStruct *) 0x7fffffffde50
(gdb) x/20x 0x7fffffffde50
0x7fffffffde50: 0x00400600  0x00000000  0x00000004  0x00000005
0x7fffffffde60: 0x00000006  0x00007fff  0x00400604  0x00000000
0x7fffffffde70: 0x00000000  0x00000000  0xf7a2f505  0x00007fff
0x7fffffffde80: 0x00000000  0x00000000  0xffffdf58  0x00007fff
0x7fffffffde90: 0x00000000  0x00000001  0x0040052d  0x00000000

Вы можете видеть, что значения в полях e совпадают с необработанным дампом. Далее вы видите байты заполнения, которые в данном случае имеют значение 0x00007fff. Следующие 8 байт после этого соответствуют значению f.

14.02.2020
  • Ничего себе, удивительно просто и намного легче читать. Очень ценю это. 14.02.2020
  • Хм, эта прокладка добавляет новый поворот. Он дополняется случайным значением, а не всегда 0x00000000? 14.02.2020
  • @UnhandledException Значения байтов заполнения в структуре или объединении не указаны, что означает, что значения могут быть любыми. 14.02.2020
  • Хорошо, и из быстрого Google кажется, что это характерно для структур, которые определенно являются для меня новостью. Еще раз спасибо. 14.02.2020
  • Любопытно узнать, хотел ли я увидеть, что хранится в 1-м указателе, должен ли я сделать p * 0x01938640? 14.02.2020
  • @UnhandledException Это разыменует указатель, но все равно будет просто сбрасывать байты. Вам нужно будет применить правильное приведение, то есть p (char *)0x01938640, и тогда вы увидите его как строку. 14.02.2020
  • Возможно, мне придется создать новый поток, потому что я сделал p (otherStruct*)myStruct-›f, и это не сработало. Трудно получить слишком подробную информацию в разделе комментариев. Еще раз спасибо. 14.02.2020
  • На самом деле я только что отредактировал исходный код, чтобы добавить дополнительную структуру. 14.02.2020
  • @UnhandledException Разыменуйте указатель: p *((otherStruct*)myStruct->f) 14.02.2020
  • Вау, это чертовски круто. Это помогло. Я попытался дать этому ответу еще одно обновление, но я думаю, что 1 - это предел. 14.02.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..