목록2020/05 (16)
Self-Improvement
적용된 보호기법 NX(스택 실행권한 X), ASLR(주소 동적 변환) 파일 정보 ELF 32-bit 실행파일이며 dynamically linked와 stripped로 되어있다. 실행 실행하면 입력값을 받은 후 "WIN"이라는 문자열이 출력이 된다. IDA stripped로 되어있음으로 gdb로 메인을 찾을 수 없지만 IDA로 확인하면 쉽게 알 수있다. (WIN string 찾기 등) main은 0x804841D 주소로 되어있다. 코드로 변환하여 보면 main에서 sub_80483f4(read_sub())를 호출하여 read함수로 입력값을 받고 다시 main에서 write 함수로 "WIN"이 출력된다. read함수에서 0x100만큼 입력할 수 있지만 buf는 0x88크기를 가지므로 BOF가 발생하게 되며 ..
소스코드 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 #include #include int main(void){ setvbuf(stdin,0,2,0); setvbuf(stdout,0,2,0); vuln(); } int vuln(void){ char buf[256]; int sel; memset(buf,0,256); while(1){ write(1,">>>",4); scanf("%d",&sel); switch(sel){ case 1:read(0,buf,512); break; case 2:printf("%s\n", buf); break; case 3:return 0; break; } } } Colored by Color Scri..
소스코드 read함수에서 선언한 buf 크기보다 큰 입력값을 받고 있음으로 오버플로우가 가능하다. 적용된 보호기법 NX Bit(스택내에 실행권한 X), ASLR(주소가 동적 변화), Partial RelRO(Got Overwrite O) Python Pwntools 코드 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667from pwn import * context.log_level='debug'context(arch='x86', os='linux', endian='little') e=ELF('./rop')p=process('./ro..
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 ..