목록CTF (48)
Sechack
calloc에 대한 재미있는 내용을 배운 문제였다. 일단 나는 이문제를 풀때 당시에는 새벽이어서 잠결에 calloc으로 이것저것 해보다가 우연히 걸린거라서 원리는 문제를 풀고 하루가 지난 시점인 지금 알았다. exploit에 사용된 공격 기법은 Tcache Stashing Unlink Attack이다. main함수는 이렇다. 일단 가장 눈에 띄는게 system의 주소를 그냥 출력해준다. 그리고 문제에서 libc파일도 같이 주기때문에 libc leak을 할 필요가 없고 libc database를 사용할 필요도 없다. libc파일의 버전은 2.31이었다. (ubuntu 20.04) 메뉴를 출력해준다. 1번을 선택하면 호출되는 함수이다. 일단 여기서도 메뉴가 있는데 1번 메뉴를 사용하면 malloc(8)이 호..
CTF에 알고리즘 카테고리가 있고 문제도 7개씩이나 있다... 해킹대횐데...ㅠㅠ 일단 나는 알고리즘을 못하는 사람이므로 안풀려고 했지만 첫번째 문제는 비빌만 해보여서 도전해봤는데 생각보다 쉬웠다. 일단 nc접속정보랑 PDF파일이 주어진다. 주어진 PDF파일을 열어보면 이렇다. 대충 a는 +로 치환하고 m은 *로 치환해서 +가 우선순위 더 높게 괄호로 묶어서 계산한 결과를 mod 2^31-1 해서 보내라는 말이다. 샘플을 보면 더 확실히 와닫는다. 일단 나의 주 아이디어는 주는 문자열에서 a는 +로 m은 *로 치환하고 +일때는 괄호 잘 처리해서 최종적으로는 식을 만든다음에 eval함수로 가져가서 계산결과를 얻고 그것을 보내는것이다. 일단 처음에는 문제 제대로 안읽고 1자리 숫자만 있는줄알고 인덱스가 짝수..
브포날리는데 break안걸어서 맞는거 나오고도 계속 진행되서 결과 안나오는줄 착각하고 조금 삽질한 문제이다. 이문제는 소스코드를 준다. Node.js로 만들어진 사이트고 app.js이외에도 css파일이나 package.json같은것들도 같이주는데 별로 안중요하니 app.js만 보겠다. const express = require("express") const cookieParser = require("cookie-parser") const ejs = require("ejs") require("dotenv").config() const app = express() app.use(express.urlencoded({ extended: true })) app.use(cookieParser()) app.set("..
문제에서 cipher.txt파일 하나를 준다. 열어보니까 .......... 할말이 없다... 이게뭐지...ㅋㅋ 무려 파일크기가 7000kb가 넘는다. 이게 무슨 암호여;;; 근데 잘 생각해보니까 base64라는 녀석과 비슷해보였다. 생각은 무슨... 그냥 게싱... 그래서 한번 Base64디코딩 사이트에 돌려봤다. 전체 복붙하는건 텍스트가 너무 많아서 브라우저가 렉먹으니까 파일 업로드 기능을 사용했다. https://www.base64decode.org/ Base64 Decode and Encode - Online Decode from Base64 format or encode into it with various advanced options. Our site has an easy to use onl..
flag.txt파일 하나 주고 풀라고 한다. 열어보니까 이랬다. 딱봐도 caesar같아서 바로 디코딩 돌려봤다. 아...숫자...ㅠㅠㅠ 출제자분에게 물어보니까 친절하게 숫자도 같이 암호화된다고 답변해주셨다. 고전암호는 이론만 알지 많이 접해본게 아니라서 삽질 좀 했다. RSA같은건 아직 잘 모른다. 조만간 공부해볼 생각이다. 그래서 ROT디코더에 넣고 brute force옵션으로 돌려봤다. 파이썬 스크립트를 짜야되는데 귀찮아서 그냥 사이트에서 했다. 다행히 플래그 형식이 있었다. DCTFTH3D13H4SB33NC4ST 라고 나오는데 암호화된 플래그는 rq7t{7vH_rFH_vI6_pHH1_qI67}였다. 아마도 사이트에서 소문자도 대문자로 표기해주는듯 했다. 그래서 암호화된 원본 플래그에서 소문자인건 소..
알람이 10초다... 너무 적게준거 아닌가... 손퍼징... 크흠... vuln함수이다. 솔직히 여기만 봤을때는 5분컷 할줄 알았다. fsb인데 입력할 공간도 넉넉하고 while문에서 돌아가고 있다. 평범하게 주소 덮으면 되는줄 알았다. libc는 간단하게 main함수의 ret부분을 leak하면 된다. Full relro이다. 바이너리 이름은 좀 길어서 format으로 바꿔주고 풀었다. Dockerfile도 같이 주길래 봤더니 ubuntu 18.04여서 해당 환경에서 진행했다. Full relro를 보자마자 __free_hook, __malloc_hook을 덮을 생각을 했다. 하지만 바이너리 내에서 힙 관련 함수를 사용하지 않는다. 그러나 좌절하지 않고 heap chunks명령어를 쳐봤더니 청크가 있다...
앞에 3문제는 그냥 기초적인 rop라서 딱히 적을게 없는데 이문제는 함수의 특성을 제대로 고려하지 못해서 많은시간 삽질한 문제라서 풀이 남깁니다... int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { __int64 v3; // rdx __int64 v4; // rdx int v5; // ST0C_4 signed int v6; // [rsp-160h] [rbp-160h] __int64 v7; // [rsp-158h] [rbp-158h] __int64 v8; // [rsp-150h] [rbp-150h] const char *v9; // [rsp-148h] [rbp-148h] __int64 (__fastcall **v10..
키야 ~~~~~~ 처음으로 퍼블먹어본 문제이다. 첫 퍼블과 동시에 처음으로 CTF에서 처음으로 포너블 올클해봤다. 쾌감... 일단 이문제 취약점은 off by one이다. 이거 알아내기까지 은근 삽질 많이했다. main을 보니까 메뉴를 선택해서 해당 역할을 수행하는것같다. 실행해보자. 대충 이렇습니다. 이제 각자 메뉴가 어떤일을 하는지 분석해봅시다. 먼저 1번 메뉴이다. 여기서 off by one이 터진다. 하지만 캐치해내기까지 꽤 걸렸다. 이부분은 이따가 3번 메뉴를 보면 off by one이 어떻게 익스플로잇과 연계되는지 알 수 있다. 저거 캐치한뒤에는 거의 10분안에 플래그 얻은것같다. 저기서 눈여겨봐야하는 부분이 qword_6020C0[i] 이부분과 qword_602120[i] = 32LL; 이부..
처음에 숫자를 입력받는다. 그리고 입력받은 숫자를 기반으로 다음 입력때 사용할 스택 주소를 연산하는것 같았다. 그리고 연산된 주소에다가 0x78만큼 입력받는다. 연산하는 부분을 어셈으로 보면 덧셈, 뺄셈, 곱셈, 시프트 연산 등을 하는걸 볼 수 있다. 우리는 연산된 주소와 ret까지의 offset이 0x78을 넘지 않도록 만들면 된다. 저걸 다 분석할수도 있지만 귀찮아서 그냥 -1넣어봤다. 그리고 gdb로 보니까 ret까지의 offset이 0x28이 나오는것이다. 그래서 그냥 -1넣고 진행하였다. 옆에보면 pop rax, rdi, rsi. rdx, syscall 전부 가젯을 제공해주는걸 알 수 있다. 따라서 저걸 사용해서 sysrop해서 /bin/sh기록하고 execve호출하면 되는것이다. 보니까 bss..
처음으로 풀어본 CTF힙문제이다. 고득점 문제여서 풀고나서 매우 뿌듯했다. 프로그램은 매우 간단했다. 원하는 사이즈로 청크를 할당받을 수 있고 해제할 수 있다. add함수는 전역변수에 우리가 입력한 사이즈만큼 malloc을 한다. view함수는 전역변수에 들어있는 값을 출력해주고 있었다. delete 함수는 전역변수를 free해준다, PS: The challenge uses the good old Ubuntu 18.04 libc ;) 문제에서도 이렇게 힌트를 주면서 double free가 그냥 된다는것을 알려주고 있다. 실제로 double free에 대한 검증이 없는 libc였다. 근데 full relro가 걸려있었다. 역시 호락호락하게 풀리게 주진 않는다... got overwrite가 불가능하니 fr..