LEVEL 1

hook

pwnable
  • 문제 정보
  • 풀이 110
  • 난이도 투표 58
  • 질문 15
  • 최근 풀이자 1346
  • 댓글 59

문제 설명

Desciption

이 문제는 작동하고 있는 서비스(hook)의 바이너리와 소스코드가 주어집니다.
프로그램의 취약점을 찾고 _hook Overwrite 공격 기법으로 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요.
"flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{...} 입니다.

Environment
Ubuntu 16.04
Arch:     amd64-64-little
RELRO:    Full RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      No PIE (0x400000)
Reference

_hook Overwrite

Challenge Updates

2023.04.27: libc 파일이 변경되었습니다.
2023.04.27: Dockerfile이 제공됩니다.

출제자 정보

avatar
Dreamhack
대표 업적 없음

First Blood!

avatar
JSec
Dreamhack Beta CTF 1위
출제된 지 15시간 만에 풀이 완료!

난이도 투표 58

질문 15

문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
문제는 풀었지만 이상한 것 같아서 질문합니다.
문제 푸는 형식은 libc_base를 구하고 free_hook 주소를 계산 2-1. one_gadget을 이용하여 가젯을 사용하거나 2-2. main에 있는 system("/bin/sh") 호출하는 주소를 free_hook 포인터 변수에 담는다. 이런 식으로 풀었는데 문제는 페이로드 작성 후 send할 때 값이 원하는 의도대로 전달되지 않았습니다. payload = p64(free_hook) + p64(main_system) #혹은 one_gadget 처음에 위와 같이 페이로드를 작성하였습니다. free_hoox = 0x7fe5716318e8 main = 0x400a11 이라고 했을 때 malloc(size)로 할당받은 힙 영역에는 '\xe8\x18cq\xe5\x7f\x00\x00\x11\n@\x00\x00\x00\x00\x00' 이 들어가길 원했는데 맨 앞에 있는 '\xe8'이 없어지고 한 칸씩 앞으로 당겨진 값이 들어가졌습니다. 즉 '\x18cq\xe5\x7f\x00\x00\x11\n@\x00\x00\x00\x00\x00'이 들어가졌습니다. 그래서 원래 의도는 0x7fe5716318e8 주소에 0x400a11 값을 넣는거였는데 디버깅을 해보니 0x1100007fe5716318 주소를 참조하더라구요. 그래서 에러가 납니다. 그래서 일단은 페이로드 맨 앞에 '\x00'을 붙이니 성공하긴 하는데 왜 이런 일이 발생하는 지 궁금합니다. 아래는 attack.py 에서 제가 send를 이용해서 데이터 보낸 형식입니다. p.send(str(400)) p.send(payload) p.interactive() 질문 처음에는 스스로 풀었는데 계속 안되길래 다른 라이트업을 봐도 다들 저랑 비슷하게 작성했는데 왜 저만 이런 결과가 나오는 걸까요? 추가로 one_gadget이 여러 개 있던데, 어떤 건 되고 어떤 건 안됩니다. 예를 들어 로컬에서는 3번째 one_gadget_offset만 적용되고 원격에서는 2번째 one_gadget_offset만 적용이 됩니다. 그 이유를 알 수 있을까요?
avatar IRev

최근 풀이자 1346

maang
전자두뇌
avatar
HSon
대표 업적 없음
hansanggi
.HACK 2024 참가자
eheka78
대표 업적 없음
808_ghost
대표 업적 없음
hojune02
대표 업적 없음
avatar
Rootsquare
대표 업적 없음
nvkiero
대표 업적 없음
동욱뀨
대표 업적 없음
곰탕곰탕
대표 업적 없음

댓글 59

avatar
스카이넷
워게임 고인물
ez
yuhell
시스템 해킹 입문
ez
avatar
santa6
대표 업적 없음
두 번 만에 풀었다!!
catpwn
대표 업적 없음
*(long *)* ptr = *(ptr+1) 이게 뭔지 몰라서 오래 걸림.....
avatar
KnightChaser
공부벌레
이 문제는 여러분이 C언어 포인터를 얼마나 성실하고 제대로 배웠는지 뜨겁고 사랑스럽게 테스트 해 줄 겁니다.
avatar
나는재영
대표 업적 없음
avatar
Rosieblue
워게임 고인물
포인터 막 있는 그 문장?만 해석하면 풀 수 있슴당! 포인터 헷갈리면 그림그려서 하면 좀 이해가 쉬워용ㅎㅎ 복습하는 기회였습니다 ㅎㅎ
avatar
wonu
대표 업적 없음
gg
avatar
연어초밥
공부벌레
뭔가 어쩌다 된 느낌...
De1fin
대표 업적 없음
good