Advertisement
fernandop

crk03-geyslan

May 6th, 2013
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. O cabeçalho do ELF está todo zuado, apontando pra um cabeçalho de seção lá na
  2. pqp, que não existe e isso faz os programas que lêem ELF se lascarem:
  3.  
  4. $ chmod +x crackme.03.32; ./!$
  5. chmod +x crackme.03.32; ./crackme.03.32
  6. Try to find the string of success and make me print it.
  7.  
  8. $ readelf -h crackme.03.32
  9. readelf: Error: Unable to read in 0x140c bytes of section headers
  10. ELF Header:
  11.   Magic:   7f 45 4c 46 01 00 00 00 00 00 00 00 00 00 01 00
  12.   Class:                             ELF32
  13.   Data:                              none
  14.   Version:                           0
  15.   OS/ABI:                            UNIX - System V
  16.   ABI Version:                       0
  17.   Type:                              EXEC (Executable file)
  18.   Machine:                           Intel 80386
  19.   Version:                           0x10020
  20.   Entry point address:               0x10020
  21.   Start of program headers:          4 (bytes into file)
  22.   Start of section headers:          3224447667 (bytes into file)
  23.   Flags:                             0x12eb40
  24.   Size of this header:               52 (bytes)
  25.   Size of program headers:           32 (bytes)
  26.   Number of program headers:         1
  27.   Size of section headers:           5132 (bytes)
  28.   Number of section headers:         31888
  29.   Section header string table index: 44439 <corrupt: out of range>
  30. readelf: Error: Unable to read in 0x9c116c0 bytes of section headers
  31.  
  32. $ gdb -q ./crackme.03.32
  33. "/home/fernando/downloads/crackme.03.32": not in executable format: File format
  34. not recognized
  35. (gdb)
  36.  
  37. $ objdump -dM intel ./crackme.03.32
  38. objdump: ./crackme.03.32: File format not recognized
  39.  
  40. Eu optei por disassemblar sem interpretar, com o udcli. O readelf já deu a dica
  41. que o ELF header tem 52 bytes, então o código começa em 0x34:
  42.  
  43. $ udcli crackme.03.32
  44. 0000000000000000 7f45             jg 0x47                
  45. 0000000000000002 4c               dec esp                
  46. 0000000000000003 46               inc esi                
  47. 0000000000000004 0100             add [eax], eax          
  48. 0000000000000006 0000             add [eax], al          
  49. 0000000000000008 0000             add [eax], al          
  50. 000000000000000a 0000             add [eax], al          
  51. 000000000000000c 0000             add [eax], al          
  52. 000000000000000e 0100             add [eax], eax          
  53. 0000000000000010 0200             add al, [eax]          
  54. 0000000000000012 0300             add eax, [eax]          
  55. 0000000000000014 2000             and [eax], al          
  56. 0000000000000016 0100             add [eax], eax          
  57. 0000000000000018 2000             and [eax], al          
  58. 000000000000001a 0100             add [eax], eax          
  59. 000000000000001c 0400             add al, 0x0            
  60. 000000000000001e 0000             add [eax], al          
  61. 0000000000000020 b32a             mov bl, 0x2a            
  62. 0000000000000022 31c0             xor eax, eax            
  63. 0000000000000024 40               inc eax                
  64. 0000000000000025 eb12             jmp 0x39                
  65. 0000000000000027 003400           add [eax+eax], dh      
  66. 000000000000002a 2000             and [eax], al          
  67. 000000000000002c 0100             add [eax], eax          
  68. 000000000000002e 0c14             or al, 0x14            
  69. 0000000000000030 90               nop                    
  70. 0000000000000031 7c97             jl 0xffffffffffffffca  
  71. 0000000000000033 ad               lodsd                  
  72. 0000000000000034 b6b6             mov dh, 0xb6            
  73. 0000000000000036 c6c0bf           mov al, 0xbf            
  74. 0000000000000039 29c9             sub ecx, ecx            
  75. 000000000000003b b900000100       mov ecx, 0x10000        
  76. 0000000000000040 31d2             xor edx, edx            
  77. 0000000000000042 31db             xor ebx, ebx            
  78. 0000000000000044 8a19             mov bl, [ecx]          
  79. 0000000000000046 01da             add edx, ebx            
  80. 0000000000000048 41               inc ecx                
  81. 0000000000000049 81f92e000100     cmp ecx, 0x1002e        
  82. 000000000000004f 75f3             jnz 0x44                
  83. 0000000000000051 c1e202           shl edx, 0x2            
  84. 0000000000000054 663b152e000100   cmp dx, [0x1002e]      
  85. 000000000000005b 7529             jnz 0x86                
  86. 000000000000005d 31ed             xor ebp, ebp            
  87. 000000000000005f 89d7             mov edi, edx            
  88. 0000000000000061 45               inc ebp                
  89. 0000000000000062 b810800000       mov eax, 0x8010        
  90. 0000000000000067 45               inc ebp                
  91. 0000000000000068 f7e5             mul ebp                
  92. 000000000000006a 96               xchg esi, eax          
  93. 000000000000006b 89f0             mov eax, esi            
  94. 000000000000006d 662b0514000100   sub ax, [0x10014]      
  95. 0000000000000074 7510             jnz 0x86                
  96. 0000000000000076 29fe             sub esi, edi            
  97. 0000000000000078 6681f614ec       xor si, 0xec14          
  98. 000000000000007d 7507             jnz 0x86                
  99. 000000000000007f eb01             jmp 0x82                
  100. 0000000000000081 d431             aam 0x31                
  101. 0000000000000083 c0755e29         shl byte [ebp+0x5e], 0x29
  102. 0000000000000087 d2743854         shl [eax+edi+0x54], cl  
  103. 000000000000008b 7279             jb 0x106                
  104. 000000000000008d 20746f20         and [edi+ebp*2+0x20], dh
  105. 0000000000000091 66696e642074     imul bp, [esi+0x64], 0x7420
  106. 0000000000000097 6865207374       push dword 0x74732065  
  107. 000000000000009c 7269             jb 0x107                
  108. 000000000000009e 6e               outsb                  
  109. 000000000000009f 67206f66         and [bx+0x66], ch      
  110. 00000000000000a3 207375           and [ebx+0x75], dh      
  111. 00000000000000a6 636365           arpl [ebx+0x65], sp    
  112. 00000000000000a9 7373             jae 0x11e              
  113. 00000000000000ab 20616e           and [ecx+0x6e], ah      
  114. 00000000000000ae 64206d61         and [fs:ebp+0x61], ch  
  115. 00000000000000b2 6b65206d         imul esp, [ebp+0x20], 0x6d
  116. 00000000000000b6 65207072         and [gs:eax+0x72], dh  
  117. 00000000000000ba 696e742069742e   imul ebp, [esi+0x74], 0x2e746920
  118. 00000000000000c1 0ab804000000     or bh, [eax+0x4]        
  119. 00000000000000c7 bb01000000       mov ebx, 0x1            
  120. 00000000000000cc b98a000100       mov ecx, 0x1008a        
  121. 00000000000000d1 ba38000000       mov edx, 0x38          
  122. 00000000000000d6 cd80             int 0x80                
  123. 00000000000000d8 b801000000       mov eax, 0x1            
  124. 00000000000000dd bb00000000       mov ebx, 0x0            
  125. 00000000000000e2 cd80             int 0x80                
  126. 00000000000000e4 31d2             xor edx, edx            
  127. 00000000000000e6 6839000100       push dword 0x10039      
  128. 00000000000000eb 66832c240b       sub word [esp], 0xb    
  129. 00000000000000f0 5e               pop esi                
  130. 00000000000000f1 8d7601           lea esi, [esi+0x1]      
  131. 00000000000000f4 29c9             sub ecx, ecx            
  132. 00000000000000f6 75ec             jnz 0xe4                
  133. 00000000000000f8 46               inc esi                
  134. 00000000000000f9 eb01             jmp 0xfc                
  135. 00000000000000fb c3               ret                    
  136. 00000000000000fc 8a16             mov dl, [esi]          
  137. 00000000000000fe 88140c           mov [esp+ecx], dl      
  138. 0000000000000101 41               inc ecx                
  139. 0000000000000102 83f909           cmp ecx, 0x9            
  140. 0000000000000105 75f1             jnz 0xf8                
  141. 0000000000000107 29d2             sub edx, edx            
  142. 0000000000000109 31c9             xor ecx, ecx            
  143. 000000000000010b 41               inc ecx                
  144. 000000000000010c 8a140c           mov dl, [esp+ecx]      
  145. 000000000000010f 80ea09           sub dl, 0x9            
  146. 0000000000000112 80f2ac           xor dl, 0xac            
  147. 0000000000000115 eb02             jmp 0x119              
  148. 0000000000000117 e84132540c       call 0xc54335d          
  149. 000000000000011c ff88140c83f9     dec dword [eax+0xf9830c14]
  150. 0000000000000122 0875e6           or [ebp-0x1a], dh      
  151. 0000000000000125 41               inc ecx                
  152. 0000000000000126 c6040c0a         mov byte [esp+ecx], 0xa
  153. 000000000000012a 49               dec ecx                
  154. 000000000000012b 87d1             xchg ecx, edx          
  155. 000000000000012d 42               inc edx                
  156. 000000000000012e 44               inc esp                
  157. 000000000000012f eb01             jmp 0x132              
  158. 0000000000000131 e8b8040000       call 0x5ee              
  159. 0000000000000136 00bb01000000     add [ebx+0x1], bh      
  160. 000000000000013c 89e1             mov ecx, esp            
  161. 000000000000013e 60               pushad                  
  162. 000000000000013f 31c9             xor ecx, ecx            
  163. 0000000000000141 51               push ecx                
  164. 0000000000000142 b900000100       mov ecx, 0x10000        
  165. 0000000000000147 5a               pop edx                
  166. 0000000000000148 89d3             mov ebx, edx            
  167. 000000000000014a 8a19             mov bl, [ecx]          
  168. 000000000000014c 01da             add edx, ebx            
  169. 000000000000014e 41               inc ecx                
  170. 000000000000014f 81f972010100     cmp ecx, 0x10172        
  171. 0000000000000155 75f3             jnz 0x14a              
  172. 0000000000000157 eb01             jmp 0x15a              
  173. 0000000000000159 cd66             int 0x66                
  174. 000000000000015b 3b1572010100     cmp edx, [0x10172]      
  175. 0000000000000161 0f851fffffff     jnz dword 0x86          
  176. 0000000000000167 61               popad                  
  177. 0000000000000168 eb01             jmp 0x16b              
  178. 000000000000016a c9               leave                  
  179. 000000000000016b cd80             int 0x80                
  180. 000000000000016d e966ffffff       jmp 0xd8                
  181. 0000000000000172 6d               insd                    
  182. 0000000000000173 7f               invalid
  183.  
  184. Ao final do primeiro loop ocorre um salto para 0x86, mas a obfuscação do
  185. disassembly não deixa a gente ler o que tem neste endereço em si:
  186.  
  187. 0000000000000083 c0755e29         shl byte [ebp+0x5e], 0x29
  188. 0000000000000087 d2743854         shl [eax+edi+0x54], cl
  189.  
  190. Se NOParmos os bytes 0x84, 0x84 e 0x85 aí sim o disassembler é capaz de mostrar
  191. a instrução que começa em 0x86 (usei o hte pra isso):
  192.  
  193. 00000084 90                             nop
  194. 00000085 90                             nop
  195. 00000086 29d2                           sub         edx, edx
  196. 00000088 7438                           jz          0xc2
  197.  
  198. Depois vem um salto pra 0xc2, que vai sempre ocorrer porque o sub setou a flag
  199. zero. Em 0xc2, mais obfuscação. NOPando 0xc1:
  200.  
  201. 000000c2 b804000000                     mov         eax, 0x4  
  202. 000000c7 bb01000000                     mov         ebx, 0x1
  203. 000000cc b98a000100                     mov         ecx, 0001008a
  204. 000000d1 ba38000000                     mov         edx, 0x38
  205. 000000d6 cd80                           int         0x80
  206. 000000d8 b801000000                     mov         eax, 0x1
  207. 000000dd bb00000000                     mov         ebx, 0x0
  208. 000000e2 cd80                           int         0x80
  209.  
  210. Fica visível a sys_write aí de 56 caracteres, que é a string que o programa
  211. imprime normalmente. E uma sys_exit na sequência. Como eu não queria que ele
  212. imprimisse a string inicial e nem saísse, em 0xd6 fiz um salto pra depois da sys_exit:
  213.  
  214. 000000d6 eb0c                           jmp         0xe4    
  215. 000000d8 b801000000                     mov         eax, 0x1
  216. 000000dd bb00000000                     mov         ebx, 0x0  
  217. 000000e2 cd80                           int         0x80
  218. 000000e4 31d2                           xor         edx, edx
  219.  
  220. E agora:
  221.  
  222. $ ./crackme.03.32
  223. Segmentation fault
  224.  
  225. Hehe. Seguindo o fluxo do programa, vemos no final:
  226.  
  227. 0000013e 60                             pushad                    
  228. 0000013f 31c9                           xor         ecx, ecx        
  229. 00000141 51                             push        ecx    
  230. 00000142 b900000100                     mov         ecx, 00010000    
  231. 00000147 5a                             pop         edx  
  232. 00000148 89d3                           mov         ebx, edx    
  233. 0000014a 8a19                           mov         bl, [ecx]
  234. 0000014c 01da                           add         edx, ebx          
  235. 0000014e 41                             inc         ecx      
  236. 0000014f 81f972010100                   cmp         ecx, 00010172          
  237. 00000155 75f3                           jnz         0x14a  
  238. 00000157 eb01                           jmp         0x15a        
  239. 00000159 cd66                           int         0x66      
  240. 0000015b 3b1572010100                   cmp         edx, [00010172]
  241. 00000161 0f851fffffff                   jnz         0x86      
  242. 00000167 61                             popad                              
  243. 00000168 eb01                           jmp         0x16b
  244. 0000016a c9                             leave
  245. 0000016b cd80                           int         0x80
  246. 0000016d e966ffffff                     jmp         0xd8
  247. 00000172 6d                             insd
  248. 00000173 7f                             db          0x7f                      
  249.  
  250. O pushad salva os valores de todos os registradores na pilha e deve ser seguido
  251. de um popad (pelo menos espera-se que). Depois dele tem o algoritmo que vai
  252. gerar dinamicamente uma outra string e em 0x16b vamos uma int 0x80, que vai
  253. resultar em alguma sys_call. O segfault acontece quando o loop acaba, em 0x155.
  254. Se desobfuscarmos 0x15a, veremos que há uma comparação de dx com o que está em
  255. 0x10172, que é inválido e por isso o segfault. O esquema é pular logo pro
  256. popad, assim os valores empilhados voltarão para os registradores e a
  257. configuração da sys_write será preparada para a int 0x80. Então eu aproveitei o
  258. jmp 0x15a em 0x157 pra pular pro popad:
  259.  
  260. 00000157 eb0e                           jmp         0x167        
  261. 00000159 cd66                           int         0x66      
  262. 0000015b 3b1572010100                   cmp         edx, [00010172]
  263. 00000161 0f851fffffff                   jnz         0x86      
  264. 00000167 61                             popad
  265.  
  266. E tá lá...
  267.  
  268. $ ./crackme.03.32
  269. Omedetou
  270.  
  271. Foram 3 bytes alterados no total:
  272.  
  273. 0xd6  cd -> eb
  274. 0xd7  80 -> 0c
  275. 0x158 01 -> 0e
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement