[dreamhack] basic_exploitation_001
2022. 5. 9. 18:53
Study/System Hacking
문제 풀이 제공된 파일: basic_exploitation_001 / basic_exploitation_001.c #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void read_flag() { system("cat /flag"); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); gets(b..
[dreamhack] basic_exploitation_000
2022. 5. 8. 23:44
Study/System Hacking
문제 풀이 제공된 파일: basic_exploitation_000 / basic_exploitation_000.c #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); printf("buf = (%p)\n", buf); scanf("%141s", buf)..
[dreamhack] Return Address Overwrite
2022. 5. 8. 19:03
Study/System Hacking
문제 풀이 제공된 파일: rao.c // Name: rao.c // Compile: gcc -o rao rao.c -fno-stack-protector -no-pie #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void 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; } rao를 컴파일 한 후 디버깅해보자. 스택에 0x30크기의 공간이 ..
[dreamhack] Exploit Tech: Return Address Overwrite
2022. 5. 6. 19:14
Study/System Hacking
분석 취약점 분석 // Name: rao.c // Compile: gcc -o rao rao.c -fno-stack-protector -no-pie #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void 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);에 취약점이 존재한다. 입력의 길이에 제한을 두지 않기..
[dreamhack] Memory Corruption: Stack Buffer Overflow
2022. 5. 5. 17:46
Study/System Hacking
버퍼 오버플로우 버퍼(Buffer) 버퍼는 '데이터가 목적지로 이동되기 전에 보관되는 임시 저장소'이다. 데이터 처리 속도가 다른 두 장치가 있을 때 그 사이에 버퍼를 두면 완충 작용을 할 수 있다. 송신측은 버퍼로 데이터를 전송하고, 수신측은 버퍼에서 데이터를 꺼내어 쓰면 버퍼가 가득 찰 때까지는 유실되는 데이터 없이 통신할 수 있기 때문이다. 현대에는 이런 완충의 의미가 많이 희석되어 데이터가 저장될 수 있는 모든 단위를 버퍼라고 부른다. 스택에 있는 지역 변수는 '스택 버퍼', 힙에 할당된 메모리 영역은 '힙 버퍼'라고 불린다. 버퍼 오버플로우 말 그대로 버퍼가 넘치는 것을 말한다. 10개의 원소를 가진 char배열은 10바이트의 크기를 가진다. 해당 버퍼에 20바이트의 문자를 저장하게 되면 10바..
[dreamhack] Background: Calling Convention
2022. 5. 4. 13:53
Study/System Hacking
함수 호출 규약이란? 함수의 호출 및 반환에 대한 약속을 말한다. 함수를 호출할 땐 피호출자가 요 구하는 인자를 전달해야 하며 실행이 끝난 후에는 반환값을 받아야 한다. 또한 반환된 이후를 위해 호출자의 상태 정보(Stack frame)와 반환 주소(Return Address)를 저장해야 한다. 이에 대한 규약을 함수 호출 규약이라고 한다. 함수 호출 규약의 종류 컴파일러는 CPU 아키텍처에 적합한 호출 규약을 선택한다. x86(32bit) 아키텍처의 경우 레지스터로 피호출자에게 인자를 전달하기에는 레지스터의 수가 적기 때문에 스택으로 인자를 전달하는 규약을 사용한다. 반면 x86-64 아키텍처의 경우 레지스터의 수가 많으므로 인자 전달은 레지스터를 통해 이루어지며 인자의 수가 많을 경우에만 스택을 추가..
[dreamhack] shell_basic
2022. 4. 4. 19:21
Study/System Hacking
문제 풀이 flag의 위치는 "/home/shell_basic/flag_name_is_loooooong"이라는 정보가 주어졌다. 앞선 이론에서 배웠던 orw 셸코드를 작성하면 될 것 같다. 일단 문제 파일 shell_basic.c 먼저 살펴보자. // Compile: gcc -o shell_basic shell_basic.c -lseccomp // apt install seccomp libseccomp-dev #include #include #include #include #include #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void init() { setvbuf(stdin, NULL..
[dreamhack] Exploit Tech: Shellcode
2022. 4. 2. 15:02
Study/System Hacking
셸코드(Shellcode) 셸코드는 익스플로잇을 위해서 사용하는 어셈블리 코드 조각으로 셸을 획득하기 위해 셸코드를 사용한다는 점에서 셸이라는 접두사가 붙었다. rip를 인위적으로 해커가 작성한 셸코드로 옮기게 되면 해커가 원하는 어셈블리 코드가 실행된다. 이때 어셈블리어는 기계어와 대부분 일대일 대응관계이므로 원하는 모든 명령을 CPU에 내릴 수 있다. 셸코드는 어셈블리어로 구성되기 때문에 일반적으로 아키텍처와 운영체제에 따라서 다르게 작성된다. 아키텍처별로 자주 사용되는 셸코드를 공유하는 사이트도 있으나 본인의 현재 메모리 상태를 반영하지는 않기 때문에 스스로 상황에 맞는 코드를 작성할 수 있어야 한다. orw 셸코드 orw셸코드는 파일을 열고 읽어서 화면에 출력해주는 셸코드이다. “/tmp/flag..
[dreamhack] Tool: pwntools
2022. 3. 27. 16:43
Study/System Hacking
pwntools의 등장 배경 익스플로잇 코드를 작성할 때 자주 사용되는 함수들을 반복적으로 구현하는 것은 비효율적이다. 좀 더 간편하고 효율적으로 익스플로잇 코드를 작성하기 위해 만든 것이 바로 pwntools 파이썬 모듈이다. - 초기 익스플로잇 스크립트 #!/usr/bin/env python2 import socket # Remote host and port RHOST = "127.0.0.1" RPORT = 31337 # Make TCP connection s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((RHOST, RPORT)) # Build payload payload = "" payload += "Socket script" pa..