ZINO
HomeResearchBlogTagsPlaygroundStackPortfolio
⌘K

레드팀 · AI 자동화 · 시스템 엔지니어링

직접 만들고, 실험하고, 기록한다

개인정보처리방침·이용약관

© 2026 ZINO LAB

← 태그 목록

Tag Archive

#pwntools

이 태그가 포함된 글을 최신순으로 모아봤어요.

8
posts
BLOG2026-07-22
[🥉 Bronze 1] 시그널 프레임을 직접 위조해 셸을 딴다 — DreamHack SigReturn-Oriented Programming 풀이
blog

[🥉 Bronze 1] 시그널 프레임을 직접 위조해 셸을 딴다 — DreamHack SigReturn-Oriented Programming 풀이

16바이트 버퍼 오버플로우와 gadget 하나(pop rax; syscall; ret)만 있으면 커널의 rt_sigreturn을 이용해 레지스터 전체를 통째로 위조할 수 있다. 셸코드도 ROP 체인도 없이, No PIE로 고정된 BSS 주소 하나만으로 스택 리크 없이 execve("/bin/sh")까지 도달한다.
#dreamhack#ctf#pwnable+5
 
BLOG2026-07-20
[🥉 Bronze 2] 1초 안에 덧셈 50번 — DreamHack addition-quiz 풀이
blog

[🥉 Bronze 2] 1초 안에 덧셈 50번 — DreamHack addition-quiz 풀이

서버가 alarm(1)로 1초마다 덧셈 문제를 내고 정답을 요구한다. 난수는 srand(time(NULL))이지만 예측할 필요가 없다 — 문제 자체(num1, num2)를 그대로 평문으로 출력해 주기 때문이다. 필요한 건 PRNG 역산이 아니라 recv-계산-send를 50번 반복할 스크립트뿐이다. 로컬 바이너리로 직접 재보면 50라운드 전체가 0.01초 안에 끝나 — 사람에게 허락된 50초의 5000분의 1이다.
#dreamhack#ctf#misc+4
BLOG2026-07-06
[🥈 Silver 4] 72바이트로 canary 넘어 리크, free_hook 하이재킹으로 쉘 — DreamHack fho 풀이
blog

[🥈 Silver 4] 72바이트로 canary 넘어 리크, free_hook 하이재킹으로 쉘 — DreamHack fho 풀이

read()로 정확히 72바이트만 보내 canary·saved rbp를 non-null로 덮되 return address는 건드리지 않으면, 뒤이은 printf("%s", buf)가 retaddr의 첫 null 바이트에서 멈추며 libc 주소 일부가 그대로 새어나온다. 여기에 문제가 기본 제공하는 임의주소 write/free 프리미티브를 얹어 __free_hook을 system으로 덮고 free("/bin/sh")를 부르면 그대로 쉘이 뜬다.
#dreamhack#ctf#pwnable+5
BLOG2026-07-05
[🥉 Bronze 4] 프로그램이 직접 알려주는 win() 주소 — DreamHack baby-bof 풀이
blog

[🥉 Bronze 4] 프로그램이 직접 알려주는 win() 주소 — DreamHack baby-bof 풀이

printf가 친절하게 win()의 주소를 그대로 출력해주고, 뒤이은 "값을 몇 번 쓸지" 입력은 스택 버퍼 크기와 아무 관계 없이 그 횟수만큼 8바이트씩 이어 쓴다. 리크된 주소를 그 값으로, 쓰기 횟수를 4로 주면 리턴 주소가 win()으로 바뀐다.
#dreamhack#ctf#pwnable+4
 
BLOG2026-06-25
[🥉 Bronze 4] gets() 한 줄로 리턴 주소를 read_flag로 — DreamHack basic_exploitation_001 풀이
blog

[🥉 Bronze 4] gets() 한 줄로 리턴 주소를 read_flag로 — DreamHack basic_exploitation_001 풀이

buf[0x80]에 길이 제한 없는 gets()가 입력을 받는다. 128바이트 버퍼에 saved EBP 4바이트를 더한 132바이트 뒤에 리턴 주소가 있고, 그 자리를 system("cat flag")를 부르는 read_flag() 주소로 덮으면 끝이다. 카나리도 PIE도 없어 오프셋과 주소가 그대로 고정인 교과서적 ret2win.
#dreamhack#ctf#pwnable+5
BLOG2026-06-23
[🥉 Bronze 4] execve 만 막힌 seccomp 안에서 ORW 셸코드로 flag 읽기 — DreamHack shell_basic 풀이
blog

[🥉 Bronze 4] execve 만 막힌 seccomp 안에서 ORW 셸코드로 flag 읽기 — DreamHack shell_basic 풀이

RWX 영역에 올린 셸코드를 그대로 실행해 주는데, seccomp 가 execve/execveat 만 KILL 한다. 셸은 못 따니 open-read-write 셸코드로 flag 파일을 직접 읽어 표준출력으로 흘려보낸다. 표준 경로 /home/shell_basic/flag 가 아니라 getdents64 로 디렉토리를 뒤져 진짜 이름을 찾아야 했다.
#dreamhack#ctf#pwnable+5
BLOG2026-06-23
[🥉 Bronze 4] 접속만 하면 바이너리가 플래그를 읽어 준다 — DreamHack welcome 풀이
blog

[🥉 Bronze 4] 접속만 하면 바이너리가 플래그를 읽어 준다 — DreamHack welcome 풀이

드림핵 포너블 탭의 첫 연습 문제. 익스플로잇은 없고, 서버에서 도는 welcome 바이너리가 스스로 /flag 를 열어 출력해 준다. 우리가 할 일은 nc 로 그 서비스에 붙어 출력을 받는 것뿐이다. 서버형 포너블이 어떻게 굴러가는지, 왜 바이너리를 내 컴퓨터에서 돌리면 segfault 가 나는지, 같은 일을 pwntools 로 스크립트화하면 어떻게 되는지까지 입문자 눈높이로 짚는다.
#dreamhack#ctf#pwn+4
BLOG2026-06-08
[🥉 Bronze 4] 경계 없는 배열 인덱스로 system 인자 바꿔치기 — DreamHack out_of_bound 풀이
blog

[🥉 Bronze 4] 경계 없는 배열 인덱스로 system 인자 바꿔치기 — DreamHack out_of_bound 풀이

command[idx]에 인덱스 검사가 없어 배열 밖 메모리를 포인터로 읽는다. 마침 command[19]가 우리가 채우는 전역 name 버퍼와 주소가 겹치니, name에 "/bin/sh를 가리키는 포인터"를 심으면 system("/bin/sh")가 그대로 호출된다. NX·카나리·No PIE 환경에서 셸코드도 RIP 덮어쓰기도 없이 셸을 딴다.
#dreamhack#ctf#pwnable+4