LINUX.ORG.RU

Сообщения rei3er

 

virt-manager и qemu

Форум — General

установил virt-manager и libvirt
через virt-manager успешно заинсталлил xp
однако при запуске все останавливается в самом начале
и дальше
«Boot from hard disk...»
не идет

при этом загрузка cpu 100%

если запустить через qemu напрямую без virt-manager, то все ок
в какую сторону копать?

хост: i5, 4gb, opensuse 11.3 (kernel 2.6.34), qemu-kvm 0.12.5

rei3er
()

chrome 5.0.375.55 stable + webmoney сертификат

Форум — General

проблема следующая

не могу заюзать webmoney сертификат

экспортирую p12 файл через pk12util правильно, пароль с nssdb базы убрал, ключ --auto-ssl-client-auth выставляю, тем не менее авторизация на light.webmoney.ru не проходит и явных ошибок тоже нет

включил в хроме логгинг, в конце появилось

NSS_Shutdown failed; see http://code.google.com/p/chromium/issues/detail?id=4609

ничего полезного по ссылке не нашел

может кто сталкивался с такой проблемой?

rei3er
()

WiMAX Network Service 1.4

Форум — Development

система openSUSE 11.3, x86_64, версия gcc
gcc version 4.5.0 20100604 [gcc-4_5-branch revision 160292] (SUSE Linux)

компилю сабж

в итоге wimaxd падает с SIGSEGV

после дебага выяснилось, что дело в неправильном вычислении смещения поля структуры List - pLock

struct List {
struct ListItem *pHead;
UINT32 dwLength;
wmx_critical_section pLock;
//struct ReadWriteLock *pLock;
};

а именно, есть функция l5_dispatcher_FindAllocConnectionByTargetID()

ее код

struct L5DispatcherConnection *l5_dispatcher_FindAllocConnectionByTargetID( L5_TARGET_ID nTargetID )
{
struct L5DispatcherConnection *resItem = NULL;
struct ListItem *tempItem = NULL;
UINT32 i = 0;
UINT32 listLen = 0;

TRACE(TR_MOD_L5_DISPATCHER, TR_SEV_DEBUG, («Enter into l5_dispatcher_FindAllocConnectionByTargetID function») );

wmx_enter_critical_section(AllocList.pLock);
...

после дизассемблирования имеем

Dump of assembler code for function l5_dispatcher_FindAllocConnectionByTargetID:
0x000000000045d3c0 <+0>:   push r12
0x000000000045d3c2 <+2>:   mov r9d,0x1f5
0x000000000045d3c8 <+8>:   mov r8d,0x4a8140
0x000000000045d3ce <+14>:   mov ecx,0x4a7c7c
0x000000000045d3d3 <+19>:   mov edx,0x40
0x000000000045d3d8 <+24>:   mov esi,0x200
0x000000000045d3dd <+29>:   push rbp
0x000000000045d3de <+30>:   mov r12d,edi
0x000000000045d3e1 <+33>:   xor edi,edi
0x000000000045d3e3 <+35>:   push rbx
0x000000000045d3e4 <+36>:   call 0x463320 <TraceAgent_SetMessageProperties>
0x000000000045d3e9 <+41>:   xor eax,eax
0x000000000045d3eb <+43>:   mov edi,0x4a7e50
0x000000000045d3f0 <+48>:   call 0x4633c0 <TraceAgent_PrintTrace>
0x000000000045d3f5 <+53>:   mov rdi,QWORD PTR [rip+0x278b30] # 0x6d5f2c <AllocList+12>
0x000000000045d3fc <+60>:   call 0x485670 <wmx_enter_critical_section>

как видно, смещение правильное - AllocList+12
(AllocList - глобальный объект структуры List)

в то же время в функции инициализации объекта List - List_Init, смещение 16, а не 12

void List_Init(struct List *pList, BOOL threadSafe)
{
if (!pList)
return;

pList->pHead = NULL;
pList->dwLength = 0;

if (TRUE == threadSafe) {
//pList->pLock =(struct ReadWriteLock *)malloc(sizeof(struct ReadWriteLock));
//RWL_Create(pList->pLock);
pList->pLock = malloc(sizeof(wmx_critical_section));
//wmx_startCriticalSection(pList->pLock);
wmx_init_critical_section(&(pList->pLock));
} else {
pList->pLock = NULL;
}
}

дизассемблируем

Dump of assembler code for function List_Init:
0x0000000000466a40 <+0>:   test rdi,rdi
0x0000000000466a43 <+3>:   push rbx
0x0000000000466a44 <+4>:   mov rbx,rdi
0x0000000000466a47 <+7>:   je 0x466a64 <List_Init+36>
0x0000000000466a49 <+9>:   cmp esi,0x1
0x0000000000466a4c <+12>:   mov QWORD PTR [rdi],0x0
0x0000000000466a53 <+19>:   mov DWORD PTR [rdi+0x8],0x0
0x0000000000466a5a <+26>:   je 0x466a70 <List_Init+48>
0x0000000000466a5c <+28>:   mov QWORD PTR [rdi+0x10],0x0
0x0000000000466a64 <+36>:   pop rbx
0x0000000000466a65 <+37>:   ret
0x0000000000466a66 <+38>:   nop WORD PTR cs:[rax+rax*1+0x0]
0x0000000000466a70 <+48>:   mov edi,0x8
0x0000000000466a75 <+53>:   call 0x4227e0 <malloc@plt>
0x0000000000466a7a <+58>:   lea rdi,[rbx+0x10]
0x0000000000466a7e <+62>:   mov QWORD PTR [rbx+0x10],rax

в чем может быть причина и как это победить?

rei3er
()

linux sockets

Форум — Development

ситуация следующая

есть listening сокет на сервере, принимающий соединения от клиентов

в некоторых случаях возникает ситуация, когда lsof показывает отсутствие дескрипторов в серверном процессе, которые соответствуют соединениям с клиентами, однако netstat утверждает, что валидные соединения есть

из всего, что может увеличивать счетчик ссылок на struct file, используется только eventpoll, однако его реализация увеличивает счетчик только на время работы epoll_ctl

кроме того из логов видно, что для всех N созданных соединений (сокетов) и close, и epoll_ctl(EPOLL_CTL_DEL) были вызываны

rei3er
()

/dev/kmem

Форум — Development

кто-нибудь успешно читал /dev/kmem под x86_64?
трабла в том, что для x86_64 
loff_t = typedef (long long), т. е знаковый размером 8b
а адресное пространство ядра - это диапазон 0xFFFFFFFF80000000+, т. е с точки зрения long long - значение адресов - отрицательные
в rw_verify_area() (sys_read()->vfs_read()->rw_verify_area()) идет проверка

int retval = -EINVAL;
if (unlikely((pos < 0) || (loff_t) (pos + count) < 0))
                 return retval;

т. к pos - отрицательный (выставленный через lseek()), идет возврат -EINVAL

>>>

rei3er
()

_GLOBAL_OFFSET_TABLE_

Форум — Development

необходимо получить адрес сабжа в функции инициализации динамической библиотеки

код

extern unsigned long _GLOBAL_OFFSET_TABLE_[];
void init(void) {
    void * ptr = _GLOBAL_OFFSET_TABLE_;
}

не работает, потому как компилятор генерирует релокацию GOTPCREL для сабжа, т. е ищет адрес GOT в самой GOT

>>>

rei3er
()

OpenSSL

Форум — Development

как проверить, поддерживает ли OpenSSL многопоточность?
т. е какой #define в <openssl/*.h> это определяет? 

>>>

rei3er
()

.eh_frame

Форум — Development

нужно запретить генерацию секции .eh_frame для объектного файла
по ключам GDB искал...ничего вроде нет
может плохо искал

>>>

rei3er
()

Linux 64-bit

Форум — Development

у кого есть 64-х битная система с установленным линуксом версии 2.6.x,
выполните следующую последовательность действий и отпишитесь, что получилось в итоге

1. пишем программу

#include <unistd.h>

int main() {
for (;;) pause();
return 0;
}

2. запускаем ее, через GDB подключаемся к соответствующему процессу

(gdb) attach <PID>

3. выравниваем текущий RIP по границе страницы (4096 байт) в меньшую сторону

(gdb) set $rip = <новый RIP>

4. выполняем одну инструкцию

(gdb) stepi

какое значение имеет RIP после выполнения?

>>>

rei3er
()

RAW socket

Форум — Development

есть код, он через RAW socket должен отправить по указанному DESTINATION_IP заголовок IP, при этом адрес отправителя в заголовке IP заменяется на SOURCE_IP
не работает, tcpdump пишет [21:49:54.033987 IP5 bad-hlen 16]
в чем может быть дело?


static char ip[20];

int main() {
int option = 1;
uint16_t word;
uint32_t dword;
struct sockaddr_in addr = {0};
int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sock < 0)
return 1;
if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &option, sizeof(option)) < 0)
return 2;
#define IP_HEADER_SIZE 5
word = 4 | (IP_HEADER_SIZE << 4) | (IPTOS_THROUGHPUT << 8);
memcpy(ip, &word, 2);
#define IP_SIZE 20
word = htons(IP_SIZE);
memcpy(ip + 2, &word, 2);
dword = 0;
memcpy(ip + 4, &dword, 4);
word = 0xFF | (IPPROTO_IP << 8);
memcpy(ip + 8, &word, 2);
word = 0;
memcpy(ip + 10, &word, 2);
#define SOURCE_IP "87.252.226.1"
if (inet_aton(SOURCE_IP, &addr.sin_addr) < 0)
return 5;
memcpy(ip + 12, &addr.sin_addr.s_addr, 4);
#define DESTINATION_IP "216.239.59.104"
if (inet_aton(DESTINATION_IP, &addr.sin_addr) < 0)
return 3;
if (sendto(sock, ip, 20, 0, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
perror(NULL);
return 6;
}
close(sock);
return 0;
}

>>>

rei3er
()

ptrace

Форум — Development

есть код

static unsigned char shellcode[32] = {
0x31, 0xFF, 0xB8, 0x0C, 0x00, 0x00, 0x00, 0x0F, 0x05, 0x48, 0x8D,
0xB8, 0x00, 0x10, 0x00, 0x00, 0xB8, 0x0C, 0x00, 0x00, 0x00, 0x0F,
0x05, 0x48, 0x2D, 0x00, 0x10, 0x00, 0x00, 0xCC, 0x90, 0x90
};

int main(int argc, char * argv[]) {
struct user_regs_struct regs;
pid_t pid = (pid_t)atoi(argv[1]);
if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) < 0)
return 1;
if (wait(NULL) < 0)
return 2;
if (ptrace(PTRACE_GETREGS, pid, NULL, &regs) < 0)
return 3;
unsigned long * ptr = (unsigned long*)shellcode;
unsigned long rip = regs.rip & ~4095;
unsigned long address = regs.rip;
long word;
do {
errno = 0;
if ((word = ptrace(PTRACE_PEEKTEXT, pid, rip, NULL) && errno) < 0)
return 4;
if (ptrace(PTRACE_POKETEXT, pid, rip, ptr) < 0)
return 5;
*ptr = (unsigned long)word;
rip += 8;
++ptr;
} while (!(rip & 0x20));
rip -= 32;
regs.rip = rip;
ptr -= 8;
if (ptrace(PTRACE_SETREGS, pid, NULL, &regs) < 0)
return 6;
if (ptrace(PTRACE_CONT, pid, NULL, NULL) < 0)
return 7;
if (wait(NULL) < 0)
return 8;
for (; !(rip & 0x20) && ((word = ptrace(PTRACE_POKETEXT, pid, rip, ptr)) >= 0 || !errno); rip += 8, ++ptr);
if (errno)
return 9;
regs.rip = address;
if (ptrace(PTRACE_SETREGS, pid, NULL, &regs) < 0)
return 10;
return 0;
}

при его выполнении brk у процесса pid не увеличивается
shellcode соответствует следующему коду

xor edi, edi
mov eax, 12 ; sys_brk
syscall
lea rdi, qword [rax + 4096]
mov eax, 12
syscall
sub rax, 4096
int3
nop
nop

в чем причина?

>>>

rei3er
()

RSS подписка на новые темы