LINUX.ORG.RU
ФорумTalks

Я фшоке...


0

0
#include <stdio.h>

typedef int (*pf)(int, int);
char c[] = {85,-119,-27,-117,69,12,3,69,8,93,-61,-112};
pf sum = (pf)c;

int main()
{
	printf("%d\n", sum(5, 6));
	return 0;
}

Прочитал утром на хабре. Оно работает!

★★★★★

Ну во-первых, работает оно только на x86. И то, ИМХО можно подобрать такие опции компиляции, при которых оно работать перестанет. И во-вторых, что именно тебя удивляет?

Deleted
()

./a.out

Segmentation fault

А у меня - нет. ЧЯДнТ?

gunja
()

До-оо, выполняем массив чар-ов. Даже если расслабиться насчет захардкоженного ассемблера и раскладки аргументов / возвращаемого значения, на страничках с данными запросто может не оказаться разрешения на exec. Не программа, а один большой косяк.

Manhunt ★★★★★
()

И что, функция есть указатель, char есть произвольный байт, а массив из них - машинные инструкции в "сыром" виде. Правда, есть различные сегменты в программе, не уверен что этот массив и обычные функции в одном и том же хранятся...

aninamous
()
Ответ на: комментарий от Manhunt

> А однострочник перловый ты запускал? :D

в условном окружении? а в чём проблема? пользовательские данные условного пользователя не сильно нужно

gunja
()
Ответ на: комментарий от Manhunt

на страничках с данными запросто может не оказаться разрешения на exec.

более того, на той же линуксе .data естественно стоит без прав на исполнение:

#include <stdio.h>

typedef int (*pf)(int, int); char c[] = {85,-119,-27,-117,69,12,3,69,8,93,-61,-112}; pf sum = (pf)c;

int main() {
    printf("sum=%p\n", sum);
    printf("%d\n", sum(5, 6));    return 0;
}

$ cc -o a test.c
$ gdb ./a
GNU gdb Red Hat Linux (6.5-37.el5rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...(no debugging symbols found)
Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) r
Starting program: /tmp/foo/tmp/a
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
sum=0x80495bc

Program received signal SIGSEGV, Segmentation fault.
0x080483be in main ()

$ readelf --sections ./a
There are 28 section headers, starting at offset 0x7bc:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        08048114 000114 000013 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            08048128 000128 000020 00   A  0   0  4
  [ 3] .gnu.hash         GNU_HASH        08048148 000148 000020 04   A  4   0  4
  [ 4] .dynsym           DYNSYM          08048168 000168 000050 10   A  5   1  4
  [ 5] .dynstr           STRTAB          080481b8 0001b8 00004c 00   A  0   0  1
  [ 6] .gnu.version      VERSYM          08048204 000204 00000a 02   A  4   0  2
  [ 7] .gnu.version_r    VERNEED         08048210 000210 000020 00   A  5   1  4
  [ 8] .rel.dyn          REL             08048230 000230 000008 08   A  4   0  4
  [ 9] .rel.plt          REL             08048238 000238 000018 08   A  4  11  4
  [10] .init             PROGBITS        08048250 000250 000017 00  AX  0   0  4
  [11] .plt              PROGBITS        08048268 000268 000040 04  AX  0   0  4
  [12] .text             PROGBITS        080482b0 0002b0 0001d8 00  AX  0   0 16
  [13] .fini             PROGBITS        08048488 000488 00001c 00  AX  0   0  4
  [14] .rodata           PROGBITS        080484a4 0004a4 000018 00   A  0   0  4
  [15] .eh_frame         PROGBITS        080484bc 0004bc 000004 00   A  0   0  4
  [16] .ctors            PROGBITS        080494c0 0004c0 000008 00  WA  0   0  4
  [17] .dtors            PROGBITS        080494c8 0004c8 000008 00  WA  0   0  4
  [18] .jcr              PROGBITS        080494d0 0004d0 000004 00  WA  0   0  4
  [19] .dynamic          DYNAMIC         080494d4 0004d4 0000c8 08  WA  5   0  4
  [20] .got              PROGBITS        0804959c 00059c 000004 04  WA  0   0  4
  [21] .got.plt          PROGBITS        080495a0 0005a0 000018 04  WA  0   0  4
  [22] .data             PROGBITS        080495b8 0005b8 000014 00  WA  0   0  4
  [23] .bss              NOBITS          080495cc 0005cc 000008 00  WA  0   0  4
  [24] .comment          PROGBITS        00000000 0005cc 000114 00      0   0  1
  [25] .shstrtab         STRTAB          00000000 0006e0 0000db 00      0   0  1
  [26] .symtab           SYMTAB          00000000 000c1c 000460 10     27  48  4
  [27] .strtab           STRTAB          00000000 00107c 000260 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

соответственно, имеем общее нарушение защиты.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от Manhunt

> man эскалация привилегий

повот страшноватый, конечно же... но вроде о превышении полномочий давно не сообщалось, да и код коротковат для большого числа действий. что однострочник, что этот пример. так что очень даже можно баловаться из-под тестового пользователя

gunja
()

>Оно работает

А де же noexec ?

uzbl
()

~ $ cat test.c
#include <stdio.h>

typedef int (*pf)(int, int); char c[] = {85,-119,-27,-117,69,12,3,69,8,93,-61,-112}; pf sum = (pf)c;

int main() { printf("%d\n", sum(5, 6)); return 0; }
~ $ cc test.c -o test.bin
~ $ ./test.bin
11
~ $ uname -a
Linux cacao 2.6.26-2-686 #1 SMP Wed Aug 19 06:06:52 UTC 2009 i686 GNU/Linux

ЧЯДНТ?

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard
 ~ $ readelf --sections ./test.bin 
There are 36 section headers, starting at offset 0xc5c:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        08048114 000114 000013 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            08048128 000128 000020 00   A  0   0  4
  [ 3] .hash             HASH            08048148 000148 000028 04   A  5   0  4
  [ 4] .gnu.hash         GNU_HASH        08048170 000170 000020 04   A  5   0  4
  [ 5] .dynsym           DYNSYM          08048190 000190 000050 10   A  6   1  4
  [ 6] .dynstr           STRTAB          080481e0 0001e0 00004c 00   A  0   0  1
  [ 7] .gnu.version      VERSYM          0804822c 00022c 00000a 02   A  5   0  2
  [ 8] .gnu.version_r    VERNEED         08048238 000238 000020 00   A  6   1  4
  [ 9] .rel.dyn          REL             08048258 000258 000008 08   A  5   0  4
  [10] .rel.plt          REL             08048260 000260 000018 08   A  5  12  4
  [11] .init             PROGBITS        08048278 000278 000030 00  AX  0   0  4
  [12] .plt              PROGBITS        080482a8 0002a8 000040 04  AX  0   0  4
  [13] .text             PROGBITS        080482f0 0002f0 00019c 00  AX  0   0 16
  [14] .fini             PROGBITS        0804848c 00048c 00001c 00  AX  0   0  4
  [15] .rodata           PROGBITS        080484a8 0004a8 00000c 00   A  0   0  4
  [16] .eh_frame         PROGBITS        080484b4 0004b4 000004 00   A  0   0  4
  [17] .ctors            PROGBITS        080494b8 0004b8 000008 00  WA  0   0  4
  [18] .dtors            PROGBITS        080494c0 0004c0 000008 00  WA  0   0  4
  [19] .jcr              PROGBITS        080494c8 0004c8 000004 00  WA  0   0  4
  [20] .dynamic          DYNAMIC         080494cc 0004cc 0000d0 08  WA  6   0  4
  [21] .got              PROGBITS        0804959c 00059c 000004 04  WA  0   0  4
  [22] .got.plt          PROGBITS        080495a0 0005a0 000018 04  WA  0   0  4
  [23] .data             PROGBITS        080495b8 0005b8 000018 00  WA  0   0  4
  [24] .bss              NOBITS          080495d0 0005d0 000008 00  WA  0   0  4
  [25] .comment          PROGBITS        00000000 0005d0 0000d9 00      0   0  1
  [26] .debug_aranges    PROGBITS        00000000 0006b0 000050 00      0   0  8
  [27] .debug_pubnames   PROGBITS        00000000 000700 000025 00      0   0  1
  [28] .debug_info       PROGBITS        00000000 000725 00017f 00      0   0  1
  [29] .debug_abbrev     PROGBITS        00000000 0008a4 00006f 00      0   0  1
  [30] .debug_line       PROGBITS        00000000 000913 000125 00      0   0  1
  [31] .debug_str        PROGBITS        00000000 000a38 0000a3 01  MS  0   0  1
  [32] .debug_ranges     PROGBITS        00000000 000ae0 000040 00      0   0  8
  [33] .shstrtab         STRTAB          00000000 000b20 000139 00      0   0  1
  [34] .symtab           SYMTAB          00000000 0011fc 0004c0 10     35  54  4
  [35] .strtab           STRTAB          00000000 0016bc 000214 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)
gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

> ЧЯДНТ?

не соблюдаеш минимальных гигиенических правил

beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.