Hack/Pwnable
-
ARM ExploitHack/Pwnable 2016. 1. 11. 22:54
#include #include void shell(){system("/bin/sh");}void vuln(char *arg){char buf[10];strcpy(buf,arg);}int main(int argc,char *argv[]){char buffer[256];if(argc < 2) {printf("argv error\n");exit(0);}vuln(argv[1]);return 0; } 코드는 간단하다. 라즈베리파이같이 ARM 환경의 서버가 있다면 gcc로 컴파일해주자. 만약 존재하지않는다면, cross compiler로 돌려 qemu로 돌리면된다. (gdb) disas mainDump of assembler code for function main: 0x000084a8 :push{r11, lr}..
-
-
Mac mprotectHack/Pwnable 2015. 12. 7. 10:59
Mac도 리눅스에서 우리가 사용한것처럼 똑같이 mprotect를 사용할수있다. mprotect는 해당주소에 권한을 부여할수있는데, 주로 NX Bit가 걸려있을떄 사용하게된다. #include #include #include #include char shellcode[] = "\xeb\xfe"; int main(int argc, char *argv[]){ void (*f)(); char *x = malloc(2); memcpy(x,shellcode,sizeof(shellcode)); f = (void (*)()) x; f(); } 다음과같은 코드가있다. 이를 그냥 실행하면 NX가 걸려있는상태이기때문에 세그먼트 폴트가 나게된다. HackCat:~ Songsangjun$ ./heap Segmentation f..
-
Mac ASLRHack/Pwnable 2015. 12. 7. 10:20
맥에서 리눅스와같이 ASLR이 존재한다. 힙주소, 스택주소등을 계속해서 랜덤화 시켜준다. 간단한 바이너리로 테스트를 해보면 확인해볼수있다. #include #include int main(int argc,char *argv[]){int a;char *x = (char *)malloc(256);printf("Library: %p\n",&malloc);printf("Heap Addr: %p\n",x);printf("Stack Addr: %p\n",&a); } 힙을 확인하기위해 malloc으로 동적으로 할당해주었고, 스택을확인하기위해 지역변수, 라이브러리주소는 malloc 라이브러리를통해 확인해보기위해 위와같이 작성하였다. HackCat:~ Songsangjun$ ./aslrtest Library: 0x7ff..
-
otool (object tool)Hack/Pwnable 2015. 12. 7. 09:43
otool은 맥에서의 objdump, nm, ldd라고 생각하면된다. 바이너리에 로딩되어있는 동적 라이브러리 들을 확인할수있고 해당 디스어셈블링도 가능하다. HackCat:~ Songsangjun$ otool -L /bin/ls/bin/ls:/usr/lib/libutil.dylib (compatibility version 1.0.0, current version 1.0.0)/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1) -L옵션을 이용해서 로딩되어있는 라이브러..
-
kext(kernel extension)Hack/Pwnable 2015. 12. 7. 09:34
맥에서 일종의 드라이버로, 커널의 확장자라고도 할수있다. 기본적으로 kext의 위치는 /System/Library/Extensions/ 경로에 존재한다. HackCat:~ Songsangjun$ kextstatIndex Refs Address Size Wired Name (Version) UUID 1 91 0xffffff7f80a43000 0x9c80 0x9c80 com.apple.kpi.bsd (15.0.0) 684DCCA5-DA4D-414C-A013-DCBE7EBCE009 2 8 0xffffff7f80dad000 0x3890 0x3890 com.apple.kpi.dsep (15.0.0) 4493C0E7-9011-4586-A9C1-D507610BFC50 3 110 0xffffff7f80a04000 0x..
-
Fake EBPHack/Pwnable 2015. 12. 4. 04:12
Fake EBP는 return까지밖에 덮을수없을때 사용할수있는 기법이다.대부분 RTL,ROP 같은경우 RET를 덮고 그 이후에 체이닝을 하거나 ret+8까지 덮게되는데, FEBP는 조건이 RET까지밖에 못덮을때 사용할수있다.1 2 3 4 5 6 7 8 9#include int main(int argc, char * argv[]) { char buf[48]; strncpy(buf, argv[1], 56); puts(buf); return 0; } 소스는 간단하게 RET까지만 덮을수 있게 되어있다. compile optiongcc -o febp febp.c -fno-stack-protector -zexecstack -mpreferred-stack-boundary=2 0x0804844d :push %ebp 0..
-
FPO(Frame Pointer Overwrite]Hack/Pwnable 2015. 12. 2. 03:36
FPO는 1바이트를 덮음으로써 함수가 끝나기전 leave 명령으로 mov ebp,esp 와 pop ebp가 존재한다. 우리는 BUF + SFP + RET인점을 이용해서 1바이트 오버플로우로 인해 0Xbfffff??, 한바이트를 바꿀수있는데, 이로서 쉘코드를 실행할수있는 장점이존재한다. #include #include void overflow(char *arg){char buffer[40];strncpy(buffer,arg,41);printf("%s",buffer);}int main(int argc, char *argv[]){overflow(argv[1]);} 아주 간단한 코드이다.overflow함수로 인자를 넘겨주는데 argv1을 넘기고 strncpy에서 버퍼+1만큼의 사이즈를 넣을수있다. 정확히 1바이..