abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
včera 09:44 | Upozornění

Byly zveřejněny videozáznamy přednášek z konference LinuxDays 2019, která proběhla 5. a 6. října v Praze. Odkazy na videa společně s prezentacemi naleznete v programu, případně můžete jít rovnou na stránku video. Záznamy pořizovalo Audiovizuální centrum SiliconHill.

Petr Krčmář | Komentářů: 18
17.10. 18:55 | Nová verze

Bylo vydáno OpenBSD 6.6. Opět bez oficiální písně. Z novinek lze zmínit například sysupgrade(8).

Ladislav Hagara | Komentářů: 5
17.10. 08:36 | Nová verze

Vyšla nová verze monitorovacího řešení Centreon 19.10.0. Novinek je spousta (realtime API, podpora JIRA, vylepšený systém notifikací...), ale těmi nejdůležitějšími je pro mnohé uživatele podpora nové verze rrdtool 1.7.x a php 7.2. Systém tak půjde bez problémů provozovat na jiných distribucích než CentOS 7. Kompletní přehled novinek v seznamu změn. Předpřipravená appliance i samotné části jsou k dispozici na oficiálních stránkách.

Max | Komentářů: 0
17.10. 01:00 | Komunita

Dnes vyjde Ubuntu 19.10 s kódovým názvem Eoan Ermine. Přehled novinek v poznámkách k vydání. Ubuntu 20.04 LTS bude Focal Fossa.

Ladislav Hagara | Komentářů: 12
16.10. 22:11 | Zajímavý projekt

Padesátiny Unixu lze oslavit také hrou The Unix Game aneb na unixové roury pomocí Scratche.

Ladislav Hagara | Komentářů: 2
16.10. 21:44 | Komunita

Vývojáři svobodného 3D softwaru Blender oznámili, že nejnovějším firemním sponzorem Blenderu je společnost Adidas. Jedná se o úroveň Corporate Silver, tj. 12 tisíc eur ročně.

Ladislav Hagara | Komentářů: 22
16.10. 18:22 | Komunita

V září proběhla každoroční konference Akademy komunity KDE. Nyní jsou záznamy přednášek dostupné online. Témata se dotýkají aplikací a knihoven KDE, jejich adaptaci pro různá speciální použití (vestavěná zařízení či rozšířená realita) i obecně vývoje a distribuce softwaru.

Fluttershy, yay! | Komentářů: 0
16.10. 09:11 | Zajímavý článek

Mozilla.cz informuje o vylepšování vlastních about: stránek Firefoxu, konkrétně o odstraňování volání funkce eval() z těchto stránek. Tyto stránky mají přístup k interním součástem Firefoxu, ale protože jsou napsané v HTML a JavaScriptu, mohou být cílem podobných útoků jako webové stránky zobrazované v prohlížeči (např. vložení cizího kódu nebo obsahu), jen s potenciálně závažnějším dopadem. Pokud by se někomu skutečně povedlo kód do

… více »
Ladislav Hagara | Komentářů: 3
16.10. 08:55 | Zajímavý projekt

Uživatel GitHubu joeycastillo představil The Open Book Project, jehož cílem je vytvořit open-source čtečku elektronických knih. Projekt se zatím nachází v rané fázi vývoje, už nyní ale obsahuje použitelný návrh hardware prototypu „Feather Wing“, jehož cílem má být ověření konceptu na 4,2palcovém displeji. Tento koncept je postaven na kitu Adafruit Feather M4 Express, který ovládá hlavní desku s displeji a tlačítky. Po úspěšném ověření

… více »
Bystroushaak | Komentářů: 41
16.10. 05:00 | Nová verze

Byla vydána verze 5.0.0 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata (Wikipedie). Přehled novinek v oficiálním oznámení a v aktualizované dokumentaci.

Ladislav Hagara | Komentářů: 0
Kdy jste naposledy viděli počítač s připojeným běžícím CRT monitorem?
 (20%)
 (4%)
 (11%)
 (38%)
 (24%)
 (2%)
Celkem 422 hlasů
 Komentářů: 22, poslední 23.9. 08:36
Rozcestník

LD_PRELOAD a ioctl()

6.3.2009 01:02 | Přečteno: 2164× | Programování | Výběrový blog | poslední úprava: 10.3.2009 13:29

Občas se hodí zavolat vlastní verzi ioctl() bez rekompilace binárky (např. pro ladící účely a teprve poté zavolat reálné ioctl()), jako ukázku přikládám návrat MAC adresy:

$ ./get_mac 
00:0a:e4:a9:36:d8
$ LD_PRELOAD="libwrap_ioctl.so.1.0" ./get_mac 
0a:0b:0c:0d:0e:0f

Makefile:

all: libwrap_ioctl.so get_mac

libwrap_ioctl.so: ioctlw.c
	gcc -Wall -fPIC -shared -Wl,-soname,libwrap_ioctl.so.1           \
		-I/usr/lib/oss/include -I/usr/include                        \
		-o libwrap_ioctl.so.1.0 -ldl ioctlw.c

get_mac: get_mac.c
	gcc -Wall -o get_mac get_mac.c

ioctlw.c:

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <net/if.h>

#define SIOCGIFHWADDR   0x8927      /* Get hardware address     */

static int (*next_ioctl)(int fd, int request, void *data) = NULL;

int ioctl(int fd, int request, void *data)
{
    struct ifreq ifr;
    char *msg;

    if (request == SIOCGIFHWADDR) {
        memcpy(&ifr, data, sizeof(struct ifreq));

        ifr.ifr_hwaddr.sa_data[0] = 0x0A; 
        ifr.ifr_hwaddr.sa_data[1] = 0x0B;
        ifr.ifr_hwaddr.sa_data[2] = 0x0C;
        ifr.ifr_hwaddr.sa_data[3] = 0x0D;
        ifr.ifr_hwaddr.sa_data[4] = 0x0E;
        ifr.ifr_hwaddr.sa_data[5] = 0x0F;

        memcpy(data, &ifr, sizeof(struct ifreq));
        return 0;
    }

    if (next_ioctl == NULL) {
        fprintf(stderr, "ioctl: wrapping ioctl\n");
        fflush(stderr);

        next_ioctl = dlsym(RTLD_NEXT, "ioctl");

        fprintf(stderr, "next_ioctl = %p\n", next_ioctl);
        fflush(stderr);

        if ((msg = dlerror()) != NULL) {
            fprintf(stderr, "ioctl: dlopen failed: %s\n", msg);
            fflush(stderr);
            exit(1);
        }
        else {
            fprintf(stderr, "ioctl: wrapping done\n");
        }

        fflush(stderr);
    }

    return next_ioctl(fd, request, data);
}

//void *dlsym(void *handle, const char *symbol)
//{
//    void* result = __libc_dlsym(handle, symbol);
//
//    printf("%s\n", symbol);
//
//    return result;
//}

get_mac.c

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>

int main()
{
   int fd;
   struct ifreq ifr;
  
   fd = socket(AF_INET, SOCK_DGRAM, 0);
  
   ifr.ifr_addr.sa_family = AF_INET;
   strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
  
   ioctl(fd, SIOCGIFHWADDR, &ifr);
  
   close(fd);
  
   /* display result */
   printf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
           (unsigned char)ifr.ifr_hwaddr.sa_data[0],
           (unsigned char)ifr.ifr_hwaddr.sa_data[1],
           (unsigned char)ifr.ifr_hwaddr.sa_data[2],
           (unsigned char)ifr.ifr_hwaddr.sa_data[3],
           (unsigned char)ifr.ifr_hwaddr.sa_data[4],
           (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
  
   return 0;
}

Zdroje:

Using LD_PRELOAD libraries and glibc backtrace function for debugging
Simple sample of getting MAC address information
Wrapping dlsym()

       

Hodnocení: 88 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

6.3.2009 07:45 ...
Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()
LD_PRELOAD je sikovna vec. Zrovna vcera som si tak pisal firewall pre jedneho guesta vo vserveri, ktory sa inak k iptables nedostane. Pridal som LD_PRELOAD na kniznicu s vlastnym connect, send, recv, sento, recvfrom a mozem si kontrolovat koho pustim a koho nie. Iptables to nie je, ale lepsie ako nic.
Jardík avatar 6.3.2009 18:48 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()
Hlavně iptables nenastavíš pro jednotlivé programy (?), ale s LD_PRELOAD to půjde (až na nefunkčnost s rootem).
Věřím v jednoho Boha.
9.3.2009 23:25  
Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()
Nevedeli by ste o nejakom riešení pre staticky linkované binárky? Potreboval by som presne to isté - meniť MAC adresu, ale tu mi, žiaľ, LD_PRELOAD nepomôže.

Ďakujem.
Fuky avatar 10.3.2009 00:50 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()

Funkce ioctl() je v libc:

$ readelf -a /lib/i686/cmov/libc.so.6 |grep ioctl
  1361: 000d8040    63 FUNC    WEAK   DEFAULT   11 ioctl@@GLIBC_2.0

Co říká:

$ ldd tvoje_binarka
	linux-gate.so.1 =>  (0xb7f30000)
	libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7db8000)
	/lib/ld-linux.so.2 (0xb7f31000)

Myslím, že i Tvá binárka bude využívat libc, i když ostatní knihovny jsou přilinkovány staticky.

11.3.2009 15:29
Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()

Žiaľ, nie. Nesie so sebou vlastnú C knižnicu, ldd na ňu vôbec nefunguje.

Jardík avatar 16.3.2009 21:43 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()
Já myslel, že alespoň s jednou knihovnou to musí být slinkované vždy - a tou je ld-linux.so.*
Věřím v jednoho Boha.
17.3.2009 12:46 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()
ptrace(2) a přepisovat výsledky volání systému.
19.11.2018 09:00 the impossible quiz
Rozbalit Rozbalit vše susu
A good topic and worthy of attention. thanks abnjd has provided the impossible quiz

Založit nové vláknoNahoru

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.