herm1t LIVE!ng room - Не самый легкий способ [entries|archive|friends|userinfo]
herm1t

[ website | twilight corner in the herm1t's cave ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

Не самый легкий способ [Apr. 15th, 2007|04:32 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
[Current Mood | flirty]

extern int get_proc();
int main(int argc, char **argv)
{
        unsigned int *a = (unsigned int*)get_proc(0x08048000, "syscall");
        if (a != 0) {
                int (*s)() = (int (*)())*a;
                s(4, 1, "HI!\n", 4);
                s(1, 0);
        }
        syscall(1, 2);
}
		BITS	32
		CPU	386
		global	get_proc

e_ident		equ	0	; 16
e_type		equ	16	; 2
e_machine	equ	18	; 2
e_version	equ	20	; 2
e_entry		equ	24	; 4
e_phoff		equ	28	; 4
e_shoff		equ	32	; 4
e_flags		equ	36	; 4
e_ehsize	equ	40	; 2
e_phentsize	equ	42	; 2
e_phnum		equ	44	; 2
e_shentsize	equ	46	; 2
e_shnum		equ	48	; 2
e_shstrndx	equ	50	; 2

sh_name		equ	0	; 4
sh_type		equ	4	; 4
sh_flags	equ	8	; 4
sh_addr		equ	12	; 4
sh_offset	equ	16	; 4
sh_size		equ	20	; 4
sh_link		equ	24	; 4
sh_info		equ	28	; 4
sh_addralign	equ	32	; 4
sh_entsize	equ	36	; 4

%define	SHT_DYNSYM	11

; get_proc(elf_file,function_name)
get_proc:	pusha
		mov	esi, [esp + 36]
		mov	ebp, [esi + e_shoff]
		add	ebp, esi

	.get_sym_number:
		movzx	ecx, word [esi + e_shnum]
		mov	edi, ebp
	.L0:	cmp	dword [edi + sh_type], SHT_DYNSYM
		je	.do_dyn_symtab
		add	edi, 40
		loop	.L0
		jmp	.failed

	.do_dyn_symtab:
		; string = (char*)ehdr + shdr[shdr[i].sh_link].sh_offset;
		mov	eax, [edi + sh_link]
		lea	eax, [eax + eax*4]
		mov	edx, [ebp + eax * 8 + sh_offset]	
		add	edx, esi
		; symp = (Elf32_Sym *)((char*)ehdr + shdr[i].sh_offset);
		mov	ecx, [edi + sh_offset]
		add	ecx,esi
		; symt = symp;
		mov	ebx, ecx			
	.nexts:	mov	eax, [esp + 40]
		push	eax
		movzx	eax, word [ecx + 0]		; string + symp->st_name 
		add	eax, edx
		push	eax
		call	strcmp
		or	eax, eax
		jz	.founds
		add	ecx, 16				; sizeof(Elf32_Sym)
		mov	eax, ecx
		sub	eax, ebx
		cmp	eax, [edi + sh_size]
		jb	.nexts
		jmp	.failed
	.founds:sub	ecx, ebx
		shr	ecx, 4				; sym = symp - symt

		; string = (char*)ehdr + shdr[ehdr->e_shstrndx].sh_offset;
		movzx	eax, word [esi + e_shstrndx]
		lea	eax, [eax + eax * 4]
		mov	edx, [ebp + eax * 8 + sh_offset]
		add	edx, esi
		; find .rel.plt section
		movzx	ebx, word [esi + e_shnum]	
		mov	edi, ebp
	.L1:	mov	eax, [edi + sh_name]
		add	eax, edx
		cmp	dword [eax + 0], '.rel'
		jne	.nextr
		cmp	dword [eax + 4], '.plt'
		je	.do_rel
	.nextr:	add	edi, 40
		dec	ebx
		jnz	.L1
		jmp	.failed
		
	.do_rel:; relt = (Elf32_Rel*)((char*)ehdr + shdr[i].sh_offset);
		mov	ebx, [edi + sh_offset]
		add	ebx, esi
		; relp = relt
		mov	esi, ebx			
	.do_rel_l:
		mov	eax, [esi + 4]
		shr	eax, 8
		; ELF32_R_SYM(relp->r_info) == sym
		cmp	eax, ecx			
		je	.found
		add	esi, 8
		mov	eax, esi
		sub	eax, ebx
		cmp	eax, [edi + sh_size]
		jb	.do_rel_l

	.failed:xor	eax,eax
		jmp	.done
	.found:	mov	eax, [esi]			; relp->r_offset
	.done:	mov	[esp + 28], eax
		popa
		ret

strcmp:		push	ecx
		push	edx
		mov	ecx, [esp + 12]
		mov	edx, [esp + 16]
		xor	eax, eax
	.l:	mov	al, [ecx]
		cmp	al, [edx]
		jnz	.d
		inc	edx
		inc	ecx
		test	al, al
		jnz	.l
		jmp	.r	
	.d:	movzx	ecx, byte [edx]
		sub	eax, ecx	
	.r:	pop	edx
		pop	ecx
		retn	8
Жаль только, что подходящий набор функций (opendir,readdir,closedir,read,write,lseek,close,malloc,free; про mmap, уж и не говорю) встречается довольно редко, хотя опять-таки, подобрать можно... Ж;-) не забыть:
protected:
        pusha

        push    srest
        push    0x4000000
        push    0
        push    hsegv
        mov     eax, 67         ; sigaction
        mov     ebx, 11
        mov     ecx, esp
        mov     edx, 0
        int     0x80
        add     esp, 16
        ...        
restore:
        popa
        ret
        
hsegv:  mov     dword [esp + 0x40], restore
        ret     
        db      0
        align   8
srest:  pop     eax
        mov     eax, 119        ; sigreturn
        int     0x80
LinkLeave a comment

Comments:
From:[info]cqwerty@lj
Date:April 16th, 2007 - 04:10 am
(Link)
первый code snippet жутко напоминает одну ну очень известную подделку под win32 ;)), хотя, как я понимаю, здесь разбирается импорт victim'a.
что делает второй кусок к сожалению не воткнул, сискалов не знаю :).
From:[info]t1mreh@lj
Date:April 16th, 2007 - 06:25 am
(Link)
ы. в виндовые сорцы не гляжу, не знаю. да. второй - востановление после креша. особенность в том, что sigaction, и где в стеке лежат сохраненные регистры, объяснение в gcc/libjava/include/i386-signal.h; полезная весчь. Ж;-)