LEVEL 5

iofile_vtable_check

pwnable
  • 문제 정보
  • 풀이 58
  • 난이도 투표 42
  • 질문 5
  • 최근 풀이자 275
  • 댓글 26

문제 설명

Description

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

Environment
Ubuntu 18.04
Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x400000)
Reference

_IO_FILE

난이도 투표 42

질문 5

문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
libio_vtable은 뭔가요??
강의에 있는 str_overflow를 확인하기 위해서 vtable을 메모리에서 보면 gdb-peda$ x/40gx 0x00007ffff7dcc2a0 0x7ffff7dcc2a0 <_IO_file_jumps>: 0x0000000000000000 0x0000000000000000 0x7ffff7dcc2b0 <_IO_file_jumps+16>: 0x00007ffff7a70330 0x00007ffff7a71300 0x7ffff7dcc2c0 <_IO_file_jumps+32>: 0x00007ffff7a71020 0x00007ffff7a723c0 0x7ffff7dcc2d0 <_IO_file_jumps+48>: 0x00007ffff7a73c50 0x00007ffff7a6f930 0x7ffff7dcc2e0 <_IO_file_jumps+64>: 0x00007ffff7a6f590 0x00007ffff7a6eb90 0x7ffff7dcc2f0 <_IO_file_jumps+80>: 0x00007ffff7a72990 0x00007ffff7a6e850 0x7ffff7dcc300 <_IO_file_jumps+96>: 0x00007ffff7a6e6d0 0x00007ffff7a62100 0x7ffff7dcc310 <_IO_file_jumps+112>: 0x00007ffff7a6f910 0x00007ffff7a6f190 0x7ffff7dcc320 <_IO_file_jumps+128>: 0x00007ffff7a6e910 0x00007ffff7a6e840 0x7ffff7dcc330 <_IO_file_jumps+144>: 0x00007ffff7a6f180 0x00007ffff7a73dd0 0x7ffff7dcc340 <_IO_file_jumps+160>: 0x00007ffff7a73de0 0x0000000000000000 0x7ffff7dcc350: 0x0000000000000000 0x0000000000000000 0x7ffff7dcc360: 0x0000000000000000 0x0000000000000000 0x7ffff7dcc370: 0x00007ffff7a74300 0x00007ffff7a73f60 <--- _IO_str_overflow 0x7ffff7dcc380: 0x00007ffff7a73f00 0x00007ffff7a723c0 0x7ffff7dcc390: 0x00007ffff7a742e0 0x00007ffff7a72420 0x7ffff7dcc3a0: 0x00007ffff7a725d0 0x00007ffff7a74430 0x7ffff7dcc3b0: 0x00007ffff7a72990 0x00007ffff7a72860 0x7ffff7dcc3c0: 0x00007ffff7a72c50 0x00007ffff7a72a00 0x7ffff7dcc3d0: 0x00007ffff7a73db0 0x00007ffff7a73dc0 vtable symbols로 표시된 곳 뒤쪽에 str_overflow가 있더라구요. 그리고 glibc 소스에서 vtable 선언을 보면 struct _IO_jump_t { JUMP_FIELD(size_t, __dummy); JUMP_FIELD(size_t, __dummy2); JUMP_FIELD(_IO_finish_t, __finish); JUMP_FIELD(_IO_overflow_t, __overflow); JUMP_FIELD(_IO_underflow_t, __underflow); JUMP_FIELD(_IO_underflow_t, __uflow); JUMP_FIELD(_IO_pbackfail_t, __pbackfail); /* showmany */ JUMP_FIELD(_IO_xsputn_t, __xsputn); JUMP_FIELD(_IO_xsgetn_t, __xsgetn); JUMP_FIELD(_IO_seekoff_t, __seekoff); JUMP_FIELD(_IO_seekpos_t, __seekpos); JUMP_FIELD(_IO_setbuf_t, __setbuf); JUMP_FIELD(_IO_sync_t, __sync); JUMP_FIELD(_IO_doallocate_t, __doallocate); JUMP_FIELD(_IO_read_t, __read); JUMP_FIELD(_IO_write_t, __write); JUMP_FIELD(_IO_seek_t, __seek); JUMP_FIELD(_IO_close_t, __close); JUMP_FIELD(_IO_stat_t, __stat); JUMP_FIELD(_IO_showmanyc_t, __showmanyc); JUMP_FIELD(_IO_imbue_t, __imbue); #if 0 get_column; set_column; #endif }; /* We always allocate an extra word following an _IO_FILE. This contains a pointer to the function jump table used. This is for compatibility with C++ streambuf; the word can be used to smash to a pointer to a virtual function table. */ struct _IO_FILE_plus { _IO_FILE file; const struct _IO_jump_t *vtable; }; IO_jump_t 구조체가 vtable인데, 이 안에는 str_overflow가 안보이네요. 그래서 찾아보니까 str_overflow가 있는 소스 아래에 const struct _IO_jump_t _IO_str_jumps libio_vtable = { JUMP_INIT_DUMMY, JUMP_INIT(finish, _IO_str_finish), JUMP_INIT(overflow, _IO_str_overflow), JUMP_INIT(underflow, _IO_str_underflow), JUMP_INIT(uflow, _IO_default_uflow), JUMP_INIT(pbackfail, _IO_str_pbackfail), JUMP_INIT(xsputn, _IO_default_xsputn), JUMP_INIT(xsgetn, _IO_default_xsgetn), JUMP_INIT(seekoff, _IO_str_seekoff), JUMP_INIT(seekpos, _IO_default_seekpos), JUMP_INIT(setbuf, _IO_default_setbuf), JUMP_INIT(sync, _IO_default_sync), JUMP_INIT(doallocate, _IO_default_doallocate), JUMP_INIT(read, _IO_default_read), JUMP_INIT(write, _IO_default_write), JUMP_INIT(seek, _IO_default_seek), JUMP_INIT(close, _IO_default_close), JUMP_INIT(stat, _IO_default_stat), JUMP_INIT(showmanyc, _IO_default_showmanyc), JUMP_INIT(imbue, _IO_default_imbue) }; vtable과 약간만 다른 libio_vtable이란게 있고 이 안에 str_overflow가 있더라구요. 맨 처음에 메모리에서 봤던 vtalbe 뒤에 있는 영역이 libio_vtable 같은데 무슨 차이일까요?? 뭔가 파일에다가 처리하는 vtable, 문자열 대상으로 처리하는 vtable 이런 식으로 나눠진 것 같은데.
bob8gook
LEVEL 5

iofile_vtable_check

pwnable

출제자 정보

avatar
Dreamhack
대표 업적 없음

First Blood!

avatar
mhibio
CTF 초보자
출제된 지 2일 만에 풀이 완료!

최근 풀이자 275

c0met
.HACK 2025 참가자
avatar
sykyle46
대표 업적 없음
PUPU
대표 업적 없음
ucanca
시스템 해킹 전문가
kwww
대표 업적 없음
shpark1104
Perfect 10
avatar
ArcusTen
대표 업적 없음
cmdking
Perfect 10
avatar
Strangek
대표 업적 없음
lvrobin
대표 업적 없음

댓글 26

oog
대표 업적 없음
난이도에 겁만 안 먹으면 될 듯합니다..
iank
워게임 고인물
오프셋이 안맞아서 고치는데 한 디버깅 작업이 아주 재밌는 문제였습니다.
avatar
Kon
워게임: 1
Yaaaaaammmmmmmmymyyyyy
avatar
바나나김치
워게임 고인물
.
avatar
Jmini
공부벌레
뿌듯,,
make_s0me_noise
강의 수강: 10
로안리돼,,,,,
avatar
m0nd2y
시니어
항상 좋은 문제 감사합니다
Kongr
워게임 풀이: 50
funfunpwn
Karatus
워게임: 50
조건을 잘 봅시당
avatar
Crescendo0709
강의 수강: 10
슬슬 까다로워지는 단계