lunes, 9 de marzo de 2026

Asian Infrastructure Faces Web Server and Mimikatz Attacks

Critical infrastructure across Asia is currently under siege from sophisticated cyberattacks that combine web server exploits with the notorious Mimikatz credential-stealing tool. This alarming development highlights the evolving tactics of threat actors who are specifically targeting essential services and systems that underpin modern society.

Asian Infrastructure Faces Web Server and Mimikatz Attacks

Security researchers have identified a concerning pattern of attacks wherein malicious actors are exploiting vulnerabilities in web servers to gain initial access to networks belonging to critical infrastructure organisations. Once inside, attackers deploy Mimikatz, a powerful post-exploitation tool originally designed for legitimate security testing but frequently weaponised by cybercriminals. Mimikatz specialises in extracting plaintext passwords, hashes, and Kerberos tickets from memory, allowing attackers to move laterally across networks and escalate their privileges.

The targeting of Asian critical infrastructure is particularly worrying given the region's rapid digitalisation and the vital role these systems play in energy, water, transportation, and telecommunications sectors. A successful breach could potentially disrupt essential services affecting millions of people and cause significant economic damage. The combination of web server exploits and credential theft represents a sophisticated attack chain that demonstrates the adversaries' technical capabilities and strategic planning.

This campaign underscores the critical importance of implementing robust cybersecurity measures, particularly within critical infrastructure environments. Organisations must prioritise patching known vulnerabilities in web-facing systems, implement strong access controls, and deploy advanced monitoring solutions to detect suspicious activity. The integration of Zero Trust architectures and artificial intelligence-powered security tools can provide enhanced protection by assuming no implicit trust and continuously verifying every access request across the entire network infrastructure.

Fuente Original: https://thehackernews.com/2026/03/web-server-exploits-and-mimikatz-used.html

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

domingo, 8 de marzo de 2026

IA Revela Hackers y Cuentas Anonimas en Redes Sociales

Una nueva investigación de The Guardian pone de manifiesto una preocupante realidad: la inteligencia artificial (IA) está siendo utilizada por hackers para desenmascarar perfiles anónimos en redes sociales. Este avance tecnológico representa una amenaza significativa para la privacidad y la seguridad en línea, ya que permite identificar a individuos que buscan mantener su identidad oculta por diversas razones.

IA Revela Hackers y Cuentas Anónimas en Redes Sociales

El estudio detalla cómo los algoritmos de IA pueden analizar patrones de comportamiento, estilo de escritura y otras metadatos para conectar cuentas que aparentemente no tienen relación alguna. Esto incluye la capacidad de vincular tuits anónimos o publicaciones en foros con perfiles personales previamente conocidos o con información disponible públicamente. La IA se convierte así en una herramienta poderosa para la de-anonimización, sorteando las medidas de seguridad que los usuarios implementan para proteger su identidad digital.

Los hallazgos son alarmantes, ya que la capacidad de la IA para identificar usuarios detrás de la anonimidad podría ser explotada para acoso, doxxing, o incluso para fines de vigilancia. Los investigadores enfatizan la necesidad de desarrollar contramedidas y nuevas formas de proteger la privacidad en un entorno digital cada vez más vigilado y analizado por sistemas de inteligencia artificial. La investigación subraya la urgente necesidad de abordar las implicaciones éticas y de seguridad de estas nuevas capacidades de la IA en el ámbito de las redes sociales.

Fuente Original: https://news.google.com/rss/articles/CBMikwFBVV95cUxOS3pOcTBKMldPRlFpZVRveXdaOHk1bEJ3eGFZczBvSno5eHB4VURVaUlqOFZ3WlZHaVVUemZ2VG5oaDBWOUY1ZFVYU0R1X2FFbXVQandjRHFQdFZjemFmWE5TRkFORXVTbUhlcWVuZ1A5eEpqelhCQ1RBMnEtd3Q2aWpPb09ybDZ4NFlHVEs0SUp1VUE?oc=5

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

Agentes IA Modelos Superiores No Son Suficientes

El CEO de LangChain, Harrison Chase, enfatiza que para que los agentes de IA sean verdaderamente efectivos y lleguen a producción, no basta con tener modelos más inteligentes. La clave reside en la "ingeniería de arneses", una evolución de la ingeniería de contexto. A diferencia de los arneses tradicionales que limitaban a los modelos, los diseñados para agentes de IA les otorgan mayor independencia y capacidad para realizar tareas complejas a largo plazo.

Agentes IA: Modelos Superiores No Son Suficientes

Chase destaca la importancia de permitir que los modelos de lenguaje grandes (LLMs) gestionen su propio contexto y decidan qué información es relevante. Esto facilita la creación de asistentes autónomos capaces de planificar y ejecutar tareas a lo largo de múltiples pasos, manteniendo la coherencia. Menciona AutoGPT como un ejemplo de cómo modelos insuficientemente capaces llevaron al fracaso de proyectos prometedores, pero subraya que la mejora continua de los LLMs hace ahora viables estas arquitecturas.

LangChain ha desarrollado Deep Agents, un arnés de propósito general que incorpora planificación, gestión de archivos y tokens, ejecución de código y habilidades de memoria. Permite la delegación a subagentes especializados que trabajan en paralelo, aislando contextos para mayor eficiencia. La capacidad de los agentes para registrar sus pensamientos y acciones a lo largo de un proceso de múltiples pasos es crucial para el seguimiento del progreso y la coherencia. Chase compara la ingeniería de contexto con asegurarse de que el LLM reciba la información correcta en el momento y formato adecuados, lo cual es la diferencia entre el éxito y el fracaso de un agente.

Fuente Original: https://venturebeat.com/orchestration/langchains-ceo-argues-that-better-models-alone-wont-get-your-ai-agent-to

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

Jefa de Robotica de OpenAI Renuncia por Acuerdo con el Pentagono

La jefa de robótica y hardware físico de OpenAI, Caitlin Kalinowski, ha anunciado su renuncia, citando preocupaciones sobre la rapidez y la falta de deliberación en el acuerdo de la compañía con el Pentágono. Kalinowski, quien lideró el programa de IA física de OpenAI durante 16 meses, expresó públicamente que, si bien la IA tiene un rol importante en la seguridad nacional, la vigilancia de ciudadanos sin supervisión judicial y la autonomía letal sin autorización humana cruzaron líneas que merecían un debate más profundo.

Jefa de Robótica de OpenAI Renuncia por Acuerdo con el Pentágono

La renuncia de Kalinowski pone un rostro y un cargo a la admisión previa de Sam Altman, CEO de OpenAI, de que el acuerdo con el Pentágono fue "definitivamente apresurado" y generó críticas significativas. La ejecutiva enfatizó que su decisión se basó en principios y que respeta al equipo directivo, pero subrayó la importancia de una gobernanza robusta para decisiones de tal envergadura, evitando que se precipiten.

El conflicto se desató luego de que Anthropic, previamente el único proveedor de IA autorizado en las redes clasificadas del Pentágono, no llegara a un acuerdo con el Departamento de Defensa. Las negociaciones fracasaron debido a las objeciones de Anthropic a desplegar sus modelos para vigilancia masiva interna o armas totalmente autónomas, mientras que el Pentágono insistió en un lenguaje que permitiera el uso "para todos los fines legales". Tras el colapso, el presidente Trump instruyó a las agencias federales a dejar de usar la tecnología de Anthropic. Horas después, OpenAI anunc ió su propio acuerdo, afirmando que incluye protecciones similares, como la exclusión de la vigilancia doméstica y las armas autónomas.

La renuncia de Kalinowski, una ejecutiva con una amplia experiencia en hardware, incluyendo roles clave en Apple y Meta, añade una dimensión de confianza y talento a las preocupaciones que rodean este acuerdo. El incidente ha tenido repercusiones externas, con reportes de un aumento en las desinstalaciones de ChatGPT y un ascenso de la app de Anthropic en las tiendas de aplicaciones. La partida de Kalinowski subraya que el precio de la desescalada del conflicto entre la industria de la IA y el gobierno, en términos de talento y confianza, aún se está evaluando.

Fuente Original: https://thenextweb.com/news/openais-robotics-chief-quits-over-the-pentagon-deal

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

AI Leaders Fear Government Seizing Tech

Top executives in the Artificial Intelligence sector are expressing growing concern that governments, particularly the US government, might move to nationalise AI technology. This worry stems from the immense strategic implications of advanced AI, drawing parallels to historical government-led scientific endeavours like the Manhattan Project and the space race. The sentiment is echoed by prominent figures such as Palantir's CEO, who directly warned that widespread job displacement and perceived threats to military interests could provoke such a governmental takeover.


Sam Altman, the CEO of OpenAI, has publicly mused about the possibility of AGI development becoming a government-led project. He acknowledges that while it might not be the most probable outcome currently, he has considered the implications of private AI companies being nationalised into public initiatives. Altman also stressed the vital importance of a close working relationship between governments and the companies developing this cutting-edge technology. This concern is further fuelled by recent actions, such as the US Department of Defense's potential use of the Defense Production Act against Anthropic. This act grants the government the power to mandate contracts for critical goods, which could essentially amount to a 'soft nationalisation' of a company's production capabilities. Altman himself has reportedly felt the pressure of potential nationalisation behind many questions directed at him.

The article highlights that the future development and deployment of AI are complex issues, and the article probes how AI companies should engage with governmental bodies. Discussions around AGI development and potential government contracts have even been raised with OpenAI's Head of National Security Partnerships, exploring scenarios where a government might compel access to advanced AI models. While OpenAI currently maintains control over its model deployments, internal sentiments within AI companies are also noteworthy. A significant number of employees from OpenAI and Google have signed an open letter urging their leadership to refuse the use of their AI models for domestic mass surveillance and autonomous killing without human oversight. This internal resistance adds another layer to the complex ethical and strategic considerations surrounding the future of AI and its governance.

Fuente Original: https://yro.slashdot.org/story/26/03/07/2058213/ai-ceos-worry-the-government-will-nationalize-ai?utm_source=rss1.0mainlinkanon&utm_medium=feed

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

Renuncia en OpenAI Demasiada prisa en el trato militar

El jefe de robótica de OpenAI ha presentado su renuncia, y su decisión parece estar ligada a un reciente acuerdo con el Pentágono. A través de sus redes sociales, el ahora ex-empleado expresó su profundo respeto por el equipo y el trabajo realizado, pero señaló que la forma en que se anunció el trato con el Departamento de Defensa de EE. UU. fue apresurada y carente de las debidas salvaguardas.


Según sus declaraciones, el asunto no es personal sino de principios. Si bien reconoce el importante papel que la inteligencia artificial puede desempeñar en la seguridad nacional, levantó serias preocupaciones sobre la vigilancia de ciudadanos estadounidenses sin la debida supervisión judicial y la implementación de armamento autónomo sin autorización humana. Estos puntos, a su juicio, merecían una deliberación mucho mayor de la que recibieron antes del anuncio oficial.

La raíz de su dimisión parece ser una cuestión de gobernanza y la rapidez con la que se cerró el trato, antes de que las políticas y los límites éticos estuvieran claramente definidos. A pesar de que OpenAI ha confirmado la renuncia y ha manifestado que el acuerdo con el Pentágono establece un camino para el uso responsable de la IA en seguridad nacional, estableciendo líneas rojas claras contra la vigilancia interna y las armas autónomas, el ex-jefe de robótica considera que estas importantes decisiones no deben tomarse a la ligera ni bajo presión de tiempo.

Fuente Original: https://hardware.slashdot.org/story/26/03/07/2213221/openais-head-of-robotics-resigns-s ays-pentagon-deal-was-rushed-without-the-guardrails-defined?utm_source=rss1.0mainlinkanon&utm_medium=feed

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

OpenAI Codex Detecta 10561 Vulnerabilidades de Seguridad

En un análisis masivo de seguridad sin precedentes, OpenAI Codex ha escaneado más de 1.2 millones de commits de código y ha identificado 10,561 problemas críticos de alta severidad. Este hallazgo pone de manifiesto la magnitud de los desafíos de seguridad que enfrentan los equipos de desarrollo en la actualidad y cómo la inteligencia artificial está transformando la forma en que detectamos vulnerabilidades en el código.

OpenAI Codex Detecta 10,561 Vulnerabilidades de Seguridad

La herramienta de OpenAI Codex, conocida principalmente por sus capacidades de generación de código, ha demostrado ser igualmente efectiva en el análisis de seguridad. El escaneo masivo revela que las vulnerabilidades de alta severidad son más comunes de lo que muchos equipos de desarrollo podrían imaginar, representando un riesgo significativo para la integridad de aplicaciones y sistemas en producción.

Este descubrimiento coincide con la creciente adopción de modelos de seguridad Zero Trust combinados con inteligencia artificial. Las organizaciones están reconociendo que la protección tradicional ya no es suficiente en la era de la IA generativa. El enfoque Zero Trust Everywhere busca proporcionar protección integral en toda la fuerza laboral, sucursales, nubes y aplicaciones de IA generativa, asegurando que cada punto de acceso sea verificado y validado continuamente.

La integración de la inteligencia artificial en los procesos de seguridad representa un cambio paradigmático en cómo las empresas abordan la ciberseguridad. Con la capacidad de analizar millones de líneas de código en tiempo récord, herramientas como Codex pueden identificar patrones de vulnerabilidades que serían prácticamente imposibles de detectar mediante revisiones manuales. Esto no solo acelera el proceso de identificación de problemas, sino que también permite a los equipos de desarrollo abordar las vulnerabilidades antes de que lleguen a producción, reduciendo significativamente el riesgo de brechas de seguridad.

Fuente Original: https://thehackernews.com/2026/03/openai-codex-security-scanned-12.html

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

AI Discovers Critical Firefox Security Vulnerabilities Rapidly

In a groundbreaking demonstration of artificial intelligence capabilities, Anthropic's Claude Opus 4.6 has proven itself as a formidable tool for identifying security vulnerabilities in one of the world's most scrutinised web browsers. During a recent internal test, the advanced AI model took merely 20 minutes to uncover its first Firefox browser bug, marking the beginning of an impressive security audit that would reveal vulnerabilities at an unprecedented rate.

AI Discovers Critical Firefox Security Vulnerabilities Rapidly

Over a concentrated two-week period in January, Claude Opus 4.6 discovered more than 100 bugs within Firefox's codebase, with 14 classified as high severity. To put this achievement into perspective, Mozilla reported that the AI found more high-severity bugs during this brief testing window than the global community typically reports over two months. This is particularly remarkable considering that Firefox patched only 73 high or critical severity bugs throughout the entire previous year.

Mozilla engineers were genuinely impressed by the findings. Brian Grinstead, an engineer with Mozilla, immediately requested additional information after reviewing the first submission, recognising the serious nature of the discoveries. The Firefox browser, maintained by Mozilla's parent organisation, represents one of the most rigorously examined and security-hardened codebases available on the web, benefiting from continuous scrutiny by a global open-source community. Despite decades of extensive fuzzing, static analysis, and regular security reviews, Claude managed to reveal numerous previously unknown vulnerabilities.

What makes these discoveries particularly valuable is the nature of the bugs identified. Whilst some lower-severity findings overlapped with issues traditionally uncovered through fuzzing—an automated testing technique—the AI model also identified distinct classes of logic errors that conventional fuzzers had never previously detected. Anthropic provided comprehensive test cases that enabled Mozilla's security team to quickly verify and reproduce each issue, and within hours, platform engineers began implementing fixes.

Mozilla views this collaboration as clear evidence that large-scale, AI-assisted analysis represents a powerful new addition to security engineers' toolkit. Anthropic has since expanded this capability, rolling out Claude Code Security as an automated code security testing tool and applying similar techniques to discover vulnerabilities in the Linux kernel. The implications suggest a substantial backlog of now-discoverable bugs exists across widely deployed software systems.

Fuente Original: https://news.slashdot.org/story/26/03/07/204222/how-anthropics-claude-helped-mozilla-improve-firefoxs-security?utm_source=rss1.0mainlinkanon&utm_medium=feed

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

sábado, 7 de marzo de 2026

IA Descubre 22 Fallos en Firefox Alerta de Seguridad

En una demostración impactante del poder de la inteligencia artificial en la ciberseguridad, la empresa Anthropic ha revelado el descubrimiento de 22 vulnerabilidades críticas en el navegador Mozilla Firefox. Lo más destacable es que este hallazgo no fue obra de un equipo de hackers humanos, sino del modelo de IA más avanzado de Anthropic, Claude Opus, que se utilizó para analizar el código fuente del navegador.

IA Descubre 22 Fallos en Firefox: ¡Alerta de Seguridad!

Este avance subraya la creciente capacidad de las IAs para identificar debilidades de seguridad que podrían pasar desapercibidas para los métodos tradicionale s. La detección de 22 fallos, muchos de los cuales podrían tener implicaciones significativas para la privacidad y seguridad de los usuarios, pone de manifiesto la necesidad de integrar herramientas de IA en los procesos de desarrollo y auditoría de software. Anthropic ha compartido sus hallazgos con Mozilla, quienes ya están trabajando en parches para corregir estas vulnerabilidades. Este incidente sirve como un recordatorio de la constante evolución de las amenazas de ciberseguridad y la importancia de la innovación tecnológica para contrarrestarlas.

La utilizacion de IA como Claude Opus no solo acelera el proceso de descubrimiento de fallos, sino que también permite una comprensión más profunda de las posibles rutas de ataque, abriendo nuevas vías para fortalecer la defensa digital. La colaboración entre empresas de IA y desarrolladores de software es clave para asegurar un ecosistema digital más seguro para todos.

Fuente Original: https://thehackernews.com/2026/03/anthropic-finds-22-firefox.html

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

AI Warfare Iran Conflict Fuels New AI Military Tech

The recent US strikes on Iran signal the dawn of a significant new era in warfare, driven by the large-scale integration of artificial intelligence. While AI tools are being deployed, military officials emphasize that these systems do not make autonomous targeting decisions or replace human oversight. Instead, their primary role is to enhance human capabilities by helping to identify crucial information and enabling personnel to make more informed and rapid decisions on the battlefield.


The US military has been investing heavily in AI development for years, aiming to leverage its power for strategic advantage. This push involves using AI to sift through vast amounts of data, identify 'points of interest,' and organise information for greater clarity. This application is exemplified by systems like Palantir's Maven Smart System, which incorporates large language models such as Anthropic's Claude AI. Claude has reportedly become integral to US operations against Iran, accelerating the development of military AI capabilities.

However, this advancement is not without its critics. Human rights groups, like the coalition Stop Killer Robots, express concerns that AI-driven decision-support systems could dangerously blur the lines between recommending and executing military actions. Despite these concerns, the US military asserts that its use of AI assistance adheres strictly to US policy, military doctrine, and the law, ensuring a rigorous process before any action is taken. The conflict in Iran is therefore serving as a crucial, large-scale proving ground for these advanced AI military technologies.

Fuente Original: https://tech.slashdot.org/story/26/03/06/1629255/iran-war-provides-a-large-scale-test-for-ai-assisted-warfare?utm_source=rss1.0mainlinkanon&utm_medium=feed

Artículos relacionados de LaRebelión:

Artículo generado mediante LaRebelionBOT

10 Ejercicios Resueltos de Ensamblador (x86 y MIPS): Arquitectura de Computadores

Llegamos a la última frontera en larebelion.com. Si has sobrevivido a la programación en C, a la gestión de memoria y a los Sockets, es hora de hablar directamente con el procesador. Bienvenidos a Arquitectura de Computadores.

En las universidades españolas, normalmente se enseña Ensamblador usando MIPS (con simuladores como MARS o SPIM) o x86 (usando NASM en Linux). En este post, hemos recopilado 10 ejercicios de exámenes de ambos mundos para que domines los registros, los saltos condicionales y las llamadas al sistema (syscalls).


1. MIPS: Suma de dos enteros (UPM)

Enunciado: Escribe un programa en ensamblador MIPS que cargue dos números enteros en registros, los sume y guarde el resultado en un tercer registro.

.text
.globl main

main:
    li $t0, 15 # Cargar el valor inmediato 15 en $t0
    li $t1, 20 # Cargar el valor inmediato 20 en $t1
    add $t2, $t0, $t1 # $t2 = $t0 + $t1 (15 + 20 = 35)

    # Terminar el programa limpiamente
    li $v0, 10 # Syscall 10 = exit
    syscall

2. x86 (NASM): Imprimir "Hola Mundo" (UPC)

Enunciado: Crea el clásico "Hola Mundo" en ensamblador x86 de 32 bits para Linux, usando interrupciones de sistema (int 0x80).

section .data
    msg db 'Hola Mundo', 0xA ; Mensaje con salto de línea
    len equ $ - msg ; Longitud del mensaje

section .text
    global _start

_start:
    mov eax, 4 ; Syscall 4 = sys_write
    mov ebx, 1 ; File descriptor 1 = stdout
    mov ecx, msg ; Puntero a la cadena
    mov edx, len ; Tamaño de la cadena
    int 0x80 ; Llamada al kernel de Linux

    mov eax, 1 ; Syscall 1 = sys_exit
    int 0x80

3. MIPS: Condicional IF-ELSE (UCM)

Enunciado: Dado un valor en $t0, si es mayor o igual a 5, almacena un 1 en $t1 (aprobado), si no, almacena un 0 (suspenso).

.text
main:
    li $t0, 4 # Nota del alumno
    bge $t0, 5, aprobado # Branch if Greater or Equal to 5

suspenso:
    li $t1, 0 # Cargar 0 (suspenso)
    j fin # Salto incondicional a 'fin'

aprobado:
    li $t1, 1 # Cargar 1 (aprobado)

fin:
    li $v0, 10
    syscall

4. x86 (NASM): Bucle FOR simple (UGR)

Enunciado: Escribe un bucle en ensamblador x86 que simule un for(int i=5; i>0; i--) utilizando la instrucción loop y el registro ecx.

section .text
    global _start

_start:
    mov ecx, 5 ; ecx es el contador del bucle
    mov eax, 0 ; eax será el acumulador

mi_bucle:
    add eax, 1 ; Operación interna del bucle
    loop mi_bucle ; Decrementa ecx y salta si ecx != 0

    mov eax, 1
    int 0x80

5. MIPS: Recorrer un Array (US)

Enunciado: Tienes un array de 3 enteros en memoria. Escribe el código MIPS para sumar todos sus elementos y guardar el total en $t2.

.data
array: .word 10, 20, 30

.text
main:
    la $t0, array # Cargar dirección base del array
    li $t2, 0 # Inicializar suma total a 0

    lw $t1, 0($t0) # Leer primer elemento
    add $t2, $t2, $t1

    lw $t1, 4($t0) # Leer segundo elemento (+4 bytes)
    add $t2, $t2, $t1

    lw $t1, 8($t0) # Leer tercer elemento (+8 bytes)
    add $t2, $t2, $t1

    li $v0, 10
    syscall

6. x86 (NASM): Operaciones a nivel de Bits (UV)

Enunciado: Usa máscaras y operaciones bit a bit (AND, OR, XOR) para poner a cero el registro eax, encender su bit menos significativo y luego invertirlo.

section .text
    global _start

_start:
    xor eax, eax ; Forma eficiente de poner eax a 0
    or eax, 1 ; Enciende el bit menos significativo (eax = 1)
    not eax ; Invierte todos los bits (Complemento a 1)

    mov eax, 1
    int 0x80

7. MIPS: Leer entero por teclado (UC3M)

Enunciado: Escribe un programa que pida al usuario por teclado su edad y la guarde en un registro utilizando las Syscalls de SPIM/MARS.

.text
main:
    # Syscall 5 = Read Integer
    li $v0, 5
    syscall

    # El entero leído queda guardado en $v0
    move $t0, $v0 # Lo movemos a $t0 para protegerlo

    li $v0, 10
    syscall

8. x86 (NASM): Longitud de una Cadena (UAM)

Enunciado: Implementa el equivalente a strlen() de C en ensamblador x86, iterando hasta encontrar el byte nulo (0x00).

section .data
    cadena db "Ingenieria", 0

section .text
    global _start

_start:
    mov esi, cadena ; Puntero al inicio de la cadena
    xor ecx, ecx ; ecx = 0 (Contador)

contar:
    cmp byte [esi], 0 ; ¿Es el fin de cadena (\0)?
    je fin_conteo ; Si es cero, salta a fin
    inc esi ; Avanza al siguiente carácter
    inc ecx ; Incrementa el contador
    jmp contar

fin_conteo:
    ; En ecx queda almacenada la longitud (10)
    mov eax, 1
    int 0x80

9. MIPS: Pila (Stack) y Funciones (UMA)

Enunciado: Muestra cómo guardar el registro de retorno $ra en la pila antes de hacer una llamada a una subrutina anidada, y cómo restaurarlo después.

.text
mi_funcion:
    # Prólogo: Reservar espacio en la pila y guardar $ra
    addi $sp, $sp, -4
    sw $ra, 0($sp)

    # [Cuerpo de la función aquí]

    # Epílogo: Restaurar $ra y liberar pila
    lw $ra, 0($sp)
    addi $sp, $sp, 4
    jr $ra # Jump Register (Retorno)

10. x86 (NASM): Multiplicación (UNED)

Enunciado: Multiplica el valor 10 por 5 usando la instrucción mul y guarda el resultado en una variable de memoria.

section .bss
    resultado resb 4 ; Reserva 4 bytes para el resultado

section .text
    global _start

_start:
    mov eax, 10 ; eax siempre es uno de los operandos en mul
    mov ebx, 5
    mul ebx ; Multiplica eax por ebx. Resultado en edx:eax

    mov [resultado], eax ; Guarda los 32 bits bajos en la variable

    mov eax, 1
    int 0x80

10 Ejercicios Resueltos de Redes: Sockets TCP y UDP en Python y C (Nivel Universidad)

Cualquier aplicación moderna necesita conectarse a Internet. En la asignatura de Redes de Computadores, la teoría del Modelo OSI está muy bien, pero donde de verdad se aprende es programando Sockets.

En larebelion.com hemos preparado 10 ejercicios de exámenes de universidades españolas. Nos centraremos principalmente en la API de Sockets de Python por su claridad, pero incluiremos la base en C para los más puristas. Prepara tus puertos locales, ¡que empezamos a escuchar conexiones!


1. Servidor TCP Básico (UPM)

Enunciado: Crea un servidor TCP en Python que escuche en el puerto 8080. Cuando un cliente se conecte, debe enviarle el mensaje "Bienvenido al servidor" y cerrar la conexión.

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 8080))
server.listen(5)
print("Servidor TCP escuchando en puerto 8080...")

while True:
    client_socket, addr = server.accept()
    print(f"Conexión establecida desde {addr}")
    client_socket.send(b"Bienvenido al servidor\n")
    client_socket.close()

2. Cliente TCP Básico (UPC)

Enunciado: Escribe el código del cliente en Python que se conecte al servidor TCP del ejercicio anterior (en localhost), reciba el mensaje, lo imprima por pantalla y se desconecte.

import socket

cliente = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cliente.connect(('127.0.0.1', 8080))

# Recibimos hasta 1024 bytes
respuesta = cliente.recv(1024)
print("Mensaje del servidor:", respuesta.decode('utf-8'))
cliente.close()

3. Servidor UDP de Eco (UV)

Enunciado: A diferencia de TCP, UDP no está orientado a conexión. Crea un servidor UDP en el puerto 9000 que reciba un mensaje y se lo devuelva al remitente exactamente igual (Echo Server).

import socket

# SOCK_DGRAM indica que usaremos UDP
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 9000))
print("Servidor UDP Eco iniciado...")

while True:
    datos, direccion = server.recvfrom(1024)
    print(f"Recibido de {direccion}: {datos.decode()}")
    server.sendto(datos, direccion)

4. Cliente UDP interactivo (UGR)

Enunciado: Crea un cliente UDP que pida al usuario que escriba un texto por consola, lo envíe al servidor del ejercicio 3 y muestre la respuesta.

import socket

cliente = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
direccion_servidor = ('127.0.0.1', 9000)

mensaje = input("Escribe un mensaje para enviar: ")
cliente.sendto(mensaje.encode(), direccion_servidor)

respuesta, addr = cliente.recvfrom(1024)
print("Eco del servidor:", respuesta.decode())
cliente.close()

5. Estructuras en C: Inicializar un Socket (UC3M)

Enunciado: En C, las cosas son más manuales. Escribe el fragmento de código necesario en C para crear un socket TCP y preparar la estructura sockaddr_in para el puerto 80.

#include <sys/socket.h>
#include <netinet/in.h>

int server_fd;
struct sockaddr_in address;

// 1. Crear file descriptor del socket
server_fd = socket(AF_INET, SOCK_STREAM, 0);

// 2. Configurar la estructura de red
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(80); // htons convierte al formato de red

6. Python: Servidor TCP Multihilo (US)

Enunciado: Un servidor básico se bloquea con cada cliente. Usa la librería threading para crear un servidor TCP que asigne un hilo nuevo a cada cliente que se conecte, permitiendo conexiones concurrentes.

import socket
import threading

def manejar_cliente(conn, addr):
    print(f"Nuevo hilo para {addr}")
    conn.send(b"Hola desde un hilo concurrente!\n")
    conn.close()

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 8888))
server.listen(5)

while True:
    conn, addr = server.accept()
    hilo = threading.Thread(target=manejar_cliente, args=(conn, addr))
    hilo.start()

7. Resolución de DNS (UAM)

Enunciado: Usa los métodos de socket en Python para preguntar al usuario un nombre de dominio (ej: google.com) y devolver su dirección IP (resolución DNS directa).

import socket

def obtener_ip():
    dominio = input("Introduce un dominio (ej. larebelion.com): ")
    try:
        ip = socket.gethostbyname(dominio)
        print(f"La IP de {dominio} es {ip}")
    except socket.gaierror:
        print("No se pudo resolver el hostname.")

obtener_ip()

8. Concurrencia en C usando Fork (UNED)

Enunciado: En C de Linux, la concurrencia a menudo se logra creando procesos hijos. Escribe la lógica del bucle principal de un servidor concurrente usando fork().

// Asumimos que socket, bind y listen ya están hechos
while(1) {
    int client_socket = accept(server_fd, NULL, NULL);
    if (fork() == 0) {
        // --- ESTE ES EL PROCESO HIJO ---
        close(server_fd); // El hijo no necesita escuchar
        send(client_socket, "Hola\n", 5, 0);
        close(client_socket);
        exit(0); // Matamos al hijo tras atender
    } else {
        // --- ESTE ES EL PROCESO PADRE ---
        close(client_socket); // El padre delega en el hijo
    }
}

9. Escáner de Puertos Básico (UMA)

Enunciado: Crea un script en Python que intente conectarse (usando connect_ex) a los puertos del 20 al 25 de la IP 127.0.0.1 e imprima cuáles están abiertos.

import socket

ip = '127.0.0.1'
print(f"Escaneando puertos en {ip}...")

for puerto in range(20, 26):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(0.5)
    # connect_ex devuelve 0 si la conexión es exitosa
    resultado = sock.connect_ex((ip, puerto))
    if resultado == 0:
        print(f"Puerto {puerto}: ABIERTO")
    sock.close()

10. Petición HTTP GET Manual (USAL)

Enunciado: HTTP no es magia, es solo texto enviado por un socket TCP. Escribe un cliente TCP que se conecte a un servidor web en el puerto 80, envíe la cabecera GET / HTTP/1.1 y reciba el HTML.

import socket

host = 'example.com'
cliente = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cliente.connect((host, 80))

# Petición HTTP cruda (los saltos de línea \r\n son obligatorios)
peticion = f"GET / HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n"
cliente.send(peticion.encode())

respuesta = cliente.recv(4096)
print(respuesta.decode())
cliente.close()

10 Ejercicios Resueltos de Bash Scripting en Linux: Guía para Universidad

Bienvenidos de nuevo a larebelion.com. Si estás cursando Sistemas Operativos o Administración de Sistemas, sabrás que la interfaz gráfica es para cobardes. Un verdadero Ingeniero Informático se mueve por la terminal de Linux como pez en el agua.

Para ayudarte a superar tus exámenes prácticos, hemos recopilado 10 ejercicios esenciales de Bash Scripting de distintas universidades españolas. Desde condicionales básicos hasta automatización de copias de seguridad. ¡Abre tu terminal y empecemos!




1. Comprobación de Archivos (UPM)

Enunciado: Crea un script que reciba el nombre de un archivo por parámetro y compruebe si existe y si tiene permisos de lectura.

#!/bin/bash
ARCHIVO=$1

if [ -r "$ARCHIVO" ]; then
    echo "El archivo existe y se puede leer."
else
    echo "El archivo no existe o no hay permisos."
fi

2. Bucle For: Renombrado Masivo (UPC)

Enunciado: Escribe un script que busque todos los archivos con extensión .txt en el directorio actual y les añada la extensión .bak al final.

#!/bin/bash
for archivo in *.txt; do
    if [ -e "$archivo" ]; then
        mv "$archivo" "$archivo.bak"
        echo "Renombrado: $archivo a $archivo.bak"
    fi
done

3. Bucle While: Leer un Fichero Línea a Línea (UGR)

Enunciado: Lee el contenido del archivo /etc/passwd e imprime solo los nombres de los usuarios (la primera palabra antes de los dos puntos).

#!/bin/bash
while IFS=: read -r usuario resto; do
    echo "Usuario encontrado: $usuario"
done < /etc/passwd

4. Operaciones Aritméticas Básicas (UCM)

Enunciado: Crea un script que pida al usuario dos números por teclado y muestre la suma, resta y multiplicación de ambos.

#!/bin/bash
read -p "Introduce el primer número: " num1
read -p "Introduce el segundo número: " num2

suma=$((num1 + num2))
resta=$((num1 - num2))
multi=$((num1 * num2))

echo "Suma: $suma | Resta: $resta | Multiplicación: $multi"

5. Estructura Case: Menú Interactivo (UV)

Enunciado: Implementa un menú sencillo usando case que permita elegir entre ver la fecha actual, ver el espacio en disco o salir del script.

#!/bin/bash
echo "1. Ver Fecha 2. Espacio Disco 3. Salir"
read -p "Elige una opción: " opcion

case $opcion in
    1)
        date ;;
    2)
        df -h ;;
    3)
        echo "Saliendo..."; exit 0 ;;
    *)
        echo "Opción no válida." ;;
esac

6. Funciones en Bash: Factorial (UC3M)

Enunciado: Crea una función recursiva o iterativa en Bash que calcule el factorial de un número pasado como argumento.

#!/bin/bash
factorial() {
    n=$1
    if [ $n -le 1 ]; then
        echo 1
    else
        prev=$(factorial $((n - 1)))
        echo $((n * prev))
    fi
}

echo "Factorial de 5 es: $(factorial 5)"

7. Uso de AWK: Filtrar Procesos (US)

Enunciado: Ejecuta el comando ps aux y usa awk para imprimir solo el PID (columna 2) y el comando (columna 11) de los procesos que pertenecen al usuario 'root'.

#!/bin/bash
# Filtramos por root y usamos awk para formatear la salida
ps aux | awk '$1 == "root" {print "PID: " $2 " -> CMD: " $11}' | head -n 10

8. Automatización: Copia de Seguridad Simple (UAM)

Enunciado: Crea un script que comprima la carpeta /var/log en un archivo tar.gz. El nombre del archivo debe contener la fecha actual (ej. backup_2024-05-20.tar.gz).

#!/bin/bash
FECHA=$(date +%Y-%m-%d)
ARCHIVO="backup_log_$FECHA.tar.gz"

tar -czf /tmp/$ARCHIVO /var/log 2>/dev/null
echo "Backup guardado en /tmp/$ARCHIVO"

9. Alerta de Espacio en Disco (UNED)

Enunciado: Script que comprueba si la partición principal (/) supera el 85% de uso. Si es así, muestra una advertencia en la terminal.

#!/bin/bash
PORCENTAJE=$(df / | grep / | awk '{ print $5 }' | sed 's/%//g')

if [ "$PORCENTAJE" -gt 85 ]; then
    echo "¡PELIGRO! El disco está al $PORCENTAJE% de capacidad."
else
    echo "Disco en estado óptimo ($PORCENTAJE%)."
fi

10. Creación Masiva de Usuarios (UMA)

Enunciado: Escribe un script que lea un archivo llamado usuarios.txt (un nombre por línea) y cree automáticamente una cuenta en el sistema para cada uno usando useradd.

#!/bin/bash
ARCHIVO="usuarios.txt"

if [ ! -f "$ARCHIVO" ]; then
    echo "No se encuentra el archivo $ARCHIVO"
    exit 1
fi

while IFS= read -r user; do
    sudo useradd -m "$user"
    echo "Usuario $user creado exitosamente."
done < "$ARCHIVO"

10 Ejercicios de Python Resueltos: Ficheros, RegEx, Pandas y NumPy

¡Llegamos al final de nuestra megaguía en larebelion.com! Ya hemos superado las bases, las estructuras, la POO y la algoritmia. ¿Qué nos queda? Interactuar con el mundo real.

En este último bloque de 10 ejercicios (del 41 al 50) nos enfrentamos a problemas de exámenes de universidades españolas que exigen leer ficheros TXT, CSV y JSON, validar datos con Expresiones Regulares (RegEx) y utilizar las librerías estrella: Pandas y NumPy. ¡Vamos a por el 10!




41. Ficheros TXT: Contar Líneas y Palabras (UAH)

Enunciado: Escribe una función que abra un archivo de texto en modo lectura y devuelva una tupla con el número total de líneas y el número total de palabras.

def analizar_archivo(ruta):
    try:
        with open(ruta, 'r', encoding='utf-8') as f:
            lineas = f.readlines()
            num_lineas = len(lineas)
            num_palabras = sum(len(linea.split()) for linea in lineas)
            return (num_lineas, num_palabras)
    except FileNotFoundError:
        return "Archivo no encontrado"

42. Ficheros: Escribir sin Sobrescribir (UAL)

Enunciado: Crea una función que reciba una ruta y una cadena de texto, y añada ese texto al final del archivo existente sin borrar su contenido anterior.

def anadir_log(ruta, mensaje):
    # Usamos el modo 'a' (append) en lugar de 'w' (write)
    with open(ruta, 'a', encoding='utf-8') as f:
        f.write(mensaje + "\n")

43. Manejo de JSON: Guardar Diccionarios (URV)

Enunciado: Dado un diccionario de Python con datos de estudiantes, expórtalo a un archivo con formato JSON, asegurando que la indentación sea de 4 espacios.

import json

def guardar_json(datos, ruta_salida):
    with open(ruta_salida, 'w', encoding='utf-8') as f:
        json.dump(datos, f, indent=4, ensure_ascii=False)

44. CSV Nativo: Leer Columnas (UJI)

Enunciado: Usando solo la librería estándar csv, lee un archivo y devuelve una lista con todos los valores de la segunda columna.

import csv

def extraer_columna(ruta_csv):
    columna = []
    with open(ruta_csv, 'r', encoding='utf-8') as f:
        lector = csv.reader(f)
        for fila in lector:
            if len(fila) > 1:
                columna.append(fila[1])
    return columna

45. RegEx: Validador de DNI Español (UCA)

Enunciado: Escribe una función que utilice expresiones regulares para comprobar si un string tiene el formato válido de un DNI español (8 números seguidos de una letra mayúscula).

import re

def es_dni_valido(dni):
    # Patrón: Exactamente 8 dígitos (\d{8}) y 1 letra mayúscula ([A-Z])
    patron = r"^\d{8}[A-Z]$"
    return bool(re.match(patron, dni))

46. RegEx: Extractor de Correos Electrónicos (UNIOVI)

Enunciado: Dado un texto largo, extrae todas las direcciones de correo electrónico que aparezcan en él usando re.findall.

import re

def extraer_emails(texto):
    patron = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
    return re.findall(patron, texto)

47. NumPy: Arrays 1D a 2D (UPNA)

Enunciado: Utiliza NumPy para crear un array de 12 elementos (del 1 al 12) y luego cambia su forma (reshape) para convertirlo en una matriz de 3x4.

import numpy as np

def crear_matriz_numpy():
    # np.arange(1, 13) crea array del 1 al 12
    array_1d = np.arange(1, 13)
    matriz_2d = array_1d.reshape((3, 4))
    return matriz_2d

48. Pandas: Leer y Calcular Media (UPO)

Enunciado: Escribe un código usando Pandas que lea un archivo "alumnos.csv" y calcule la media aritmética de la columna llamada 'Nota_Final'.

import pandas as pd

def calcular_media_csv(ruta):
    df = pd.read_csv(ruta)
    if 'Nota_Final' in df.columns:
        return df['Nota_Final'].mean()
    return None

49. Pandas: Filtrado de DataFrames (UCLM)

Enunciado: Dado un DataFrame de Pandas con información de empleados, filtra y devuelve solo aquellos que pertenezcan al departamento de 'IT' y cobren más de 2000€.

import pandas as pd

def filtrar_empleados(df):
    # Uso de condiciones booleanas múltiples con &
    filtro = df[(df['Departamento'] == 'IT') & (df['Salario'] > 2000)]
    return filtro

50. El Ejercicio Final: Manejo de Excepciones Múltiples (UVA)

Enunciado: Crea una función que intente convertir un input de texto a número entero y luego dividir 100 entre ese número. Atrapa específicamente los errores ValueError y ZeroDivisionError.

def division_segura(entrada):
    try:
        numero = int(entrada)
        resultado = 100 / numero
        return resultado
    except ValueError:
        return "Error: Debes introducir un número válido."
    except ZeroDivisionError:
        return "Error: No se puede dividir entre cero."