Browse Source

Cosas de CCOM4702

pablo.loyola 4 years ago
parent
commit
68cc425003
3 changed files with 77 additions and 0 deletions
  1. BIN
      CCOM4702/Lab06/elsapo32
  2. 50
    0
      CCOM4702/Lab06/informe_Lab06.txt
  3. 27
    0
      CCOM4702/Lab06/sapo_keygen.py

BIN
CCOM4702/Lab06/elsapo32 View File


+ 50
- 0
CCOM4702/Lab06/informe_Lab06.txt View File

1
+Pablo J. Loyola  	  _
2
+801-16-4160      	 ^-)
3
+CCOM4702-0U1     	  (.._    
4
+Dr.Rafael Arce   	   \`\\
5
+                 	     |>
6
+                 	    /|      flamingo
7
+                 	    `             
8
+
9
+Informe: elsapo32
10
+
11
+Abriendo el binario con ghidra y examinando sus funciones, se pudo determinar que la 
12
+funcion donde ocurre la acción es en la función "FUN_0804854d". 
13
+
14
+El programa pide un username como input y despues pide un password que es generado por 
15
+el mismo programa a base del username dado. La función "FUN_0804854d" usa fgets() como 
16
+su forma de tomar input del usuario. fgets(), a diferencia de scanf, le añade un '\n' 
17
+al final del string junto con el null-terminator. Por esta razón, al pedir input con 
18
+fgets(), se debe poner un input size que sea +2 caracteres de lo que se pide. 
19
+
20
+En el caso de elsapo32, este pide un input de tamaño 9, de tal manera que el username debe
21
+ser de 7 caracteres, si no nos da "access denied" (pero el password tiene que ser de 9 
22
+caracteres cuando el fgets() también es de 9 caracteres, más sobre eso después). Luego de 
23
+entrar el username, se verifica que no contenga espacios. 
24
+
25
+Las instrucciones que nos crean el password (interpretación de ghidra):
26
+
27
+  bVar1 = username._1_1_ / '\x03'; // esta instrucción asigna "username[1]/3" a una variable
28
+  local_3c = 0;
29
+  while (local_3c < 9) {
30
+    bVar1 = (*(byte *)((int)&username + local_3c) ^ bVar1) & 0x3c;
31
+    *(char *)((int)&local_1d + local_3c) = bVar1 + 0x30;
32
+    bVar1 = bVar1 * '\x03'; // el \x03 se comporta como un numero entero 3
33
+    local_3c = local_3c + 1;
34
+  }
35
+
36
+La división y multiplicación entre 3 lo determiné corriendo el binario en gdb, primero se 
37
+toma el segundo caracter, se divide por 3 y se asigna a una variable (bVar1). Luego, se 
38
+entra a un while loop que corre las siguiente instruccion con cada caracter (i = 0): 
39
+
40
+	bVar1 = (username[i] ^ bVar1) & 0x3c;
41
+	password[i] = bVar1 + 0x30;
42
+	bVar1 *= 3;
43
+
44
+Despues toma como input el password, pero tambien se tiene que incluir el '\n' y el null-terminator 
45
+passado por el while loop anterior. De esta manera fgets() toma el password de 9 characteres con el 
46
+buffer de 9 caracteres también(?). Luego es solo simular el while loop anterior con python y se 
47
+puede sacar el password para cada username.
48
+
49
+////////////////////////////////////////////////////////////////////////
50
+

+ 27
- 0
CCOM4702/Lab06/sapo_keygen.py View File

1
+def gen_pwd(usr):
2
+    generated = ""
3
+    foo = ord(usr[1]) // 3
4
+    for i in range(len(usr)):
5
+        foo = (ord(usr[i]) ^ foo) & 0x3c
6
+        generated += (chr(foo + 0x30))
7
+        foo *= 3
8
+    return generated
9
+
10
+#program header *1337*
11
+print("""             _
12
+            ^-)
13
+             (.._    
14
+              \`\\\\
15
+                |>
16
+               /|      flamingo
17
+               `""")
18
+print("--------------------------------------------------")
19
+print()
20
+
21
+usr = input("Input a 7-character username: ")
22
+
23
+while(len(usr) != 7):
24
+    usr = input("PLEASE input a 7-character username: ")
25
+
26
+usr = usr + '\n' + chr(0)
27
+print("Generated Password:", gen_pwd(usr))