벽돌 리스트 예시
-
카테고리 없음
Hcamp2022 Simple_Pwn Write up
코드를 먼저 보게되면 메뉴선택을 하고 1번을 선택할 경우 동적할당을해주고 buf에 name을 입력받는다 그 다음 v5변수에 내용을 입력받는다. 근데 코드를 다시보게되면 name입력받는 부분에서 오버플로우가 발생한다. 하지만 오버플로우가 크게 되지 않으므로 ret를 덮는 시나리오는 되지 않는다. 동적할당된 포인터를 덮는것은 가능하니 포인터를 덮어 원하는곳에 메모리 쓰기가 가능하다. 이런 과정들을 정리해서 시나리오를 짜게되면 1. 마지막 부분 puts에 인자값에 그대로 buf를 넣어주고있으므로 puts got를 printf plt 로 바꿈으로써 포멧스트링을 유도한다. 2. 포맷스트링으로 libc 를 leak 을 한 후 system 함수에 주소를 구한다. 3. 다시 puts got를 system 함수로 바꾸어..
-
카테고리 없음
Hcamp Discommunication Write up
복사가 가능한 만큼 size를 지정할 수 있고 원하는 곳에 메모리를 저장 할 수 있다. 이걸 이용해서 Exploit을 진행하면 된다. free got를 printf@plt+6 을 주고 leak을 한다음에 다시 free got를 system 주소로 변환 후 Exploit을 하면된다. 코드는 최대한 간단하게 하였고 익스플로잇을 좀 복잡하게 하고 싶었다. 그게 아마 잘 통한거 같기도 하고... #!/usr/bin/env python from pwn import * #p = process("./chall")\ p = remote("ctf-hackingcamp.com", 50505) #p = remote("localhost", 50505) context.log_level = "DEBUG" #pause() payl..
-
카테고리 없음
Virtualbox Escape CVE-2019-2525, CVE-2019-2548
환경 구성: host password : demon123 guest password : 123 Escape Full chain 짜기 위해서는 Memory Leak 이 먼저 필요하다. 그렇기 위해서 CVE-2019-2525 를 이용을 할 것이다. 일단 우리는 CVE를 분석을 하는것이기 때문에 어디서 취약점이 터지는지 알 수 있다. #CVE-2019-2525 "crUnpackExtendGetAttribLocation" 여기서 취약점이 발생한다. 일단 취약점이 무슨 함수에서 터지는지 알았으니 astrogrep 이라는 툴을 활용하여 어디에 존재하는지 찾아봐야한다. unpack_shaders.c 파일에서 취약점이 발생하는 것을 알 수 있다. 여기서 취약점이 발생을 한다고 한다. 일단 READ_DATA는 값을 읽는..
-
카테고리 없음
35C3 CTF krautflare Write up
일단 제가 이해한 내용을 적었습니다. 틀린 부분이 존재 할 수 있습니다. 먼저 .patch 파일을 총 3개를 주게 되는데 가장 중요한 피일인 revert-bugfix-880207.patch 파일을 보도록 하겠습니다. 먼저 위에를 보면 kMathexpm1 함수에 Return 값을 Number 에서 PlaneNumber또는 NaN 값으로 바꿔주고 있습니다. 이 정도만 가지고 취약점을 파악하기 힘드니 간단한 POC를 통해서 취약점을 알 수 있습니다. 간단한 소스코드 파일에 대한 설명입니다. 저희는 compiler 라는 디렉토리 안에 존재하는데 typer.cc 파일을 바꿨으니 Turbofan이 작동되야지 이 소스코드가 적용이 된다는 것을 알 수 있습니다. 또한 typer.cc 에 의미를 알았으니 디핑 된 파일이..
-
카테고리 없음
v8 turbolizer install & used
#Install env : Ubuntu 18.04 해보니까 16.04는 안됬다. v8이 빌드 된 상태에서 v8 디렉토리 들어 간 후 curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - sudo apt-get install -y nodejs sudo apt-get install npm cd ~/v8/v8/tools/turbolizer npm i npm run-script build 이런식으로 빌드를 진행하면 된다. 잘 됬는지 확인하는방법은 마지막 라인에 created build/turbolizer.js in 6.5s 이거 비슷한게 있으면 성공 한거다. Use 구글링을 좀 해보니 turbolizer 는 Chrome 환경에서 진행하는게 더 좋다고 ..
-
카테고리 없음
diceCTF flippidy Write up
취약점은 어렵지 않게 찾을 수 있었다. 처음에 size를 홀수 를 주게되면 더블프리가 생기므로 원하는곳에 Write가 가능하다. 근데 여기서 메모리 보호기법이 씨게 걸려있어서 GOT Overwrite가 불가능하다. 그래서 첫번쨰로 생각한 익스 방법은 libc를 덮는 방법이였다. 첫번째 size줄때 홀수인데 사이즐 엄청 크게하면 libc아래에 공간을 할당되게 되는데 여기서부터 libc오프셋을 구한다음 size에 큰 값으로 주작을 쳐서 libc를 덮는 겄이였다. 근데 일단 Heap에는 실행권한이 존재하지 않았다 그래서 stdout을 덮을려고 했는데 생각해보니 flags 와 file no 을 못맛춰줘서 Leak 이 불가능하다. 여기까지 생각해보다가 난 여행을 떠나버렸다... 그래서 지금 짬을 내서 문제를 처음..
-
카테고리 없음
Codegate2020 babyllvm Write up
간단하게 설명하면 llvmlite를 이용하여 Brainfuck 구현해 놓았다. llvmlite.readthedocs.io/_/downloads/en/stable/pdf/ llvm 관련된 pdf를 보고 분석을 하였다. Compile 함수에서 codegen 을 실행하여 동작하게 되는데 여기서 rel_pos 를 0으로 맟춰준다. 이걸 좀 이용하면 Whiltelist_cpy 튜플을 0으로 맟춰줄 수 있다. 그래서 이걸 이용하여 OOB가 가능하다. #!/usr/bin/env python from pwn import * p = process("./main.py") #pause() payload = ">" payload += "[>> ", ">>.") p.interactive()
-
카테고리 없음
bamboofoxCTF2021 babystack Write up
주말에 놀다가 CTF에 늦게 참여해서 1문제 풀고 잤다. 어렵지 않은 문제였다. 코드도 짧고 취약점도 쉽게 발견된다. 일단 스택을 초기화 해주지 않고있고, strlen 으로 사이즈를 빼주고있다. strlen 은 \x00 으로 쉽게 우회가 가능하다 이걸 이용해서 sfp 까지 덮을 수 있다 익스 시나리오를 짜면 일단 스택에 canary 값과 stack 주소들이 있는데 이걸 leak 한다. 근데 여기서 중요한게 서버가 19.04 인데 이게 스택에 libc를 leak 할수 있는곳이 없다 그래서 어떻게 해야하냐면 SFP를 read ret에 스택 주소로 바꾸면 이제 다음 read를 호출할때 그 스택에 인풋이 가능하다. 그걸로 pop rbp 가젯을 이용한 후 0x00000000004011E5 이 주소로 점프 뛴 후 ..
-
카테고리 없음
CISCN2017 babydriver Write up
요즘 커널에 푹 빠져있는데 재밌게 푼 문제이다. 일단 실행방법이랑 이런거 다 알고 있는 상태에서 해 보도록 하겠다. 이렇게 함수들이 존재하는데 분석을 해보면 쉽게 알 수 있듯이 babywrite 와 babyread 는 일반 Read와 큰 차이가 없다. 여기서 보면 전역변수 하나로 heap 을 관리해주고 있는데 여기서 취약점이 발생한다. heap 2개를 생성하면 결국 전역변수는 마지막에 생성한 걸 가르키고 있다. 그리고 close 를 보게되면 free를 해주지만 전역변수를 초기화를 해 주지 않는다. 또한 ioctl 함수로 원하는 사이즈 만큼 heap 할당이 가능하다. 대충 익스 시나리오를 짜보면 2개 힙을 할당 해 준 후 둘다 똑같은 포인터를 가르키고 있으니까 UAF가 가능하다. 이걸 이용하여 원하는 사이..
-
카테고리 없음
*CTF oob-v8 Write up
많은 코드들이 바뀌어져 있는데 함수가 저의되어있는 부분만 보면 되겠습니다. 코드를 보게되면 인자가 1개 존재할 경우 배열에 길이를 갖고와서 리턴을 해주는데, 여기서 취약점이 발생합니다. 배열은 0번째부터 시작인데 만약 배열 하나를 생성하고 이 함수를 실행시켜주면 그 값이 있는 바로 뒤에 존재하는 메모리를 읽거나 쓰게 됩니다. 배열에 사이즈는 2입니다. 만약 배열의 두번쨰를 보고 싶으면 배열은 0번쨰부터 시작하니까 1값을 읽어야 합니다. 하지만 oob 함수에서 -1을 해주지 않으므로 2.2 뒤에있는 임외의 메모리를 읽을수 있게 됩니다. oob write도 맟찬가지 입니다. 이제 직접적으로 볼 수 있게 Memory 를 통해서 봅시다. 이런식으로 먼저 생성한 후 맟찬가지로 gdb 를 통하여 보겠습니다. 이 버..
-
카테고리 없음
RealWorldCTF2020 MoP2021 Write up
이번에 MoP2021 하나라도 풀어서 정말 다행이라고 생각했다. 이 문제 덕분에 중간에 12등까지 올라왔지만 끝나고보니 엄청 떨어져있었다... 그래도 빨리 풀어서 만족이라고 생각한다 일단 문제를 보면 php 명령어를 그대로 실행하는데 php RCE라는거를 대충 예상 할 수 있다. 팀원 분 한분이 php 버전에 맞는 UAF Exploit 을 찾아주셔서 그걸로 Reverse Shell 을 땄다. 이걸로 Reverse Shell 을 따게되면 이제 /readflag 를 실행시켜서 플래그를 읽어야되는데, 이게 readflag 를 보게되면 순식간에 입력을 받고 끊어버리게된다. 그래서 pwntools 를 이용하여 해봤는데 되지를 않았다. 아마 딜레이 때문에 그런거같은데 거기서 생각해낸게 /tmp 에 들어가서 파일을 ..
-
카테고리 없음
hitcon2020 Pwnable_Revenge of Pwn Write up
대회중에 유일하게 감을 잡은 문제이다. 문제 방식이 엄청 특이했는데, 고정된 바이너리를 가지고 우리가 올리는 바이너리로 익스를 하는것이다. 고정된 익스를 보면 listen 을 하고 쉘코드를 이용해 붙어주는 것을 알 수 있다. 그래서 생각했던게 우리가 원하는 바이너리에 동작중에 connect 를 바이너리 쪽에서 해줘서 쉘코드를 넣어버리면 되는것이 아닌가 라고 생각했다. 그래서 쉘코드를 짜는데 stk 변수와 다른것들을 어케 해야될지 몰라서 계속 코딩하다 끝나버렸다. 그래서 끝나고 보니 pwntools에서 make elf라는 모듈을 지원하고 있었고 그냥 쉘코드 갖다 붙여넣기 했으면 풀리는 문제였다. from pwn import * context.arch = 'amd64' stk = "stack address ..
-
카테고리 없음
DimiCTF 2017 REV50
로직 간단함 갖고와서 비교하는거임 부르트포싱 하면 됩니당 from ctypes import * import string ida_char = [0x4D, 0xCB, 0xC3, 0xBB, 0x19, 0x0A, 0x1A, 0x7F, 0x50, 0xF8, 0x18, 0x08, 0x89, 0xC1, 0xA8, 0xCF, 0xBA, 0xBE, 0xEC, 0x75, 0x90, 0xE2, 0x23, 0x6D, 0xA4, 0xB7, 0x35, 0xF5, 0xD1, 0x9A, 0x32, 0x1A] libc = CDLL('msvcrt') flag = "" libc.srand(0x3FD1CC7) for i in range(len(ida_char)): v5 = libc.rand() % 256 for j in string.pri..
-
카테고리 없음
picoCTF 2018 keygen-me-2 Write up
z3 쓰는 괜찮은 문제인거같아서 가져왔다 리버싱 공부좀 해야지 이거보면 return 이 대충 0부터 시작하고 35까지 하는걸 알수 있다. 이 스테이지 전부다 통과해야되니까 결국 z3돌리라는 말이다. from z3 import * def m(a, b): return If(a % b >= 0, a % b, a % b + b) s = Solver() v = [] for i in range(16): e = Int('v'+str(i)) v.append(e) s.add(e >= 0) s.add(e
-
카테고리 없음
Layer7CTF2020 Pwnable_L7VM Write up
되게 재밌게 본 문제다. 일단 리버싱은 풀었는데 리버싱 기반으로 취약점 하나하나 분석해나가는데 버퍼오버플로우는 찾았는데 Leak부분을 못찾아서 매우 골머리를 앓고 있었다. 그러던 와중에 대회가 끝나버리고 mov 쪽에서 언인텐이 터진다는걸 알았다 ㅋㅋ.. 그래서 바로 그 부분 확인하고 Leak 한다음에 원가젯으로 풀었다. 문제가 되는 코드이다 || 연산을 해줘야 되는데 && 연산을 하고 있다. 내가 이걸 왜 대회중에 눈치를 못챘을까... 그래서 이거로 7058에 Leak 포인터 넣고 write로 leak 한다음에 여기서 OOB터지는데 이걸로 원가젯을 날려줬다. 0xe6aee execve("/bin/sh", r15, r12) constraints: [r15] == NULL || r15 == NULL [r12..
-
카테고리 없음
asisCTF2020 tthttpd Write up
이 문제도 적절히 쉽다. 처음에 여기 부분이 오버플로우 터져서 EIP바꾸는건줄 알았는데 exit로 끝내서 어떻게 할까 고민하다가 그냥 입력값을 검사하는걸 알았다. 그래서 여기 부분에 있는 readlie을 오버플로우 시켜서 /etc/passwd부분을 넣었더니 /etc/passwd가 출력되길래 flag.txt로 바꿔주더니 풀렸다. #!/usr/bin/env python #-*- coding:utf-8 -*- from pwn import * #p = process("./tthttpd") p = remote("76.74.170.193",9006) binf = ELF("./tthttpd") #context.log_level = "DEBUG" pause() payload = "GET /index.html" + "\..
-
카테고리 없음
asisCTF2020 Invisible Write up
포너블 쉬운문제 말고 솔버 30이하 문제들만 다룰려고 한다. 이 두문제도 풀고싶지만 아직 실력이 안되서 못풀었다. 특히 사파리 문제는 브라우저 익스플로잇인거같은데 나중에 꼭 풀어보고싶다. 일단은 invisible이랑 tthttpd문제를 다룰려고 한다. 그냥 솔버 적어서 하는거다. 일단 realloc이 존재하고 free가 존재하는데 realloc으로 free가 가능하다. 이걸로 fastbin dup이 가능한데 이걸로 got_overwrite를 해서 free를 printf로 바꿔준다. 그 다음 Leak을 진행해서 다시 fastbin dup으로 system을 Leak 해준 다음에 다시 GOt_overwrite를 해주면 풀리는 문제이다 pwnable.tw realloc을 풀어봤으면 쉽게 풀리는 문제다 #!/us..
-
카테고리 없음
TokyoWesternsCTF neighbour Write up
여기를 보면 rbp-0x8에서 stream 을 꺼내서 쓰고있는 이걸 while문에서 항상 이것을 사용한다. 즉 우리는 stream쪽을 우리가 원하는 값으로 바꿀수 있게 되는데, 이제 이걸 어케하냐? 일단 들어가기전에 stderr이걸 알아야되는데 fprintf에서 stream 을 stderr이것으로 받고 있어서서버에 접속하게 되면 Leak 이 되지 않게 된다. stderr 은 __iO_file 넘버에서 가져오게되는데 결국 write(stderr->_fileno, buf, size); 이런식으로 받는다는거다 그럼 _FILENO넘버를 stdout으로 바꿔주면 출력이 될것이다 대충 부르트포싱 섞어주면 풀리는 문제다
-
카테고리 없음
windows exploit tech buffer overflow(non aslr, DEP off);
일단 ASLR을 끄고 DEP도 끈 상태에서 진행을 하겠다. 처음 해보는 windows exploit인데 나름 재밌게 진행했다. 일단 취약점 코드는 이런식이다. #include #include #include int main(int argc, char* argv[]) { char readbuf[2000] = {0,}; char printbuf[500] = {0,}; printf(" # text reader # \n"); if(argc!=2) { printf(" Usage : reader.exe filename\n", argv[0]); exit(1); } FILE *stream = fopen(argv[1], "r"); fgets(readbuf, 2000, stream); strcpy(printbuf, rea..
-
카테고리 없음
defenitCTF 2020 pwnable base64 Write up
일단 대회중에는 못푼 문제이다. 시험기간이라 공부하랴 문제풀려 할것도 참 많았다. 문제 소스는 robots.txt 를 보면 쉽게 알 수 있었다. 그래서 대회 끝나고 더 풀어보는데 어느정도 리버싱은 다 되었고 레지스터들 까지 바꾸는거 까지 성공했다. 이제 그러면 어떻게 했는지 보자 일단 여기서 보면 여기가 대충 메인이라는 느낌이 나서 함수 이름을 바꿨다 그리고 다른것도 내가 생각하는거에 맟춰서 변경했다. 그럼 이제 read를 보면 0x1000 을 입력을 받는다는것을 알 수 있다. 그럼 이제 output이 나올것이다. 그리고 대충 gdb로 디버깅을 해보았는데 encode에서 레지스터가 막 바뀌면서 터지는 것을 알수 있었다. 우리가 인코딩한 값이 레지스터에 들어가게된다. 그러면 우리는 ret쪽에서 우리가 원하..