Integer
el medidor que miente
- Qué rebosa
- el número que mide
- Qué hay al lado
- —
- Consecuencia
- detona otro overflow
Escanea o abre en tu móvil
testbo.tech-thebridge.com/mando
y entra con el código
····
Esperando a que el profesor abra la clase…
0 conectados
gotas en el vaso
Cada gota = 1 punto para ti.
La que desborde = +50.
$ ./vaso --fill
*** buffer overflow detected ***
El vaso ha desbordado. La gota que colmó el vaso cayó fuera del buffer.
segmentación — núcleo volcado (core dumped) EIP: 0x41414141 el agua cayó donde no debía
La gota fatal fue de +50
Culpamos a la gota. Pero la gota era idéntica a todas las anteriores.
En 3 horas pasaréis de hacer charcos a construir acueductos.
La misma página, la misma letra
Instrucciones y datos conviven en el mismo sitio. La CPU decide cuál es cuál.
SSD / HDD
el programa vive aquí apagado; se carga en RAM para ejecutarse
Instrucciones y datos, la misma memoria y la misma pinta. El byte 0x41 es 'A' o parte de unainstrucción según cómo lo lea la CPU.
1 byte = 8 bits = 2 dígitos hex
Pronto escribiréis esto…
↓
…y serán vuestras propias A's pisando la nota de retorno.
Quien controle EIP, controla la máquina.
1mov eax, 5 // copia 5 al bolsillo EAX
2add eax, 3 // súmale 3 → EAX = 8
call la escribe · ret la lee
1nombre = input() // 5 o 50.000: el lenguaje lo gestiona
Crece solo. Nunca piensas en el borde.
1char nombre[16]; // 16 bytes, fijos
2gets(nombre); // si meten 50, se derrama. Silencio.
Tú decides el tamaño. Nadie vigila el borde.
El overflow es imposible en Python no por listo:alguien ya escribió el “¿y si se pasa?”. En C ese chequeo no existe salvo que lo escribas tú.
el medidor que miente
el vaso en la mesa
el vaso en la despensa
Quién no mira el borde en cada caso:unsigned char · gets · strcpy.
1#include <stdint.h>
2uint8_t dudas = 10; // un byte
3
4void nueva_pregunta() { // cada pulsación
5 dudas = dudas + 1; // solo SUBE
6 if (dudas == 5) { // ¿cómo llega a 5?
7 premio_100(); // +100 puntos
8 }
9}
se lleva +100
0x414141410x41414141 · no hay código → SEGFAULTEsto es el charco: agua sin control, el programa muere. Ahora dirigiremos esos bytes.
1void atender_cliente(int sock) {
2 char nombre[32]; // el vaso: 32 bytes
3 recv(sock, nombre, 1000, 0); // acepta hasta 1000
4 printf("Hola, %s\n", nombre);
5}
lo encontró +100
1int es_admin = 0; // el vaso vecino
2char password[16]; // el vaso que desborda
3gets(password); // sin límite
4if (es_admin) dar_acceso_total(); // ¿cómo llega a != 0?
16 caracteres + 1 byte ≠ 0. Ese byte cae en es_admin, el if se cumple → adminsin tocar la contraseña.
No rompes: diriges.
1void login() {
2 int es_admin = 0; // el vaso vecino
3 char password[16]; // el vaso que desborda
4 gets(password); // sin límite
5 if (es_admin) dar_acceso_total();
6}
entró como admin +100
Aún nadie ha entrado como admin…
la nota ahora apunta a dar_flag()
buf[16] · "AAAA…"0x08049172 →\x72\x91\x04\x08El patrón cíclico (Aa0Aa1Aa2…) te da el offset exacto sin contar.
Ya no cambias lo que el programa sabe. Secuestras lo que hace.
1void dar_flag() { // existe… pero NADIE la llama
2 printf("FLAG{%s}\n", flag);
3}
4void atender_cliente(int sock) {
5 char nombre[40]; // el vaso: 40 bytes
6 recv(sock, nombre, 1000, 0);
7}
El servicio nunca llama a dar_flag.Hacedla ejecutar.
Aún nadie ha saltado a dar_flag…
saltó a dar_flag +200
909090909090909090909090⟶execve("/bin/sh")NOP (0x90) no hace nada, solo pasa al siguiente. Si EIP cae en cualquier punto de la rampa, se desliza hasta el shellcode.Simulación escénica: la shell se dramatiza, disparada desde el móvil. La explotación real queda fuera de esta web.
1void atender_cliente(int sock) {
2 char nombre[128]; // cabe un sled + shellcode
3 recv(sock, nombre, 1000, 0); // sin dar_flag: nada jugoso
4}
tu input empieza cerca de 0xffffd520 (±, no exacto)
abrió la primera shell +150
Aún nadie ha traído su código…
mata el desbordamiento
gota de tinta en el borde, justo antes de la nota
bypass filtrar el canario
mata el shellcode
el agua derramada no se puede beber
bypass ret2libc / ROP
mata el ret2win
barajar dónde está cada vaso al poner la mesa
bypass un leak y recalcular
Empezamos con una frase de cocina y hemos acabado abriendo una shell.
El hilo fue siempre el borde que nadie miró. Ahora vosotros sois de los que lo miran.
Empezamos con una frase de cocina y hemos acabado abriendo una shell. Ahora vosotros sois de los que miran el borde.
Introduce el token para conducir la clase. Las flechas del teclado pasan las diapositivas y sincronizan los móviles.
No hay sala activa. Crea una desde el panel del profesor para sincronizar los móviles. Puedes navegar igualmente con ← →.