В настоящее время я пишу шелл-код, который использует целевую программу, использующую функцию puts
. Программа выглядит так:
#include <stdio.h>
main() {
char buf[123];
puts(gets(buf));
}
Что я хочу сделать, так это переполнить этот буфер и вызвать execve
с некоторыми аргументами. У меня есть тестовая программа, написанная на c/inline ассемблере, которая может вызывать execve
с некоторыми аргументами, затем я использую gdb
для получения шелл-кода из этой программы. Насколько я понимаю, макет стека выглядит так:
|-------buffer(+padding)---------|---------sfp---------|------- рет-------------|
Глядя на часть ассемблерного кода целевой программы, сгенерированной gcc:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
addq $-128, %rsp
leaq -128(%rbp), %rax
movq %rax, %rdi
call gets
movq %rax, %rdi
call puts
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
Я думаю, что буфер и заполнение занимают 128 байт, а sfp и адрес возврата занимают 8 байт, так что всего 144 байт. Исходя из этого, мой nop-след, полезная нагрузка и новый адрес возврата (равный адресу буфера) вместе взятые (то есть мой шелл-код) тоже должны быть 144 байт. Например, если моя полезная нагрузка составляет 36 байт, поскольку адрес возврата занимает 8 байт, мой nop-след будет 100 байт. Но когда я сделал это таким образом, это не сработало. Поэтому я думаю, что, возможно, то, как я понял структуру стека, было неправильным. Это неправильно?
Обратите внимание, что в моем случае адрес буфера был известен, а стек был установлен как исполняемый с помощью execstack
, а ASLR был отключен с помощью setarch
. Таким образом, если адрес возврата был перезаписан адресом буфера, будет выполнен код, записанный в этом буфере.
И я работаю на 64-битной машине x86.
Если я правильно понимаю структуру стека, я добавлю больше информации о своем шелл-коде.
main
не имеет возвращаемого типа. Это реальный код? Если нет, скопируйте/вставьте фактический код в вопрос. Никогда не вводите код повторно в поле вопроса; вы скроете ошибки и введете новые ошибки. - person user2357112 supports Monica   schedule 23.10.2013int
по историческим причинам. - person user2357112 supports Monica   schedule 23.10.2013