Старый 29.11.2012, 20:27   #1
benzin
 
Регистрация: 29.11.2012
Сообщений: 1
Репутация: 0
По умолчанию странности strcpy

доброго времени суток.
разбираюсь с ROP, натолкнулся на интересное поведение strcpy.
программка:

Код:
#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[])
{
  char buf[100];

if (argc > 1) {
    strcpy(buf, argv[1]);
  } else
    printf("Please, enter the argument!\n");
  return 0;
}
загружаем в gdb и ставим бряк на строку 13.
запускаем:
(gdb) r `printf "\x41\x0a\x41\x41\x41"`
Starting program: /home/test/test.c `printf "\x41\x0a\x41\x41"`

Breakpoint 3, main (argc=3, argv=0xbffff4f4) at test.c:13
13 return 0;
(gdb) x/4x &buf
0xbffff3dc: 0x00000041 0x00000000 0x00000001 0xb7fff8f8
(gdb)

т.е. весь argv[1] пропал, начиная с \x0a и до конца.
такое же поведение с \x09

как быть?
benzin вне форума   Ответить с цитированием
Старый 30.11.2012, 10:09   #2
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Цитата:
как быть?
Не использовать непроходимые символы.

P.S. Раньше один из вариантов канарейки в StackGuard состоял из NULL(0x00), CR (0x0d), LF (0x0a) и EOF (0xff).
SynQ вне форума   Ответить с цитированием
Старый 30.11.2012, 12:12   #3
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

Цитата:
r "`printf '\x41\x0a\x41\x41\x41'`"
все кроме 0x00 проходит
__________________
[IO]
overxor вне форума   Ответить с цитированием
Старый 30.11.2012, 13:53   #4
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

overxor прав, но не совсем

Если разбираешься с эксплойтами, нужно отключать современные защиты. Компилируй так:
Цитата:
gcc strcpy.c -o strcpy -ggdb -std=c99 -D_FORTIFY_SOURCE=0 -fno-pie -Wno-format -Wno-format-security -fno-stack-protector -z norelro -z execstack -mpreferred-stack-boundary=2
А если объяснить точнее, то это какая-то проверка конкретно параметров argv[], участвующих в strcpy()-like функциях, потому что этот код прекрасно работает и при обычной компиляции:
Код:
6         char buf[100],*buf2;
7
8           buf2=argv[1];
9           strcpy(buf, buf2);

Последний раз редактировалось SynQ; 30.11.2012 в 14:10..
SynQ вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot