목록분류 전체보기 (553)
Self-Improvement
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include #include void func2(){ system("/bin/sh"); } int main(int argc, char *argv[]){ int num=0; char arr[10]; strcpy(arr, argv[1]); printf("arr: %s\n", arr); return 0; } Colored by Color Scripter cs 소스코드는 간단히 입력받은 값을 strcpy를 수행한 후 printf로 출력하는 것이다. gcc 컴파일 시 Dummy 제거 옵션을 주고 스택 버퍼 오버플로우를 일으키는 것은 쉽지만 그냥 컴파일 시 Dummy와 ret 포인터?가 생겨 오버플로우를 일으키는 방식이 조금 달라지게 되..
https://wogh8732.tistory.com/106 https://liveyourit.tistory.com/122 https://shayete.tistory.com/entry/4-Return-to-Library-RTL RTL은 DEP라는 방어의 우회 공격 기법이다. DEP란 버퍼 오버플로우로 RET(스택 등)에 실행 권한을 없앰으로 쉘코드 주입이 이루어지더라도 실행이 되지 않게 하는 방어 기법이다. 윈도우에서 DEP, 리눅스에선 NX-Bit라고 불리운다. RTL을 알기 전 필수?로 알아야하는 PLT, GOT을 간단히 알아본다. PTL은 외부 라이브러리의 함수들을 나열한 테이블이라 할 수 있다. GOT는 PTL에 나열된 함수들의 주소가 담겨져 있는 테이블이라 할 수 있다. RTL 공격 페이로드는 이..
소스코드 출처 : https://bpsecblog.wordpress.com/2016/10/06/heap_vuln/ Heap OverFlow 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include #include int main(void) { FILE* fd = fopen("secret","r"); char* input = malloc(40); char* secret = malloc(40); fread(secret, 1, 40, fd); fclose(fd); read(0, input, 100); // Overflow! printf("%s\n", input); } Colored by Color Scripter cs 소스코드는 간단히 설명하자면 input, secret을 malloc로..
https://bpsecblog.wordpress.com/2016/10/06/heap_vuln/ https://linarena.github.io/linux_0x06 https://y0ubat.tistory.com/222 스택과 달리 낮은 주소에서 높은 주소로 할당되어진다. 동적메모리 할당할 시 malloc()사용되며 반환값은 eax로 반환된다. eax가 가르키고 있는 주소는 힙영역에서의 데이터 부분이며 -8 주소 값을 할시에 prev_size, size 데이터 값도 확인할 수 있다. ex) x/10x $eax-8 buf1 변수를 malloc()하게되면 힙메모리에는 |prev_size size data|로 나타난다. 이 묶음을 chunk라고 불른다. A라는 Chunk의 구조를 보도록 한다. 1. prev_..
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 #include #include int num2 = 3; void func2() { printf("func2()\n"); } void sum(int a, int b) { printf("sum : %d\n", a + b); func2(); printf("%d\n", num2); } int main(int argc, char*argv[]) { int num = 0; char arr[10]; sum(1, 2); printf("END\n"); printf("%d\n", num); printf("%d\n", num2); } Colored by Color Scripter cs main() -> su..
출처 : https://d4m0n.tistory.com/14 위 strcpy 실습을 보면 쉘코드를 입력받는 argv[1]에 넣어주며 buffer 주소를 ret에 넣는 이유는 ret는 4바이트임으로 buffer주소를 넣어줌으로써 쉘코드가 포함된 argv[1]을 buffer에 복사해줌으로써 ret가 실행될때 buffer주소에 접근하여 쉘코드를 실행하게끔 해주는 것이다. 출처 : https://bpsecblog.wordpress.com/2016/03/08/gdb_memory_1/ 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 #include #include void func2(){ puts("func2()"); } void sum(int ..
메모리 맵 탭으로 들어가본다. 중요한 것들만 작성해본다. [PE Header] consoleapplication2.exe 정보라고 적혀있는 라인은 PE 헤더 정보를 뜻한다. 0xE30000이 시작 주소이며 0x1000 크기를 가지고있다. [Code Segment] ".text" 정보라고 적혀있는 세그먼트는 텍스트 세그먼트 또는 코드 세그먼트라고 불린다. 실행 코드가 들어있는 부분이다. [Data Segment] ".data" 정보라고 적혀있는 세그먼트는 초기화된 데이터가 저장되는 공간이다. 전역변수나 Static변수가 선언되어 있으며 초기값이 설정된 데이터가 저장되어있다. [Resource Data Segment] ".rdata" 정보라고 적혀있는 세그먼트는 문자열과 상수 등이 저장된 공간이다. 읽기 전..
IAT는 프로그램에서 사용하는 라이브러리 테이블이다 CFF Explorer에서 IAT에서 "kernel32.dll"에 속한 API를 확인하고 x32dbg에서 찾아본다. CFF Explorer의 IAT의 Kernel32.dll의 GetVersion API의 INT(Import Name Table) 주소 즉 문자열을 로딩한 주소는 0x75B6이며 Image Base 값 까지 합하면 0x4075b6 주소이며 x32dbg에서 확인해본다. GetVersion() 함수를 사용하는 부분을 알아본다. "Kernel32.dll" API 리스트에서 GetVersion은 2번째에 존재하며 이는 IAT의 위치를 나타내는 FTs에서 2번째 데이터이다. Kernel32.dll의 Fts 값이 0x7000이며 Image Base까지..
VA Vitual Address로 메모리의 절대 주소를 의미한다. 즉 x96dbg로 프로그램을 올렸을시에 로딩된 메모리 주소를 뜻한다. VA = RVA - Imagebase Easy_Keygen.exe 프로그램을 x64dbg에 올린 후 "Input Name:" 문자열이 로딩된 주소는 0x00408060이며 이것이 VA(Vitual Address)이다. RVA Relative Virtual Address로 프로세스 가상 메모리의 상대주소를 의미한다. RVA = VA - Image Base RVA = RAW + VA - PointToRawData 위의 VA가 0x00408060일 시 RVA 는 0x8060이 된다. RAW RAW는 디스크 상의 파일에서의 주소라 하며 우리가 잘 알고 있는 오프셋이라고 부른다...