본문 바로가기

분류 전체보기

(267)
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" + "\..