본문 바로가기

리버싱/리버싱기초

취약점 리버싱 요약 노트

1. 리눅스로 파일을 받으면?


1) file 명령어를 통해 파일 정보를 확인한다.

 - 시그니처를 파싱해서 보여줌. (파일정보, 아키텍처 정보등등)


2) strings 명령어를 통해 파일의 정보를 확인한다. 

 - 라이브러리 함수 같은 정보들도 알 수 있음


2. 대부분의 함수는 libc라이브러리 안에 포함되어있다.

 - 카피 strcpy, strncpy, memcpy

 - 비교 strcmp, strncmp, memcmp

 - 길이 strlen

 - 메모리 : malloc, free

 - 기타 : sleep..


3. IDA에서는 배열, 포인터, 심볼, 라이브러리에 대한 정보는 내가 바꿔줘야 한다.


4. IDA에서 FLIRT를 사용하라. 특정 함수에 대해 알아서 시그니처를 만들어준다 (MS, libc)


5. C++과 별차이는 없다. virtual 함수만 다른 곳에 정의를 한다.

   new와 delete는 결국 함수 내부를 보면 malloc와 free를 호출한다.


6, 쉘코드란? 

  bin/sh

  백도어 역할을 한다. bind방식과 reverse 방식

  보통은 간단한 쉘코드를 전송한 뒤 메모리를 크게 할당하여 2차쉘코드를 다운받는다.


7. x86의 시스템 콜은? int 0x80 또는 sysente(지원할 경우)

   리눅스의 경우 eax, ebx, ecx, esi, edi, ebp에 저장한 후 스택에 쌓인다.

   리턴값은 eax로


   64bit는? syscall 로 호출

   리눅스의 경우 rdi, rsi, rdx, r10, r8, r9를 인자로 먼저 넘긴다.

   리턴값은 rax


8. execl, execle, execlp, execv, execve, execvp 차이는?

   lv : 커맨드를 list 또는 vector로 

   e : 환경변수도 포함

   p : PATH 변수를 사용  

   #include <unistd.h>

   int execve(const char *filename, char *const argv[], char *const envp[]);


9. 다음을 컴파일 하면 쉘코드를 만들어낼 수 있다.


   #include <unistd.h>

   int main(void){

      char* argv[] = { "/bin/sh", NULL };

      execve("/bin/sh", argv, NULL);

      // int execve(const char *filename, char *const argv[], char *const envp[]);

   }


10. GDB 명령어

   아키텍처 설정 set disassembly-flavor intel

 

   기본 : run (r), continue (c), quit (q)

   인자는 run args

   파일 또는 스탠다드 입출력 

         run args < input

         run args < input > output

   실행중인 프로세스 (파이썬으로 실행하고 attach로 잡자)

         attach pid

   현재 프로세스 정보

         info proc

   현재 프로세스 메모리

         info proc map

   브레이크

         b function_name / b *address

   함수 내부로

         step (s)

   함수 건너서 

         next (n)

   프로세스 한개 : si, ni

   지금까지 호출한 것 확인 : bt 백트레이스

   스택프레임 위 아래 up, down   

   메모리 정보 : x/200x 0x1014024

   포인터에 저장된 메모리 값 : p/x 변수명

   다음에 실행할 위치 정보 : x/ni $pc

   매번 실행할 때마다 보여주기 display/i $pc

   모든 레지스터 i r

   

  11. pwndbg

   개짱이다. 다운받고 쓰자. 이거는 할떄마다 메모리 정보 레지스터 정보 다보여준다. 그냥 짱

   https://github.com/pwndbg/pwndbg


  12 취약점은 5가지로 분류할 수 있다

      1) Memory corruption

         메모리 할당후 그 이상 사용(보통 인자로 크기를 넘겨줄 때 다른 크기 변수를 사용하던가 계산함)

         char *img = malloc(width * height);

          for (i = 0; i < height; ++i)

             memcpy(&img[i*width], &src[i*width], width);

       

          delete obj;

          obj->do_stuff(); 재사용

      

      2) Logic erros (허용되지 않는 입력값으로 로직을 변경)

         문자열 비교를 잘못하여 허용되지 않은 사이트도 접근해줌

          whitelist = [“home.php”, “upload.php”, “download.php”]

          for page in whitelist:

              if strncmp(page, target, strlen(page)) == 0:

                  return OK

          Retrun ERROR

          이유 target의 값이 이러면? /home.php/.../.../... 하위 페이지 접속 가능

         

      3) Information Leakage (얻을 수 없는 정보를 누출, Heart bleed)

            file_get_contents(“./uploads/” . $_GET[“name”]);

            이유 :    ./uploads/ .. / .. / .. /  이러면 파일 다 가져올 수 있음

            

            char buf[24];

            strncpy(buf, src, sizeof(buf));

            printf(“You typed %s\n”, buf);

            이유 마지막이 null아니면 다 찍어냄


      4) command / code injection

          쉘  os.system(“sendmail %s < message.txt” % email_addr)

          디비 db.query(“SELECT name FROM user_tbl WHERE email=%s” % email)

          코드 render(“Hello, %s! Welcome to {{ site.name }}” % name)

  

      5)  resource exhaustion

          크래시, (a+)+이상한 정규표현식, 무한루프


  13 최초 버퍼오버플로우는?

       get 함수, 널바이트 들어올  때 까지 입력받음