Запись атаки с возвратом к libc, но libc загружается в память 0x00

Я пишу возвращение к libc атаке для класса моей системы безопасности. Во-первых, уязвимый код:

//vuln.c
#include <stdio.h>
#include <stdlib.h>

int loadconfig(void){
  char buf[1024];
  sprintf(buf, "%s/.config", getenv("HOME"));
  return 0;
}

int main(int argc, char **argv){
  loadconfig();
  return 0;
}

Я хочу использовать возврат к атаке libc. Компиляция и отладка программы:

$ gcc -g -fno-stack-protector -o vuln vuln.c
$ gdb vuln
(gdb) break loadconfig
(gdb) run
Reached breakpoint blah blah blah.
(gdb) p $ebp
$1 = (void *) 0xbfffefb0
(gdb) p system
$2 = {<text variable, no debug info>} 0x0016db20 <system>
(gdb) p exit
$3 = {<text variable, no debug info>} 0x001639e0 <exit>
(gdb) x/2000s $esp
...
0xbffff5af:    "SHELL=/bin/bash"

Чтобы выполнить атаку, я хочу переполнить буфер вloadconfigобратный адрес$esp+4), заменив его обратным адресом дляsystem, то обратный адрес дляexit (посколькуsystem ожидает реальный адрес возврата), затем имя команды (адресSHELL=/bin/bash плюс 6, чтобы обрезатьSHELL= часть). Это должно быть возможно путем создания$HOME переменная окружения из 1024 символов дерьма, затем адрес с прямым порядком байтовsystem, exit, а также/bin/bash.

Тем не менее, с каждым компьютером, который я пробовал,system загружается по адресу, который начинается с 0x00, что приведет к нулевому завершению строки,sprintf читает и остановить атаку замертво. Есть ли способ заставитьlibc загрузить в другое место в памяти, или я неправильно понимаю атаку?

Для справки, я использую виртуальную машину Ubuntu Server 11.10 в VirtualBox (хост Windows) сgcc версия 4.6.1 иgdb Версия 7.3-2011.08. редактировать: ASLR отключен, и я скомпилировал с-fno-stack-protector удалить канарейку. Поскольку я ничего не выполняю из стека, мне не нужноexecstack Это.

Ответы на вопрос(2)

Ваш ответ на вопрос