Я читаю book о взломе, и в нем есть глава о сборке.Что делает команда gdb 'x'?
Вслед моя крошечная программа написана на C.
#include <stdio.h>
int main(int argc, char const *argv[])
{
int i;
for (i = 0; i < 10; i++) {
puts("Hello World!");
}
return 0;
}
И следующее gdb
тест:
(gdb) break main
Breakpoint 1 at 0x40050f: file main.c, line 7.
(gdb) run
Breakpoint 1, main (argc=1, argv=0x7fffffffe708) at main.c:7
7 for (i = 0; i < 10; i++) {
(gdb) disassemble main
Dump of assembler code for function main:
0x0000000000400500 <+0>: push rbp
0x0000000000400501 <+1>: mov rbp,rsp
0x0000000000400504 <+4>: sub rsp,0x20
0x0000000000400508 <+8>: mov DWORD PTR [rbp-0x14],edi
0x000000000040050b <+11>: mov QWORD PTR [rbp-0x20],rsi
=> 0x000000000040050f <+15>: mov DWORD PTR [rbp-0x4],0x0
0x0000000000400516 <+22>: jmp 0x400526 <main+38>
0x0000000000400518 <+24>: mov edi,0x4005c4
0x000000000040051d <+29>: call 0x4003e0 <[email protected]>
0x0000000000400522 <+34>: add DWORD PTR [rbp-0x4],0x1
0x0000000000400526 <+38>: cmp DWORD PTR [rbp-0x4],0x9
0x000000000040052a <+42>: jle 0x400518 <main+24>
0x000000000040052c <+44>: mov eax,0x0
---Type <return> to continue, or q <return> to quit---
0x0000000000400531 <+49>: leave
0x0000000000400532 <+50>: ret
End of assembler dump.
Следующая часть является то, что я не понимаю. Обратите внимание, что $ рип является «указатель команд» и указывает на0x000000000040050f <+15>
(gdb) x/x $rip
0x40050f <main+15>: 0x00fc45c7
(gdb) x/12x $rip
0x40050f <main+15>: 0x00fc45c7 0xeb000000 0x05c4bf0e 0xbee80040
0x40051f <main+31>: 0x83fffffe 0x8301fc45 0x7e09fc7d 0x0000b8ec
0x40052f <main+47>: 0xc3c90000 0x1f0f2e66 0x00000084 0x1f0f0000
(gdb) x/8xb $rip
0x40050f <main+15>: 0xc7 0x45 0xfc 0x00 0x00 0x00 0x00 0xeb
(gdb) x/8xh $rip
0x40050f <main+15>: 0x45c7 0x00fc 0x0000 0xeb00 0xbf0e 0x05c4 0x0040 0xbee8
(gdb) x/8xw $rip
0x40050f <main+15>: 0x00fc45c7 0xeb000000 0x05c4bf0e 0xbee80040
0x40051f <main+31>: 0x83fffffe 0x8301fc45 0x7e09fc7d 0x0000b8ec
Первая команда x/x $rip
выходы 0x40050f <main+15>: 0x00fc45c7
.
Это инструкция на 0x40050f? 0x00fc45c7
такой же, как mov DWORD PTR [rbp-0x4],0x0
(сборка на 0x40050f)?
Во-вторых, если это инструкция, каковы эти шестнадцатеричные числа с вывода команд x/12x $rip
, x/8xw $rip
, x/8xh $rip
?
Не должно быть отрицательным, но erickson отлично справляется с этим в мельчайших подробностях ... также, пытаясь сопоставить то, что он делает (по-видимому), новую архитектуру 64b, когда уже трудно (невозможно) получить его примеры для работы в современных ядрах 32b ubuntu, вероятно, не самая лучшая идея. Есть причина, по которой книга поставляется с Ubuntu 7.04. живой компакт-диск. – gnometorule
@gnometorule Это не попытка попробовать свои примеры на моей машине. Я бы получил почти такие же результаты на старых x86 (некоторые имена, такие как rip вместо eip). Это первый случай, когда я пытаюсь использовать этот материал низкого уровня, поэтому меня можно немного смутить. Кроме того, я не прошу перефразировать то, что написал автор книги, но объяснить, что такое шестнадцатеричные числа (например, команда «x» в ЭТОМ ПРИМЕРЕ). Я думаю, это можно объяснить в одном или двух предложениях. – khajvah
Справедливая точка (см. Ответ), но на самом деле: работайте над книгой, используя как старый дистрибутив unbantu, как вы можете.И когда что-то не работает, попробуйте googling SO или бумагу, называемую «разбив стек в 2012 году»). – gnometorule