일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- C언어
- 취약점
- architecture
- epoll
- mvwin
- packet filter
- .net core 7
- 풀이
- BOF
- 어셈블리어
- LOB
- packet flow
- Compiler
- Docker
- REDIS
- vtable
- ncurses
- epoll_wait
- wrefresh
- iptables
- cbpf
- level trigger
- doupdate
- ioctl
- .nret core 배포
- rfc5508
- NAPT
- edge trigger
- DOCKER-USER
- wnourefresh
- Today
- Total
목록Computer Science (129)
Tuuna Computer Science
1-day 리눅스 커널 취약점 찾기 스터디중에 container_of 매크로랑 offsetof매크로를 분석하라는 과제를 받음. 구글링하다가 위 둘 매크로는 디바이스 드라이버 제잘할 때 자주 사용하는 매크로임을 깨달음. 분석에 앞서 ㅈㄴ 괴기하다. [ offsetof 매크로 (부모 구조체를 기준으로 멤버의 오프셋 구함) ] #ifndef offsetof #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #endif offsetof 매크로의 경우 구조체 타입과 오프셋을 원한 구조체 멤버를 받음 ((size_t)&((TYPE *)0)->MEMBER) 코드를 보면 0이라는 값을 TYPE*형으로 치환한다음이 것이 MEMBER을 가리키고 이 주소값을 반..
수정) read_ptr은 선언된 버퍼의 크기라기 보단, fgets인자로 준 size값에 따르는 듯? lob풀다가 갑자기 Stdin에 관해서 한 번 분석해보고 싶어서 글을 쓰지만 별로 분석한건 없는 거 같다... 초짜라 뭘 봐야할지도 잘 모르겠고 ㅋㅋㅋ stdio.c 이고 #include "libioP.h" #include "stdio.h" #undef stdin #undef stdout #undef stderr FILE *stdin = (FILE *) &_IO_2_1_stdin_; FILE *stdout = (FILE *) &_IO_2_1_stdout_; FILE *stderr = (FILE *) &_IO_2_1_stderr_; stdin에 대한 구조체 정의 부분이다. struct _IO_FILE { i..
우분투의 배경화면을 10초 단위로 바꿔주는 스크립트입니다. 해당 압축 파일을 해제하여 주시고 set_wallpaper_time.py를 백그라운드로 실행시켜주면 됩니다. ^^7 이미지 파일만 파싱 하여 바꿔줍니다. ^^7 급하게 짠거라 조금 비효율적으로 보일 수 있습니다 ㅎ 알아서 수정하시길 ^^7 커스터마이징 하면 좋을 듯한 거 : 10초마다 폴더에 이미지 파일이 추가되었는지 체킹 하는 함수 만들면 재실행할 필요 X GUI 프로그램으로 만들어서 gnome-tweaks에 시작 시 실행되는 프로그램에 올려둬서 하면 개조흠 백그라운드 실행법 nohup python3 set_wallpaper_time.py & 용량 문제로 코드로 대신 올림. 사용법 : 코드가 있는 파일안에 사진을 넣으면 10초마다 바뀜 타임도 ..
zombie_assassin으로 가기 위한 관문을 가기 위해서는 아래문제의 코드의 취약점을 바탕으로 해결해야 한다. 코드를 보자. 리턴주소에 라이브러리함수, 환경변수도 등등 사용할 수 없다. 그리고 HINT를 보면 Fake EBP를 사용하라고 나와있다. Fake EBP에 대해 알아보자. Fake EBP란 EBP의 값을 이동시켜 return주소를 조작하는 것이다. 근데 한번의 leave 명령으로는 조작된 EBP를 바탕으로 ESP를 조작할 순 없다. 그래서 우린 return주소에 leave명령을 한번 더 쓸 수 있게 leave-ret 명령의 주소를 가지고 와야한다. 그리고 문제의 소스의 마지막에 printf의 인자로 buffer의 주소를 스택에 넣고 있다. 이는 선언된 버퍼 바로 위에 만들어진 것으로 이것도..
추가 : 코드 짜면서 인라인 어셈블리에 새로운 것을 많이 알았음 예를 들어 output, input이라던가 등등 첨엔 변수의 값을 어떻게 이동시킬 지 몰랐는데 input쪽에 따로 설정하는 구간을 보고 개놀램. 학교 과제를 훔쳐보는 도중에 bof 취약점을 어떻게 방어할 것인가를 생각하는 거였는데 이때 bof를 못하게 Canary값을 넣어 방지한느 것은 이미 알고 있었지만 실제로 구현은 못해봤다. 그래서 오늘 한번 해보기로 함. 일단 아래는 문제의 소스이다. 32바이트 선언하고 뭐도 없고 BOF그냥 일어난다. 근데 저 코드에 몇 몇의 인라인 어셈블리 코드를 삽입하여(Canary) BOF를 방지해보려 한다. #include #include #include #include //check함수는 카나리값을 확인하여..
이번에는 bugbear에서 giant로 가는 문제를 풀어볼 생각이다. 일단 문제의 소스를 보자 좀 기네요;; 일단 이를 차분히 분석해보면 이 소스코드에선 libc의 주소값을 구해서 buffer에 저장한뒤 lib_addr이라는 변수에 저장합니다. 여기서 ldd assassin | grep libc란 assassin이라는 프로그램의 의존성이 있는 라이브러리중 libc를 찾는다는 뜻입니다. 근데 우린 assassin을 접근할 수 없죠? 그럼 터미널에서 assassin대신 giant로 해봐여^^ 같은 시스템이니 같은 주소로 찍히겠져 자 libc의 주소는 0x40018000입니다. 이제 다음 코드를 봅시다. nm 명령어는 어떠한 것의 심볼을 알아볼 때 사용하는 것입니다. 이 코드는 libc.so.6에서 __exe..
LOB문제를 풀어보다가 재미난 사실을 알아서 풀이과정을 서술하려함. 일단 문제의 소스코드를 보면 FPO를 사용하라고 나와있다. FPO는 Frame Pointer Overflow로 SFP 즉, 복구 EBP의 값을 조작해서 해결하려는 것이다. 문제의 소스를 더 자세히 보자. argv[1]을 problem_child함수의 인자로 보내고 problem_child의 함수에서 buffer배열 40바이트 선언, strncpy함수로 매개변수를 buffer로 41바이트 복사하고 있다. 여기서 유의할 점은 버퍼의 크기는 40바이트인데 41바이트를 넘기고 있다는 것이다. 즉, 이는 복구 EBP의 값을 오버플로우하여 값을 조작할 수 있음을 읨한다. 일단 FPO를 이해하기 위한 스택구조를 살펴보자. 일단 아래의 그림은 "\x9..
드디어 이진탐색을 어셈블리어로 구현하는데 성공함. 이진탐색의 큰 특징인 재귀적인 특성때문에 디버깅 시간이 조금 걸렸지만 노하우가 생겨 순조롭게 끝낼 수 있었음 ^^ 함수의 프로토타입 : int bin_search(int* integer_number_array, int array_first, int array_last, int find_target); 삽입정렬, 이진탐색, 문자열 정수변환등 구현했으니 어셈블리는 조금 내려놓고 메모리공부 덜한 부분과 C++, 디버거 진행을 마저해야 겠음 C++ 왤케 어렵..;; [소스코드] 심각성] : 모듈을 시작하기 전에 eax, ebx, ecx레지스터를 백업시켜주고 마지막에 복원시켜줘야 한다.
이번에 이진탐색을 어셈블리로 구현하기 위해서는 정렬된 배열이 인자로 준비되어있어야 하기에 어셈블리어로 insert sort(삽입 정렬을 구현해봄) 계속 코드를 작성하다보니 두뇌 최적화가 잘 되어가는듯 ㅎㅎ 실행중에 segmentation fault가 떴는데 알고보니 ebx레지스터를 decrease해야 하는데 increase해서 문제가 발생했던거... 함수의 프로토타입은 insert_sort(int integer_array_size, int* integer_array); 처음 어셈블리어로 구구단 출력했을 때 보다 확실히 코드의 길이가 줄어든것을 체감할 수 있었음. 그리고 C언어로 구현하기 보단 어셈블리로 구현하다보니 변수생성에 메모리를 아낄 수 있는 장점(?)을 발견 다음은 이진탐색을 (재귀함수)를 어셈블..
이진탐색으로 어셈블리어로 구현해보면 어떨까라는 생각에 구현하던중 read 시스템콜은 입력받은 것을 문자열로 처리하는 것을 깨닫게 됨. 그래서 고민끝에 atoi함수를 구현하기로 결심함. + gets함수도 조금 구현해서 어셈블리어 코드 내부에서 메모리할당 + 정수변환까지 계획을 세우고 모듈화 해봄. 함수 프로토타입 : int atoi_asm(void)반환값 : 입력한 문자열에 해당한 정수 단) 10진수를 기준으로 계산되어짐. 16진수의 경우 나중에 ㅎ 궁금한 점은 main에서 이 함수를 호출하면 스택정리가 잘 안된건지 다음 printf를 호출할 때 segmentation fault가 떴는데 func()이라는 함수를 만들고 거기서 호출하니 별 문제 X ... main함수의 호출규약 문제인가 나중에 따로 알아봐야지