-q# No show banner-x<file># Auto-execute GDB instructions from here-p<pid># Attach to process
Інструкції
run# Executestart# Start and break in mainn/next/ni# Execute next instruction (no inside)s/step/si# Execute next instructionc/continue# Continue until next breakpointpsystem# Find the address of the system functionset $eip =0x12345678# Change value of $eiphelp# Get helpquit# exit# Disassembledisassemblemain# Disassemble the function called maindisassemble0x12345678# Disassemble taht addresssetdisassembly-flavorintel# Use intel syntaxsetfollow-fork-modechild/parent# Follow child/parent process# Breakpointsbrfunc# Add breakpoint to functionbr*func+23br*0x12345678del<NUM># Delete that number of breakpointwatchEXPRESSION# Break if the value changes# infoinfofunctions-->Infoabountfunctionsinfofunctionsfunc-->Infoofthefuntioninforegisters-->Valueoftheregistersbt# Backtrace Stackbtfull# Detailed stackprintvariableprint0x87654321-0x12345678# Caculate# x/examineexamine/<num><o/x/d/u/t/i/s/c><b/h/w/g> dir_mem/reg/puntero # Shows content of <num> in <octal/hexa/decimal/unsigned/bin/instruction/ascii/char> where each entry is a <Byte/half word (2B)/Word (4B)/Giant word (8B)>
x/o0xDir_hexx/2x $eip # 2Words from EIPx/2x $eip -4# $eip - 4x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes)ireip# Value of $eipx/wpointer# Value of the pointerx/spointer# String pointed by the pointerx/xw&pointer# Address where the pointer is locatedx/i $eip # Instructions of the EIP
helpmemory# Get help on memory commandcanary# Search for canary value in memorychecksec#Check protectionspsystem#Find system function addresssearch-pattern"/bin/sh"#Search in the process memoryvmmap#Get memory mappingsxinfo<addr># Shows page, size, perms, memory area and offset of the addr in the pagememorywatch0x7840000x1000byte#Add a view always showinf this memorygot#Check got tablememorywatch $_got()+0x185#Watch a part of the got table# Vulns detectionformat-string-helper#Detect insecure format stringsheap-analysis-helper#Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap#Patternspatterncreate200#Generate length 200 patternpatternsearch"avaaawaa"#Search for the offset of that substringpatternsearch $rsp #Search the offset given the content of $rsp#Shellcodeshellcodesearchx86#Search shellcodesshellcodeget61#Download shellcode number 61#Another way to get the offset of to the RIP1-PutabpafterthefunctionthatoverwritestheRIPandsendappaterntoovwerwriteit2-ef➤ifStacklevel0,frameat0x7fffffffddd0:rip=0x400cd3; savedrip=0x6261617762616176calledbyframeat0x7fffffffddd8Arglistat0x7fffffffdcf8,args:Localsat0x7fffffffdcf8,Previousframe's sp is 0x7fffffffddd0Saved registers:rbp at 0x7fffffffddc0, rip at 0x7fffffffddc8gef➤ pattern search 0x6261617762616176[+] Searching for '0x6261617762616176'[+] Found at offset 184 (little-endian search) likely
Хитрощі
Ті самі адреси в GDB
Під час налагодження GDB матиме трохи відмінні адреси від тих, що використовуються бінарним файлом при виконанні. Ви можете зробити так, щоб у GDB були ті самі адреси, виконавши наступне:
unset env LINES
unset env COLUMNS
set env _=<шлях>Вкажіть абсолютний шлях до бінарного файлу
Використовуйте бінарний файл, використовуючи той самий абсолютний шлях
PWD та OLDPWD повинні бути однаковими під час використання GDB та під час використання бінарного файлу
Backtrace для знаходження викликаних функцій
Коли у вас є статично зв'язаний бінарний файл, всі функції будуть належати бінарному файлу (а не зовнішнім бібліотекам). У цьому випадку буде важко визначити послідовність, яку слідує бінарний файл, щоб, наприклад, запросити введення від користувача.
Ви можете легко визначити цю послідовність, запустивши бінарний файл з gdb до тих пір, поки вас не попросять ввести дані. Потім зупиніть його за допомогою CTRL+C та використайте команду bt (backtrace) для перегляду викликаних функцій:
gef➤ bt
#0 0x00000000004498ae in ?? ()
#1 0x0000000000400b90 in ?? ()
#2 0x0000000000400c1d in ?? ()
#3 0x00000000004011a9 in ?? ()
#4 0x0000000000400a5a in ?? ()
GDB сервер
gdbserver --multi 0.0.0.0:23947 (в IDA вам потрібно вказати абсолютний шлях до виконуваного файлу на машині з Linux та на машині з Windows)
Ghidra
Знайти зсув стеку
Ghidra дуже корисний для знаходження зсуву для переповнення буфера завдяки інформації про позицію локальних змінних.
Наприклад, у прикладі нижче, переповнення буфера в local_bc вказує на те, що вам потрібен зсув 0xbc. Більше того, якщо local_10 - це куки-захисник, це вказує на те, що для перезапису його з local_bc є зсув 0xac.
Пам'ятайте, що перші 0x08, звідки зберігається RIP, належать RBP.
GCC
gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2 --> Компілювати без захисту
-o --> Вихід
-g --> Зберегти код (GDB зможе його побачити)
echo 0 > /proc/sys/kernel/randomize_va_space --> Для вимкнення ASLR в Linux
ldd executable | grep libc.so.6 --> Адреса (якщо ASLR, то вона змінюється кожен раз)
for i in `seq 0 20`; do ldd <Ejecutable> | grep libc; done --> Цикл для перевірки, чи часто змінюється адреса
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system --> Зсув "system"
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh --> Зсув "/bin/sh"
strace executable --> Функції, які викликаються виконавчим файлом
rabin2 -i ejecutable --> Адреса всіх функцій
Inmunity debugger
!monamodules#Get protections, look for all false except last one (Dll of SO)!monafind-s"\xff\xe4"-mname_unsecure.dll#Search for opcodes insie dll space (JMP ESP)
IDA
Відлагодження віддалено в Linux
У папці IDA ви можете знайти виконувані файли, які можна використовувати для відлагодження бінарного файлу в Linux. Для цього перемістіть виконуваний файл linux_server або linux_server64 на Linux-сервер та запустіть його всередині папки, що містить бінарний файл:
./linux_server64 -Ppass
Потім налаштуйте відлагоджувач: Відлагоджувач (віддалений linux) --> Опції процесу...: