Estoy intentando explotar un archivo binario que tengo acceso al código fuente.
int flag = 0;
int main() {
char buf[0x50];
puts("Who are you? ");
printf("> ");
fgets(buf, 0x50, stdin);
printf(buf);
if (flag == 1337) {
puts("Enjoy your shell!");
system("/bin/sh");}
else {
puts("Not allowed");
}
return 0;
}
Como se puede ver en el código fuente, si el indicador es 1377 obtendré un shell. Puedo ver eso con gdb también.
0x4007ec <main+175> mov eax, DWORD PTR [rip+0x200892] # 0x601084 <flag>
0x4007f2 <main+181> cmp eax, 0x539
Las medidas de seguridad se configuran de esta manera:
Canary : Yes
NX : Yes
PIE : No
Fortify : No
RelRO : Partial
Entonces, en primer lugar no puedo hacer el desbordamiento del búfer clásico porque el programa utiliza fgets
para recopilar información. Por supuesto, canary también está allí, pero no hará ningún daño porque si pudiera cambiar el valor de la bandera (antes de que se hiciera el cheque de Canary) tendría éxito en obtener esa cáscara. No sé si lo que pienso es correcto, corríjame si me equivoco.
Mi primera conclusión sobre esto fue que, no podría explotar buf
para reescribir el valor de flag. (Supuse que buf
y flag
se colocarían uno al lado del otro en la pila). Creo que tengo razón en esto porque cuando miré el registro $rsp
y encontré que solo la cantidad permitida de "A" se colocó en la pila. Entonces, incluso si la bandera se colocara justo debajo de ella, el valor de la bandera no se sobrescribiría. ¿Tengo razón hasta ahora? Esa sería mi primera pregunta
0x7fffffffdaf0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb00: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb10: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb20: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb30: 0x41414141 0x41414141 0x41414141 0x00414141
0x7fffffffdb40: 0x00400840 0x00000000 0x96703f00 0x948afed7
0x7fffffffdb50: 0xffffdc40 0x00007fff 0x00000000 0x00000000
Entonces, ¿cómo podré variar ese valor? Creo que la vulnerabilidad debe provenir de la carga útil proporcionada por un usuario malintencionado, pero buf
es la única forma de obtener esa carga útil en la pila. Ya que no puedo sobrescribir los registros desbordando buf
estoy un poco perdido.