🗂️ INDEX

글 작성자: Universe7202

 

 

 

 

CTF 문제를 풀때 ELF 파일을 GDB로 분석할 때가 있는데,

어떤 사용자 정의 함수들이 있는지 알기 위해서 objdump 명령어를 사용하는 경우가 있다.

 

objdump 명령어를 이용하면 간략하게 볼 수 없기 때문에 이를 간략하게 보기위해 c로 만들어 보았다.

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

char *str_replace(char *orig, char *rep, char *with) {
    char *result; // the return string
    char *ins;    // the next insert point
    char *tmp;    // varies
    int len_rep;  // length of rep (the string to remove)
    int len_with; // length of with (the string to replace rep with)
    int len_front; // distance between rep and end of last rep
    int count;    // number of replacements

    // sanity checks and initialization
    if (!orig || !rep)
        return NULL;
    len_rep = strlen(rep);
    if (len_rep == 0)
        return NULL; // empty rep causes infinite loop during count
    if (!with)
        with = "";
    len_with = strlen(with);

    // count the number of replacements needed
    ins = orig;
    for (count = 0; tmp = strstr(ins, rep); ++count) {
        ins = tmp + len_rep;
    }

    tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1);

    if (!result)
        return NULL;

    // first time through the loop, all the variable are set correctly
    // from here on,
    //    tmp points to the end of the result string
    //    ins points to the next occurrence of rep in orig
    //    orig points to the remainder of orig after "end of rep"
    while (count--) {
        ins = strstr(orig, rep);
        len_front = ins - orig;
        tmp = strncpy(tmp, orig, len_front) + len_front;
        tmp = strcpy(tmp, with) + len_with;
        orig += len_front + len_rep; // move to next "end of rep"
    }
    strcpy(tmp, orig);
    return result;
}

int main(int argc, char *argv[]){
    char exec[100];
    char *filter;
    
    if(argc == 1){
        printf("Give your ELF file name.\n");
    }
    else if(argc > 3){
        printf("So many argvs.\n");
    }
    else{
        filter = str_replace(argv[1], "{", "");
        filter = str_replace(filter, "}", "");
        filter = str_replace(filter, "(", "");
        filter = str_replace(filter, ")", "");
        filter = str_replace(filter, "<", "");
        filter = str_replace(filter, ">", "");
        filter = str_replace(filter, "&", "");
        filter = str_replace(filter, "*", "");
        filter = str_replace(filter, "`", "");
        filter = str_replace(filter, "|", "");
        filter = str_replace(filter, "=", "");
        filter = str_replace(filter, "?", "");
        filter = str_replace(filter, ";", "");
        filter = str_replace(filter, "[", "");
        filter = str_replace(filter, "]", "");
        filter = str_replace(filter, "$", "");
        filter = str_replace(filter, "-", "");
        filter = str_replace(filter, "#", "");
        filter = str_replace(filter, "~", "");
        filter = str_replace(filter, "!", "");
        filter = str_replace(filter, ".", "");
        filter = str_replace(filter, "‘", "");
        filter = str_replace(filter, "”", "");
        filter = str_replace(filter, "%", "");
        filter = str_replace(filter, "/", "");
        filter = str_replace(filter, "\\", "");
        filter = str_replace(filter, ":", "");
        filter = str_replace(filter, "+", "");
        filter = str_replace(filter, ",", "");
        
        snprintf(exec, 100,"nm -P %s | awk '$2 == \"T\" {print $1}'", filter);
        system(exec);
        
    }
}

 

위 c코드를 컴파일 한 뒤 실행 권한을 주고, /bin 디렉토리에 넣고 사용하면 된다.

 

사용방법은 간단하다.

아래 처럼 현재 디렉토리에서 ELF 파일 이름을 인자로 던져주면 끝이다.

ubuntu:~/ $ ls
bof  

ubuntu:~/ $ file bof
bof: ELF 32-bit LSB shared object...

ubuntu:~/ $ func bof
b func
b main

 

func은 위 c코드를 컴파일 했을때의 파일 이름이다.

bof 파일을 보았을때 func, main 함수가 있는 것을 볼 수 있다.