zed.0xff.me

radare2 0.8.x unnecessary memory zeroing fix

radare2 bug

the bug only appears when debugging 32-bit binary on a 64-bit host

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
diff -r e96275c214b5 libr/io/p/io_ptrace.c
--- a/libr/io/p/io_ptrace.c        Mon Oct 24 04:35:42 2011 +0200
+++ b/libr/io/p/io_ptrace.c        Mon Oct 24 16:48:31 2011 +0300
@@ -34,9 +34,11 @@
 #if __OpenBSD__ || __KFBSD__
 #define debug_read_raw(x,y) ptrace(PTRACE_PEEKTEXT, (pid_t)(x), (caddr_t)(y), 0)
 #define debug_write_raw(x,y,z) ptrace(PTRACE_POKEDATA, (pid_t)(x), (caddr_t)(y), (int)(size_t)(z))
+typedef int ptrace_word;   // int ptrace(int request, pid_t pid, caddr_t addr, int data);
 #else
 #define debug_read_raw(x,y) ptrace(PTRACE_PEEKTEXT, x, y, 0)
 #define debug_write_raw(x,y,z) ptrace(PTRACE_POKEDATA, x, y, z)
+typedef void* ptrace_word; // long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
 #endif
 
 static int debug_os_read_at(int pid, ut32 *buf, int sz, ut64 addr) {
@@ -63,10 +65,11 @@
 }
 
 static int ptrace_write_at(int pid, const ut8 *pbuf, int sz, ut64 addr) {
-        ut32 *buf = (ut32*)pbuf;
-        ut32 words = sz / sizeof (ut32);
-        ut32 last = sz % sizeof (ut32);
-        ut32 x, lr, *at = (ut32*)(size_t)addr;
+        ptrace_word *buf = (ptrace_word*)pbuf;
+        ut32 words = sz / sizeof (ptrace_word);
+        ut32 last = sz % sizeof (ptrace_word);
+        ut32 x, *at = (ptrace_word*)(size_t)addr;
+        ptrace_word lr;
         if (sz<1 || addr==UT64_MAX)
                 return -1;
         for (x=0; x<words; x++)

лечим ConsoleKit и PowerDevil от Introspectable/Introspect

В настройках KDE power management появились такие сообщения:

There are some issues in your configuration. Please check the Capabilities page for more details.

ConsoleKit was not found active on your PC, or PowerDevil cannot contact it. ConsoleKit lets PowerDevil detect whether the current session is active, which is useful if you have more than one user logged into your system at any one time.

А также сообщения в логах вот такого вида:

Oct 26 11:36:30 localhost dbus-daemon: Rejected send message, 1 matched rules; type="method_call", sender=":1.32" (uid=1000 pid=6311 comm="/usr/bin/systemsettings) interface="org.freedesktop.DBus.Introspectable" member="Introspect" error name="(unset)" requested_reply=0 destination="org.freedesktop.ConsoleKit" (uid=0 pid=4771 comm="/usr/sbin/console-kit-daemon))

Лекарство:

1
2
3
4
5
6
7
8
9
10
11
12
--- /etc/dbus-1/system.d/ConsoleKit.conf.bk 2009-10-26 11:18:56.000000000 +0500
+++ /etc/dbus-1/system.d/ConsoleKit.conf 2009-10-26 11:36:53.000000000 +0500
@@ -21,6 +21,9 @@
<deny send_destination="org.freedesktop.ConsoleKit" send_interface="org.freedesktop.DBus.Properties" />
+ <allow send_destination="org.freedesktop.ConsoleKit"
+ send_interface="org.freedesktop.DBus.Introspectable"/>
+
<allow send_interface="org.freedesktop.ConsoleKit.Manager" send_member="Restart"/> <allow send_interface="org.freedesktop.ConsoleKit.Manager"

Ссылки: 1 2 3

[PATCH] ng_netflow: ifIndex from vlan

Во время оптимизации ng_netflow и выносом его на отдельную машину возникла такая проблема, что вместе с логами трафика из ng_netflow нужно сохранять и номер vlan’а, в котором пришел этот трафик.
Самое очевидное – использовать для этого netflow-поле ifIndex, благо трафик собирается с единственного (пока) роутера, и физических интерфейсов на нём негусто, так что ifIndex фактически не используется.
Самое неочевидное – заставить ng_netflow прописывать в потоках в ifIndex номер vlan’а..

Я пошел недеструктивным путём, и постарался при добавлении нового функционала ничего не сломать :)
В результате в команду NGM_NETFLOW_SETCONFIG добавлено новое значение: NG_NETFLOW_CONF_VLAN = 16, и включается новый режим на интерфейсе так:
(вместо iface=0 и conf=19 пропишите соответственно номер интерфейса и флаги, которые вам нужны, обращая внимание на +16 к значению conf если нужен новый режим установки ifIndex по vlan’у)

1
2
3
ngctl msg netflow: setconfig \{ iface=0 conf=19 \}   # 16 = NG_NETFLOW_CONF_VLAN
                                                     #  2 = NG_NETFLOW_CONF_EGRESS
                                                     #  1 = NG_NETFLOW_CONF_INGRESS

а вот, собственно, и патч:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
diff -ur /usr/src/sys/netgraph/netflow/ng_netflow.c kld/ng_netflow.c
--- /usr/src/sys/netgraph/netflow/ng_netflow.c 2009-04-15 09:14:26.000000000 +0600
+++ kld/ng_netflow.c 2009-09-04 06:25:42.000000000 +0600
@@ -486,7 +486,7 @@
struct m_tag *mtag; int pullup_len = 0; int error = 0, bypass = 0;
- unsigned int src_if_index;
+ unsigned int src_if_index = 0;
if (hook == priv->export) { /*
@@ -585,6 +585,10 @@
M_CHECK(sizeof(struct ip)); eh = mtod(m, struct ether_header *); ip = (struct ip *)(eh + 1);
+ if( (m->m_flags & M_VLANTAG) && (iface->info.conf & NG_NETFLOW_CONF_VLAN) ){
+ // tag is stored out-of-band
+ src_if_index = EVL_VLANOFTAG(m->m_pkthdr.ether_vtag);
+ }
break; case ETHERTYPE_VLAN: {
@@ -596,6 +600,9 @@
if (ntohs(evh->evl_proto) == ETHERTYPE_IP) { M_CHECK(sizeof(struct ip)); ip = (struct ip *)(evh + 1);
+ if (iface->info.conf & NG_NETFLOW_CONF_VLAN){
+ src_if_index = evh->evl_tag;
+ }
break; } }
@@ -639,6 +647,10 @@
switch (ntohs(eh->ether_type)) { case ETHERTYPE_IP: ip = (struct ip *)(eh + 1);
+ if( (m->m_flags & M_VLANTAG) && (iface->info.conf & NG_NETFLOW_CONF_VLAN) ){
+ // tag is stored out-of-band
+ src_if_index = EVL_VLANOFTAG(m->m_pkthdr.ether_vtag);
+ }
break; case ETHERTYPE_VLAN: {
@@ -646,6 +658,9 @@
evh = mtod(m, struct ether_vlan_header *); ip = (struct ip *)(evh + 1);
+ if (iface->info.conf & NG_NETFLOW_CONF_VLAN){
+ src_if_index = evh->evl_tag;
+ }
break; } default:
@@ -662,13 +677,16 @@
#undef M_CHECK
+
/* Determine packet input interface. Prefer configured. */
- src_if_index = 0;
- if (hook == iface->out || iface->info.ifinfo_index == 0) {
- if (m->m_pkthdr.rcvif != NULL)
- src_if_index = m->m_pkthdr.rcvif->if_index;
- } else
- src_if_index = iface->info.ifinfo_index;
+ if(!(iface->info.conf & NG_NETFLOW_CONF_VLAN) || src_if_index == 0){
+ src_if_index = 0;
+ if (hook == iface->out || iface->info.ifinfo_index == 0) {
+ if (m->m_pkthdr.rcvif != NULL)
+ src_if_index = m->m_pkthdr.rcvif->if_index;
+ } else
+ src_if_index = iface->info.ifinfo_index;
+ }
error = ng_netflow_flow_add(priv, ip, src_if_index);
diff -ur /usr/src/sys/netgraph/netflow/ng_netflow.h kld/ng_netflow.h
--- /usr/src/sys/netgraph/netflow/ng_netflow.h 2009-04-15 09:14:26.000000000 +0600
+++ kld/ng_netflow.h 2009-09-03 19:27:03.000000000 +0600
@@ -98,6 +98,7 @@
#define NG_NETFLOW_CONF_EGRESS 2 #define NG_NETFLOW_CONF_ONCE 4 #define NG_NETFLOW_CONF_THISONCE 8
+#define NG_NETFLOW_CONF_VLAN 16
/* This structure is passed to NGM_NETFLOW_SETCONFIG */ struct ng_netflow_setconfig {

proftpd utf8

Патчим proftpd на тему отображения в ftptop нормальных русских (ну, или японских, в общем utf8 :) букв

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
--- proftpd-1.3.2-orig/utils/ftptop.c 2009-03-05 16:43:35.000000000 +0500
+++ proftpd-1.3.2/utils/ftptop.c 2009-03-09 11:54:51.000000000 +0500
@@ -37,6 +37,7 @@
#include <signal.h> #include <stdlib.h> #include <time.h>
+#include <locale.h>
static const char *program = "ftptop";
@@ -553,6 +554,8 @@
signal(SIGINT, finish); signal(SIGTERM, finish);
+ setlocale(LC_ALL,"");
+
/* Initialize the display. */ initscr(); cbreak();
--- proftpd-1.3.2-orig/configure.in 2009-03-05 16:43:35.000000000 +0500
+++ proftpd-1.3.2/configure.in 2009-03-09 11:23:51.000000000 +0500
@@ -1720,9 +1720,14 @@
fi if test x"$ac_cv_header_ncurses_h" = xyes; then
- AC_CHECK_LIB(ncurses, initscr,
- [ CURSES_LIBS="-lncurses"
+ AC_CHECK_LIB(ncursesw, initscr,
+ [ CURSES_LIBS="-lncursesw"
AC_DEFINE(HAVE_LIBNCURSES, 1, [Define if you have ncurses])
+ ],
+ [ AC_CHECK_LIB(ncurses, initscr,
+ [ CURSES_LIBS="-lncurses"
+ AC_DEFINE(HAVE_LIBNCURSES, 1, [Define if you have ncurses])
+ ])
]) fi

после применения патча также нужно прогнать (в смысле запустить) ./autoconf, чтобы он перегенерил configure.

баг и обсуждение на багтрекере proftpd

в данный момент девелоперы proftpd активно фиксят поддержку utf8. так что скоро ждем в релизе :)

еще у него была проблемка с мусклом при включенном NLS. вылечил так:

1
2
3
4
5
6
7
8
9
10
11
--- proftpd-1.3.2-orig/contrib/mod_sql_mysql.c 2009-03-05 16:43:35.000000000 +0500
+++ proftpd-1.3.2/contrib/mod_sql_mysql.c 2009-03-05 16:44:02.000000000 +0500
@@ -440,7 +440,7 @@
return _build_error(cmd, conn); }
-#ifdef PR_USE_NLS
+#ifdef PR_USE_NLS_SQL
if (pr_encode_get_encoding() != NULL) { # if MYSQL_VERSION_ID >= 50007

FreeBSD & more than 32 arpd's

0. Предыстория

  • Есть фрибсд-сервер.
  • На сервере есть куча интерфейсов (~200).
  • На некоторых интерфейсах надо пускать arpd.

1. Bug

  • 16 arpd-ей запустились нормально.
  • На запуске 17-го получаем “arpd: bad interface configuration: not IP or Ethernet
  • Копание в исходниках показало что проблема в libdnet, в коем гвоздями прибито не юзать /dev/bpf’ы с номером более 32

3. Patch for /usr/ports/net/libdnet

1
2
3
4
5
6
7
8
9
10
11
--- src/eth-bsd.c.orig 2009-04-16 14:22:44.000000000 +0600
+++ src/eth-bsd.c 2009-04-16 14:23:31.000000000 +0600
@@ -45,7 +45,7 @@
int i; if ((e = calloc(1, sizeof(*e))) != NULL) {
- for (i = 0; i < 32; i++) {
+ for (i = 0; i < 256; i++) {
snprintf(file, sizeof(file), "/dev/bpf%d", i); e->fd = open(file, O_WRONLY); if (e->fd != -1 || errno != EBUSY)

4. FreeBSD PR: ports/133772