기본적인 방어기법이 모두 enable된 것을 확인할 수 있고, 64bit 바이너리이다. 해당 바이너리도 취약점은 어렵지 않게 찾을 수 있다. marimo 구조체의 heap 영역 주소를 저장하는 buffer의 길이는 BuyMarimo 함수에서 27번째 줄에 따라 15인 것을 확인할 수 있다. 하지만 여기서 단순히 15만 확인하고 있다는 것도 중요한 취약 포인트이다. show_marimo 함수에서 10번째 줄에 새로 할당한 marimo를 List에 넣고 Offset을 1 증가시키는데 Buy랑 달리 Offset을 체크하는 루틴이 전혀 존재하지 않는다. 따라서 Out-of-bound 취약점이 발생하고, 데이터 영역에서 이 취약점을 통해 Memory corruption이 가능하다. 공격 방법Out-of-bound..
checksec을 통해 확인해보면 Stack Canary가 풀려있는 것을 확인할 수 있고, 64bit 바이너리이다. 그 외의 값은 default 값이므로 중요하지 않다. 취약점은 매우 간단하다. 처음 입력 받는 함수에서 바로 stack buffer overflow 취약점이 존재한다. 따라서 여기서 Return Address를 덮는 것으로, 64bit ROP만 하면 끝난다. exploit 코드123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#!/usr/bin/pythonfrom pwn import * def main(): elf = ELF("./B..
Reversing 분야의 문제이다. 사용자로부터 flag 값을 입력받는다. 바이너리에는 총 15개의 flag 검증 루틴이 존재하고, 사용자로부터 입력받아 검증된 flag가 SHA256으로 연산했을 때 특정 값과 동일해야 한다. 중간에 Anti-Reversing이 걸려있긴 한데, 바이너리 패치로 간단하게 우회할 수 있으므로 무시해도 되며, 중요한 부분은 func 함수와 SHA256 연산 후, strcmp 함수이다. func 함수의 루틴은 z3나 순수 리버싱으로 풀어도 되지만, 귀찮아서 angr를 사용하였다. angr 소스코드12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#!/usr/bin/pyt..
smashme와 동일하게 바이너리 자체에는 어떤 보호기법도 걸려있지 않고, 서버에는 ASLR이 걸려있다. 1번 메뉴와 4번 메뉴에서 malloc으로 할당하는 size는 0x38인데 반해, 입력은 read() 함수를 통해 0x80만큼 입력을 받기 때문에 Heap Overflow가 발생한다. Heap에 할당된 영역을 2개 이상 해제하게 되면 binlist에 들어가게 되어, fd와 bk에 heap 영역의 주소가 들어가는데 이 주소를 leak하여 공격에 사용할 수 있다. RIP 변조는 조금 더 과정이 필요하다. 해제된 chunk의 fd를 할당된 heap address가 저장되는 전역 변수인 reqlist로 변조하면 다음에 추가로 heap을 할당할 때 reqlist의 위치에 heap이 할당이 되어 reqlist ..
바이너리에 그 어떠한 보호기법도 걸려있지 않고, 서버에는 ASLR은 걸려있는걸로 예상하고 시작하였다. 문제의 main 함수에는 gets() 함수를 통해 buffer에 입력을 받기 때문에 Buffer Overflow 취약점이 존재한다. 하지만, 이름 smashme인 것처럼 sub_400320() 함수 때문에 그냥 되진 않는데, 저걸 무사히 통과해서 Return Address에 접근해 종료되도록 만들면 된다. 조금 디버깅해보면 __strstr_sse2_unaligned() 함수의 시작부분에서 rsi 레지스터에서 1바이트씩 가져와 확인을 하는 모습을 볼 수 있다. rsi에 있는 문자열을 살펴보면 조금 수상한 문자열이 들어있는데, 이 문자열이 키워드이다. 해당 문자열 뒤에 문자열을 추가하여 입력을 하면 Segm..
- 개요 본 파일의 방어기법은 위와 같다. 뒤에서도 볼 수 있겠지만 기본 컴파일에서 NX가 해제되어 있는데 문제를 푸는 최종 과정에서 쉘코드를 실행시키면 된다. 프로그램의 메뉴는 총 5개가 있고 각 메뉴의 기능은 메시지를 생성, 제거, 변경, 확인과 프로그램을 종료이다. CTF에서 흔히 볼 수 있는 단순한 형태의 프로그램이다. - 취약점 Leave message 함수의 10번째 줄에서 scanf 함수를 통해 입력하고자 하는 size를 직접 입력할 수 있다. 이 때, 11번째 if문을 통해 확인할 수 있는데 Leave message 함수의 경우, size가 최대 32bytes로 제한되어 있다. 또, 메시지를 생성하고 반환하기 전의 17번째 줄과 7번째 줄의 if문에서 볼 수 있는 전역 변수가 있는데 이 부..
보호되어 있는 글입니다.
CTF를 참여하진 않았지만, 우연하게 들어와서 풀어보았다. 바이너리 : 풀이 : main 함수가 실행되기 전에 init라는 함수가 먼저 실행되어 flag.txt라는 파일을 읽어온다. 이 파일의 내용을 알아내는게 목적이다. main의 printf 함수에서 FSB 취약점을 발견할 수 있고, flag.txt에서 읽어들인 내용을 사용자의 입력과 비교한다. 이 때, 사용자의 입력은 오로지 출력가능한 문자만 입력 가능하다. 요약하면 FSB를 통해 flag.txt의 내용을 읽어들이면 된다. 메모리의 32번째에서 flag.txt의 내용이 저장된 버퍼의 주소가 들어가 있다. 이 부분을 %s를 통해 읽어 들이면 되겠다. Flag : TWCTF{R3:l1f3_1n_4_pwn_w0rld_fr0m_z3r0} 사용된 스크립트 :..
Pwnable 분야로 예선 50, 100, 200, 300과 본선 문제를 제출하게 되었다. 처음 생각한 아이디어를 그대로 문제로 만들다가 난이도 배점을 낮추려고 하다보니 문제 퀄리티가 떨어져 아쉬웠으나 학생들이 짱짱하게도 잘 풀어주어서 다행이었다. 예선 문제 개요Pwnable 50pt - Integer Overflow + Array Index Overflow + Stack OverflowPwnable 100pt - Format String BugPwnable 200pt - Heap Overflow using malloc maleficarum(House of Force)Pwnable 300pt - Use After Free본선 문제 개요Pwnable 본선 - ARM Stack Overflow(ROP)예선 ..