[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 아키텍처의 경우 레지스터의 수가 많으므로 인자 전달은 레지스터를 통해 이루어지며 인자의 수가 많을 경우에만 스택을 추가..
[HackCTF] Guess me
2022. 5. 2. 20:12
Study/Web Hacking
Web: Guess me 문제: http://ctf.j0n9hyun.xyz:2030 php 소스코드가 주어져있다. 비밀코드를 맞히면 플래그를 획득할 수 있는 문제다. 소스코드를 하나씩 분석해보자. $filename = 'secret.txt' 파일이름 변수에 'secret.txt'가 들어있다. extract($_GET); $_GET 배열의 키값을 변수로 만들어준다. ex) $_GET['filename'] => $filename if($guess) $guess로 설정된 변수가 있는지 검사한다. $secretcode = trim(file_get_contents($filename)); $filename에서 공백을 지운 내용을 $secretcode에 담는다. if ($guess === $secretcode) $g..
[HackCTF] 보물
2022. 5. 2. 16:13
Study/Web Hacking
Web: 보물 문제: http://ctf.j0n9hyun.xyz:2025 Page 숫자 중에 비밀이 있고 그곳에 보물을 숨겨놨다고 한다. 아래 3개의 Page 버튼을 누르면 페이지 하단에 특정 문자열이 나타난다. 이 문자열은 Page 1, Page 2, Page 3 버튼 마다 달랐다. 문제 페이지를 더 살펴보다가 page 파라미터가 url에 있기에 url에서 파라미터 값을 버튼에 없는 다른 숫자로 설정해봤다. ex) 4, 5, 6, ... 그 결과 버튼에 있는 값 외에도 특정 문자열이 출력된다는 것을 알 수 있었다. 페이지 숫자의 비밀에 보물을 숨겨놨다고 하니 page의 값을 하나씩 증가시키다 보면 flag값이 나올 것 같다. Brute force 공격을 해야하니 파이썬으로 exploit 코드를 작성해보..
[HackCTF] Button
2022. 4. 5. 19:27
Study/Web Hacking
Web: Button 문제: http://ctf.j0n9hyun.xyz:2026 문제 페이지에 접속하면 가장 먼저 "아래의 버튼으로 하여금 플래그를 출력하게 해줘!"라는 문구가 보인다. 이 문구가 왠지 힌트가 될 거 같다. 개발자 도구를 열어서 버튼 요소를 살펴봤다. 확인해보니 버튼은 submit 버튼이었고 form은 method가 post로 설정되어 있다. 여기서 문제 페이지에 나와있던 문구가 생각났다. 버튼으로 하여금 플래그를 출력해달라고... submit되는 value를 button에서 flag로 바꿔봤다. 버튼의 내용이 button에서 flag로 바뀌었다. 여기서 버튼을 클릭하면 value는 button이 아니라 flag로 전송될 것이다. 혹시나 하는 마음에 시도해본 방법인데...결과는 .......
[HackCTF] Hidden
2022. 4. 4. 20:52
Study/Web Hacking
Web: hidden 문제: http://ctf.j0n9hyun.xyz:2023/ 문제 페이지에 접속하면 위와 같은 화면이 나온다. 화면에는 1, 2, 3, 4번의 버튼이 있고 이를 각각 클릭하면 다음과 같은 alert이 뜬다. 이때 문제를 어떻게 풀어야 할지 감이 왔다. 바로 개발자 도구로 html을 살펴봤다. 각각의 버튼은 form태그 안에 있었고 클릭하면 get방식으로 value값이 submit되고 있었다. 5번 파일에 플래그가 있다고 했으니 get 방식으로 5번 파일에 접근해봤다. ?id=5로 접근했더니 Flag를 획득했다.
[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..
[HackCTF] /
2022. 3. 28. 00:08
Study/Web Hacking
Web: / 문제: http://ctf.j0n9hyun.xyz:2020/ 문제 화면엔 Hidden Flag 텍스트와 로봇 이미지가 있다. 이미지가 있는 걸 보고 이미지를 이용해서 숨겨진 flag를 찾는 문제라고 생각했다. 처음엔 img 태그에 onerror 속성을 이용해서 script를 삽입해보려 했는데 막상 풀다보니 이렇게 해결하는 문제가 아닌 것 같았다. 문제에 어떻게 접근할지 계속 생각하고 있는데 같이 문제를 풀던 지인분이 "로봇"이라는 힌트를 주셨다. 이미지에 있는 로봇 자체가 힌트라고... 이게 무슨 말일까 곰곰히 생각해보니 딱 하나 떠오르는 게 있었다. robots.txt!!! 너무 어이없었지만 바로 robots.txt를 열어봤다. 열어보니 robots.txt는 /robot_flag/의 접근을..