SSP 개념SSP(Stack Smashing Protector) SSP(Stack Smashing Protector)SSP는 BOF를 방어하기 위한 보호기법 중 하나로 함수를 실행할 때, canary라는 랜덤 값을 스택에 추가하여 BOF로 스택 데이터가 변조됐는지 확인하는 방법이다. canary가 변조된 경우는 스택 데이터가keyme2003.tistory.com ssp_001#include #include #include #include void get_shell() { system("/bin/sh");}void print_box(unsigned char *box, int idx) { printf("Element of index %d is : %02x\n", idx, box[idx]);}voi..
Return Address Overwritevoid get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL);}int main() { char buf[0x28]; init(); printf("Input: "); scanf("%s", buf); return 0;}scanf("%s", buf)에서 길이 검증이 없다. 따라서 BOF가 발생한다. BOF 취약점을 이용해서 RET을 get_shell() 주소로 덮으면 쉘을 얻을 수 있다. gdb로 get_shell 주소를 구했다. 다음으로 buf ~ RET 거리를 구해보자. 를 보면 scanf() 호출 전에 [rbp-0x30]를 rax에 넣고 이를 ..
문제분석void get_shell() { system("/bin/sh");}int main(int argc, char *argv[]) { char buf[0x80]; initialize(); read(0, buf, 0x80); printf(buf); exit(0);}read(0, buf, 0x80)에서 길이에 대한 검증을 수행하고 있다. 따라서 일반적인 BOF는 발생하지 않는다. 그렇다면 어떤 취약점이 존재하는 것일까?printf(buf);위 코드에서 Format String Bug 취약점이 발생한다. printf 함수를 사용할 때, 포맷스트링을 지정하지 않고 buf를 1번째 인자로 사용하도록 코드를 작성한 상황이다. 이는 출력함수를 잘못된 방식으로 사용한 경우다. 포맷스..
쉘코드를 작성하는 문제다. execve(), execveat()처럼 쉘을 실행하는 함수는 사용할 수 없다. 문제 의도는 다른 함수를 이용해서 flag를 읽을 수 있도록 쉘코드를 작성하는 것이 목표다. 설명에서 flag 파일 위치를 절대경로로 알려주고 있다. 일반적인 쉘코드는 execve("/bin/sh", ..., ...) 처럼 쉘을 실행하는 유형이 대부분이다. 그러나 execve()를 사용할 수 없는 상황이므로 일반적인 쉘코드를 사용해서 쉘을 획득하는 것은 불가능하다. 그렇다면, flag를 어떻게 획득할 수 있을까? 목표는 쉘을 실행하는 것이 아니라 flag를 획득하는 것이다. 그렇다면, execve()를 사용하지 않고 read(), write()로 flag를 읽는 방식으로 접근해볼 수 있다. read..
basic_exploitation_001void read_flag() { system("cat /flag");}int main(int argc, char *argv[]) { char buf[0x80]; initialize(); gets(buf); return 0;}입력 길이에 대한 검증이 없다. 따라서 BOF가 발생한다.read_flag() 함수는 flag를 읽는 코드이므로 RET을 read_flag() 주소로 덮으면 flag를 얻을 수 있다. read_flag() 주소를 구해보자.pwndbg> p read_flag$1 = {} 0x80485b9 gdb로 read_flag() 주소를 출력한 결과다.0x80485b9다. RET을 0x80485b9으로 덮으면 flag를 획득할 수 ..
basic_exploitation_000Ubuntu 16.04Arch: i386-32-littleRELRO: No RELROStack: No canary foundNX: NX disabledPIE: No PIE (0x8048000)RWX: Has RWX segments보호기법이 적용되지 않은 문제다.int main(int argc, char *argv[]) { char buf[0x80]; initialize(); printf("buf = (%p)\n", buf); scanf("%141s", buf); return 0;}입력 길이를 141 바이트로 제한하고 있지만 buf 크기는 0x80(128) 바이트다. 따라서 BOF(Buffer ..