Tag Archive

#buffer-overflow

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

15
posts
BLOG2026-08-09
[🥉 Bronze 3] ARM32 스택 오버플로로 pc 를 직접 갈아끼우기 — DreamHack Arm Training-v1 풀이
blog

[🥉 Bronze 3] ARM32 스택 오버플로로 pc 를 직접 갈아끼우기 — DreamHack Arm Training-v1 풀이

x86 의 ret 이 없는 ARM32에서는 함수 에필로그가 pop 으로 fp 와 pc 를 한꺼번에 복원한다. 저장된 lr 을 덮으면 그 값이 검사 없이 그대로 pc 가 된다. 24바이트 뒤 반환주소를 shell() 로 바꿔 system("/bin/sh") 를 호출하고, read(0, buf, 200) 가 셸 명령까지 삼켜버리는 함정은 payload 를 정확히 200바이트로 맞춰 넘긴다.
#dreamhack#ctf#pwnable+6
 
BLOG2026-07-20
[🥉 Bronze 4] 80바이트 버퍼에 128바이트를 채워 tmp_fd를 훔친다 — DreamHack awesome-basics 풀이
blog

[🥉 Bronze 4] 80바이트 버퍼에 128바이트를 채워 tmp_fd를 훔친다 — DreamHack awesome-basics 풀이

chall.c 는 flag 를 읽어 지역변수 tmp_fd 가 가리키는 파일에 쓰기만 할 뿐, 그 결과를 우리에게 보여주는 코드가 없다. 그런데 바로 위에서 read(stdin, buf, 0x80) 이 buf[80] 보다 48바이트 더 받는다. 이 여유분으로 buf 바로 뒤에 붙어 있는 tmp_fd 를 표준출력(1)으로 덮으면, 뒤이은 write(tmp_fd, flag, 0x45) 가 그대로 우리 화면에 flag 를 찍어준다.
#dreamhack#ctf#pwn+4
 
BLOG2026-07-07
[🥉 Bronze 3] 반환 주소 대신 "열 파일 이름"을 덮는다 — DreamHack bof 풀이
blog

[🥉 Bronze 3] 반환 주소 대신 "열 파일 이름"을 덮는다 — DreamHack bof 풀이

scanf("%144s") 로 스택 버퍼를 넘치는 전형적인 오버플로 문제. 그런데 덮을 것은 반환 주소가 아니다. 버퍼 바로 아래에 read_cat() 이 open() 할 파일명 "./cat" 이 놓여 있어서, 그 자리를 "flag" 로 덮으면 프로그램이 알아서 flag 파일을 열어 출력한다. 버퍼와 파일명 사이 거리 0x80 만 맞추면 끝.
#dreamhack#ctf#pwn+5
 
BLOG2026-07-06
[🌱 새싹] strncmp 는 앞 8바이트만 본다 — DreamHack cmd_center 풀이
blog

[🌱 새싹] strncmp 는 앞 8바이트만 본다 — DreamHack cmd_center 풀이

"ifconfig" 로 초기화된 명령 버퍼를 그대로 system() 에 넘기는 바이너리. 바로 옆 24바이트 지역 변수에 read 로 100바이트를 받아주는 탓에, 그 버퍼를 넘쳐서 명령 문자열 뒷부분에 세미콜론으로 원하는 명령을 이어붙일 수 있다. strncmp 가 앞 8글자("ifconfig")만 검사한다는 게 이 문제의 전부다.
#dreamhack#ctf#pwn+5
 
BLOG2026-06-30
[🥉 Bronze 1] 카나리 흘리고 system 으로 되돌아가기 — DreamHack Return to Library 풀이
blog

[🥉 Bronze 1] 카나리 흘리고 system 으로 되돌아가기 — DreamHack Return to Library 풀이

NX 가 켜져 스택 셸코드를 못 쓰는 BOF 문제. 첫 read 뒤 printf("%s") 가 카나리 LSB(\x00) 만 덮으면 상위 7바이트를 흘려준다. 그걸로 카나리를 복원하고, 두 번째 read 오버플로우로 pop rdi → "/bin/sh" → system@plt 로 이어지는 ret2plt 체인을 올려 셸을 띄운다. 바이너리가 처음에 system 을 한 번 호출해 줘서 PLT 가 이미 채워져 있는 게 포인트.
#dreamhack#ctf#pwn+6
 
BLOG2026-06-27
[🥉 Bronze 2] OOB read 로 카나리 흘려보고 BOF 로 셸 — DreamHack ssp_001 풀이
blog

[🥉 Bronze 2] OOB read 로 카나리 흘려보고 BOF 로 셸 — DreamHack ssp_001 풀이

스택 카나리가 켜진 32비트 BOF 문제. (P)rint 메뉴의 box[idx] 가 인덱스 검사를 안 해 OOB read 가 되고, box 기준 +0x80 위치에 있는 카나리 4바이트를 그대로 읽어올 수 있다. 카나리를 복원한 뒤 (E)xit 메뉴의 read(name, name_len) 길이 무제한 오버플로우로 카나리를 그대로 채우고 반환 주소를 get_shell 로 덮어 셸을 잡는다.
#dreamhack#ctf#pwn+6
 
BLOG2026-06-26
[🥉 Bronze 3] 카나리 흘려보고 스택에 셸코드 심기 — DreamHack Return to Shellcode 풀이
blog

[🥉 Bronze 3] 카나리 흘려보고 스택에 셸코드 심기 — DreamHack Return to Shellcode 풀이

NX 가 꺼져(스택 RWX) 있지만 스택 카나리가 켜진 BOF 문제. read 뒤의 printf("%s") 가 카나리의 LSB(\x00) 를 덮으면 상위 7바이트를 흘려주고, 그걸로 카나리를 복원한다. 그다음 gets() 무제한 오버플로우로 스택에 셸코드를 올리고 카나리를 그대로 채운 뒤 반환 주소를 buf 로 돌려 ret2shellcode 로 셸을 띄운다.
#dreamhack#ctf#pwn+6
 
BLOG2026-06-25
[🥉 Bronze 4] 반환 주소를 get_shell 로 덮는다 — DreamHack Return Address Overwrite 풀이
blog

[🥉 Bronze 4] 반환 주소를 get_shell 로 덮는다 — DreamHack Return Address Overwrite 풀이

scanf("%s") 로 스택 버퍼를 넘쳐 반환 주소를 덮는, pwnable 입문의 정석. NX 가 켜져 있어 스택 셸코드는 못 올리지만 바이너리 안에 execve("/bin/sh") 를 부르는 get_shell 함수가 이미 있다. 반환 주소를 그 함수 주소로 덮어 흐름을 가져오는 코드 재사용(ret2win) 기법으로 셸을 띄운다.
#dreamhack#ctf#pwn+5
 
BLOG2026-06-25
[🥉 Bronze 2] scanf 가 셸코드를 잘라먹는다 — DreamHack basic_exploitation_000 풀이
blog

[🥉 Bronze 2] scanf 가 셸코드를 잘라먹는다 — DreamHack basic_exploitation_000 풀이

buf 주소를 친절히 누출해 주고 scanf 로 스택을 넘치게 하는 전형적인 스택 셸코드 문제. 그런데 교과서 execve 셸코드를 그대로 쓰면 동작하지 않는다. scanf("%s") 가 셸코드 안의 0x0b(SYS_execve) 를 공백으로 보고 거기서 잘라먹기 때문. 0x0b 바이트 없이 11을 만들어 우회하고, 누출된 buf 주소로 점프해 셸을 띄운다.
#dreamhack#ctf#pwn+5