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

Почему у меня эта проблема с точками останова в GDB? Остановки ГДБ

Я попытался установить точку останова в GDB, когда вызывается функция strcpy(), но GDB останавливается, и я не знаю, как найти ошибку, я новичок в GDB, и я хочу изучите бинарную эксплуатацию, поэтому форум, который я читаю, ничего не объясняет по этому поводу, вот вывод;

(gdb) disassemble main
Dump of assembler code for function main:
   0x00000000000011c9 <+0>: endbr64 
   0x00000000000011cd <+4>: push   rbp
   0x00000000000011ce <+5>: mov    rbp,rsp
   0x00000000000011d1 <+8>: sub    rsp,0x50
   0x00000000000011d5 <+12>:    mov    DWORD PTR [rbp-0x44],edi
   0x00000000000011d8 <+15>:    mov    QWORD PTR [rbp-0x50],rsi
   0x00000000000011dc <+19>:    mov    rax,QWORD PTR fs:0x28
   0x00000000000011e5 <+28>:    mov    QWORD PTR [rbp-0x8],rax
   0x00000000000011e9 <+32>:    xor    eax,eax
   0x00000000000011eb <+34>:    cmp    DWORD PTR [rbp-0x44],0x1
   0x00000000000011ef <+38>:    jne    0x1207 <main+62>
   0x00000000000011f1 <+40>:    lea    rsi,[rip+0xe10]        # 0x2008
   0x00000000000011f8 <+47>:    mov    edi,0x1
   0x00000000000011fd <+52>:    mov    eax,0x0
   0x0000000000001202 <+57>:    call   0x10c0 <errx@plt>
   0x0000000000001207 <+62>:    mov    DWORD PTR [rbp-0x34],0x0
   0x000000000000120e <+69>:    mov    rax,QWORD PTR [rbp-0x50]
   0x0000000000001212 <+73>:    add    rax,0x8
   0x0000000000001216 <+77>:    mov    rdx,QWORD PTR [rax]
   0x0000000000001219 <+80>:    lea    rax,[rbp-0x30]
   0x000000000000121d <+84>:    mov    rsi,rdx
   0x0000000000001220 <+87>:    mov    rdi,rax
   0x0000000000001223 <+90>:    call   0x1090 <strcpy@plt> // breakpoint here
   0x0000000000001228 <+95>:    mov    eax,DWORD PTR [rbp-0x34]
   0x000000000000122b <+98>:    test   eax,eax
   0x000000000000122d <+100>:   je     0x1247 <main+126>
   0x000000000000122f <+102>:   mov    eax,DWORD PTR [rbp-0x34]
   0x0000000000001232 <+105>:   mov    esi,eax
   0x0000000000001234 <+107>:   lea    rdi,[rip+0xde5]        # 0x2020
   0x000000000000123b <+114>:   mov    eax,0x0
   0x0000000000001240 <+119>:   call   0x10d0 <printf@plt>
   0x0000000000001245 <+124>:   jmp    0x1253 <main+138>
   0x0000000000001247 <+126>:   lea    rdi,[rip+0xe12]        # 0x2060
   0x000000000000124e <+133>:   call   0x10a0 <puts@plt>
   0x0000000000001253 <+138>:   mov    eax,0x0
   0x0000000000001258 <+143>:   mov    rcx,QWORD PTR [rbp-0x8]
   0x000000000000125c <+147>:   xor    rcx,QWORD PTR fs:0x28
   0x0000000000001265 <+156>:   je     0x126c <main+163>
   0x0000000000001267 <+158>:   call   0x10b0 <__stack_chk_fail@plt>
   0x000000000000126c <+163>:   leave  
   0x000000000000126d <+164>:   ret    
End of assembler dump.
(gdb) break *0x0000000000001223            // I want to set the breakpoint here
Breakpoint 1 at 0x1223
(gdb) r AAAA                               // I try to run the program providing arguments
Starting program: /home/ryan/liveoverflow_youtube/0x05_simple_crackme_intro_assembler/stackReg AAAA

[1]+  Stopped                 gdb stackReg // This is the problem? 

12.12.2019

  • Похоже, код делает что-то неприятное, чтобы обнаружить отладчик. Это может быть так же просто, как контрольная сумма. Вместо этого попробуйте hbreak, это не изменяет код. Если это не сработает, вам придется проанализировать код :) PS: поскольку вы используете смещения вместо виртуальных адресов, установка точки останова может вообще не работать. 12.12.2019
  • Я ценю ваше внимание Jester, спасибо! 13.12.2019

Ответы:


1

Такая остановка GDB — это ошибка, возникающая, когда GDB выдает ошибку при попытке установить точку останова. Она была исправлена ​​в вышестоящем GDB с помощью этого патча:

https://sourceware.org/ml/gdb-patches/2019-05/msg00361.html

Как только вы увидите, что GDB остановился вот так:

[1]+ Stopped

вы должны быть отброшены обратно в оболочку. Просто возобновите работу GDB с помощью команды fg и продолжите сеанс отладки. После выхода GDB 9 эта ошибка будет исправлена.

Как было указано в комментарии, причина неправильного адреса точки останова заключается в том, что вы используете независимый от позиции исполняемый файл (PIE), код будет перемещен при запуске процесса.

Запустите GDB с starti, затем вы сможете разобрать main и посмотреть, где на самом деле был размещен код.

13.12.2019
  • Я знаю, как вы пришли к такому выводу. Если для вас важна возможность попытаться установить точки останова по недопустимым адресам, вы можете собрать последнюю загрузку и собрать предварительную версию GDB 9.0. Лично я бы либо не собирал PIE, либо использовал starti перед размещением точек останова по адресу. 14.12.2019
  • Мне очень жаль, мой уровень английского очень низок, и иногда я не понимаю многих вещей, ваш ответ полностью верен, и я попробую то, что вы сказали, спасибо за ваше внимание, сэр :) 19.12.2019
  • Если у вас есть видимый символ main, вы также можете просто использовать start, чтобы GDB поместил там временную точку останова (после создания процесса из исполняемого файла с фактическими адресами). Или установите точку останова на любом символе. 04.06.2021
  • Новые материалы

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

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

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

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

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

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

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