Я просматриваю книгу Hacking: The Art of Exploitation, в которой используется 32-битная сборка, а моя машина 64-битная. Теперь я понимаю, что это не очень хорошо, но вот в чем вопрос.
Пока я отлаживаю эту программу,
Reading symbols from ./a.out...
(gdb) break main
Breakpoint 1 at 0x113d: file first.c, line 6.
(gdb) run
Starting program: /home/kingvon/Desktop/asm/a.out
Breakpoint 1, main () at first.c:6
6 for(i=0; i < 10; i++){
(gdb) x/3i $rip
=> 0x55555555513d <main+8>: movl $0x0,-0x4(%rbp)
0x555555555144 <main+15>: jmp 0x555555555156 <main+33>
0x555555555146 <main+17>: lea 0xeb7(%rip),%rdi # 0x555555556004
это то, что я вижу на своей машине (64 бит),
0x55555555513d <main+8>: movl $0x0,-0x4(%rbp)
но в приведенном примере (32 бита) говорится:
0x55555555513d <main+8>: mov DWORD PTR [ebp-4],0x0
Из чтения 32-битной сборки совершенно ясно, что это должно означать, что машина переместит значение 0 в ячейку памяти, хранящуюся в регистре EBP, минус 4. Я знаю, что обе инструкции делают одно и то же, но я чувствую, что инструкция 64 не похоже на то, что на самом деле означает. Как можно интерпретировать/сформулировать инструкцию 64? Я знаю, что имена регистров отличаются на 64-битных
echo "set disassembly-flavor intel" > ~/.gdbinit
и проверил файл, который говорит, что он установлен на intel, но gdb продолжает печатать в at&t..... edit - опечатка в .gdbinit, теперь gdb печатает в intel - person raincouver   schedule 10.01.2021