쉘코드를 작성하는 문제다. 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 ..