OS = Linux
ISA = x86_32
addr_of_a = 0x080002e0
addr_of_b = 0x08000320
addr_of_c = 0x08000350
ret = 0xfffe8764 # the return address of the list_delete function (returns to _main)
Мой текущий прогресс
Очевидно, уязвимостью является буфер данных char[32] внутри каждого узла связанного списка, который может быть переполнен . Мой текущий план:
Переполнить b->данные, пока они не достигнут c, а затем перезаписать c->prev с помощью ret-0x4 и перезаписать c->next адресом c->data (это делает c->next указателем на область данных, которую я хотите внедрить шеллкод).
вызывается, затем выполняется строка node->prev->next = node->next. Учитывая настройку на шаге 1, эта строка будет вставлять адрес c->data вместо обратного адреса list_delete.
Это на этом этапе я застрял: код в следующем операторе if node->next->prev = node->prev выполняется, и первое слово в моем шеллкоде перезаписывается с помощью node- >предыдущая(
value = ret-4). Я не могу избежать этого, установив для node->next
значение null, потому что мне нужно установить node->next на указатель на данные, чтобы перезаписать возвращаемый результат. адрес в стеке. Я понял, что с помощью этого метода, какой бы адрес я ни установил c->next, содержимое, на которое он указывает, всегда будет получать свои первые 4 байта, всегда будет перезаписано.
Что я пропустил? Я неправильно понял какие-то концепции? Или эта атака должна быть намного сложнее, чем я думал?
Я потратил так много часов на это домашнее задание и в настоящее время застрял. Если бы кто-нибудь мог мне помочь, я был бы очень признателен!
return 0; } [/code] Настройка [code]OS = Linux ISA = x86_32
addr_of_a = 0x080002e0 addr_of_b = 0x08000320 addr_of_c = 0x08000350 ret = 0xfffe8764 # the return address of the list_delete function (returns to _main) [/code] Мой текущий прогресс Очевидно, уязвимостью является буфер данных char[32] внутри каждого узла связанного списка, который может быть переполнен . Мой текущий план: [list] [*]Переполнить b->данные, пока они не достигнут c, а затем перезаписать c->prev с помощью ret-0x4 и перезаписать c->next адресом c->data (это делает c->next указателем на область данных, которую я хотите внедрить шеллкод). [*][code]list_delete(c)[/code] вызывается, затем выполняется строка node->prev->next = node->next. Учитывая настройку на шаге 1, эта строка будет вставлять адрес c->data вместо обратного адреса list_delete. [*][b]Это на этом этапе я застрял[/b]: код в следующем операторе if node->next->prev = node->prev выполняется, и первое слово в моем шеллкоде перезаписывается с помощью node- >предыдущая([code]value = ret-4). Я не могу избежать этого, установив для node->next[/code] значение null, потому что мне нужно установить node->next на указатель на данные, чтобы перезаписать возвращаемый результат. адрес в стеке. Я понял, что с помощью этого метода, какой бы адрес я ни установил c->next, содержимое, на которое он указывает, всегда будет получать свои первые 4 байта, всегда будет перезаписано. [/list] Что я пропустил? Я неправильно понял какие-то концепции? Или эта атака должна быть намного сложнее, чем я думал? Я потратил так много часов на это домашнее задание и в настоящее время застрял. Если бы кто-нибудь мог мне помочь, я был бы очень признателен!