본문 바로가기

드림핵

(68)
[드림핵]카나리 동적 분석 간단한 C코드를 작성한 뒤 카나리 기법이 적용된 방식으로 컴파일했다.컴파일된 실행파일을 동적 분석하면서 카나리가 어떤 방식으로 Stack Buffer Overflow 공격을 탐지하는지 확인했다. 활용한 C코드(canary.c)는 아래와 같다.#include int main() { char buf[8]; read(0, buf, 32); return 0;}크기가 8 바이트인 buf 변수에 32바이트를 읽어오므로 Stack Buffer Overflow 취약점이 있는 코드이다. 이 코드를 아래와 같이 컴파일하면 카나리가 적용된 실행파일로 컴파일된다.$ gcc -o canary canary.c -fstack-protectorUbuntu 22.04에서는 -fstack-protector 옵션이 없어도 기본..
[드림핵 워게임]shell_basic 먼저 다운로드한 파일 중에서 C코드를 열어보았다.뭐하는 함수인지 이해하기 어려운 함수들이 있었는데 문제를 읽어보면 풀이와 관련이 없는 함수인 것을 알 수 있다.main함수는 아래와 같이 매우 간결하게 생겼다.46행에서 "shellcode: "를 출력하고 바로 read() 함수로 데이터를 읽어온다. 프로그램이 어떤 모습으로 돌아가는지 직접 확인하고 싶어서shell_basic 실행파일을 실행해보았다.실행하니 "shellcode: "가 출력되고 임의로 iguana를 입력하고 나니segmentation fault가 뜨면서 프로그램이 종료되었다. 공격코드를 쉘코드로 제작해서 입력하면 해당 코드가 main 함수의 50행에서 실행되는 것으로 파악하였다.드림핵 시스템해킹 로드맵의 Shellcode 스테이지에서 orx셸..
[드림핵 System Hacking Fundamental] Stage 5 이전 포스팅에 이어 계속 공부한 내용을 정리해본다. Stage5. Stack Buffer Overflow 이전까지는 기초지식과 툴 사용법을 익혔다. 이제 처음으로 공격기법을 공부하기 시작했다. 공부하면서 기초지식과 툴 사용법을 익히는 과정이 매우 중요했다는 것을 느낄 수 있었다. Stage5-1. Calling Convention 함수 호출 규약(Calling Convention) 함수의 호출 및 반환에 대한 약속 Caller(호출자), Callee(피호출자)가 있음 함수 호출 규약의 종류: SYSV(x86-64아키텍처), cdecl(x86아키텍처) 등 SYSV의 특징 6개의 인자를 rdi, rsi, rdx, rcx, r8, r9에 순서대로 저장하여 전달하며, 더 많은 인자를 사용할 때는 스택을 추가로 ..
[드림핵 System Hacking Fundamental] Stage3 이전 포스팅에 이어 계속 공부한 내용을 정리해본다. Stage3. Tool Installation 시스템 해킹을 할 때 자주 쓰는 툴로 디버거인 gdb와 익스플로잇 코드를 짤 때 활용하기 좋은 pwntools가 있다. 각각에 대해 설치방법부터 사용법까지 다루는 매우 유익한 강좌였다. 이 강좌에서도 설명이 아주 친절하게 되어있지만 gdb의 기능을 익히기에는 조금 부족한 느낌이 있어서 BombLab을 풀면서 툴 사용법을 익히는 과정을 거쳤다. pwntools는 아직 제대로 써본 적이 없어서 익숙해지지 않은 상태인데, 다음 Stage를 풀면서 차차 익숙해져가길 기대하고 있다. Stage3-1. Tool:gdb gdb: 리눅스의 대표적인 디버거로, 실행 프로그램을 어셈블리 명령어 단위로 실행해주는 프로그램. p..
[드림핵 System Hacking Fundamental] Stage 1,2 →3월 14부터 시작해서 4월 2일까지 드림핵 System Hacking 로드맵을 통해 Stage1, 2, 3, 5를 학습했다. (Stage 4보다 5가 진입장벽이 낮아 5를 먼저 진행했다. 4는 이후에 공부할 예정이다.) 여기까지 공부한 내용을 간략하게 정리하려고 한다. Stage1. System Hacking Introduction Stage1은 정말 소개하는 내용으로 별 내용은 없었다. 기본적인 코드를 이해할 수 있는 수준만 되면 해당 로드맵을 따라갈 수 있다고 하면서 C와 python 코드를 제시했다. 제시된 코드를 각각 풀어보고 넘어갔다. Stage2. Background - Computer Science Stage2 는 컴퓨터 사이언스 배경지식을 다루었는데, 지나고 보니 이 부분 내용이 분량이..
[드림핵 워게임] basic_exploitation_001 먼저 문제 파일을 다운로드한다. basic_exploitation_001.c를 열어본다. main() 함수부터 보면, 27행에 0x80 크기의 char 배열 buf가 선언되어 있다. 29행에서 gets()함수로 입력받은 값을 buf에 저장한다. gets()함수는 입력값의 크기를 검증하지 않으므로 여기에 stack buffer overflow 취약점이 존재한다. 22행에는 read_flag()함수가 존재하는데 flag파일을 읽어오는 시스템 명령어를 실행한다. 이제 gdb를 이용해 바이너리를 분석해보자. 에서 [ebp-0x80]의 주소를 eax가 가리키게 하고 있다. buf를 eax가 가리키게 한 것으로 해석할 수 있다. 이 상태에서 main 함수의 스택 프레임을 그려보면 다음과 같다. 공격 시나리오는 아래..
[드림핵 워게임] basic_exploitation_000 먼저 주어진 문제파일을 다운로드한다. basic_exploitation_000.c를 열어봤다. main 함수부터 살펴보면, 24행에서 0x80크기의 char 배열 buf 변수를 선언한다. 26행은 그냥 timeout을 걸어놓은 것으로, 취약점과는 관련이 없는 것 같다. 28행의 printf() 는 buf의 주소를 출력해준다. 29행의 scanf()가 취약점과 직접적으로 관련된 부분으로 보인다. buf 변수에 141바이트 만큼 값을 입력하는데 buf의 크기인 0x80(십진수로 128)보다 크므로 overflow가 발생할 수 있다. gdb를 이용해 바이너리를 분석해보자. 에서 scanf() 함수를 호출하기 전 스택 프레임 상태를 확인해보면, 에서 [ebp-0x80]의 주소를 eax가 가리키게 한다. scan..
[드림핵 워게임] Return Address Overwrite 먼저 문제를 다운로드했다. rao.c부터 살펴본다. main 함수부터 보면 char 배열 변수 buf를 0x28만큼의 크기로 선언한다. 그리고 25행에서 scanf()를 이용해 buf에 사용자 입력값을 저장하는데 scanf()에 입력값을 "%s"로만 받으면 입력값 길이를 검증하지 않기 때문에 stack buffer overflow가 발생할 수 있다. 다음으로 get_shell()함수가 눈에 띠는데, execve()함수를 이용해 "/bin/sh"를 실행한다. 즉 get_shell()를 실행하면 shell을 획득할 수 있다. 여기까지 봤을 때 공격 시나리오를 다음과 같이 짤 수 있다. stack buffer overflow 취약점을 이용해서 return address를 get_shell()함수로 overwr..