LEVEL 5

iofile_vtable_check

pwnable
  • 문제 정보
  • 풀이 54
  • 난이도 투표 30
  • 질문 5
  • 최근 풀이자 243
  • 댓글 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

난이도 투표 30

질문 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일 만에 풀이 완료!

최근 풀이자 243

avatar
R4mbb
Open Beta Tester
avatar
Director-2ut
강의 수강: 1
avatar
oneorz
대표 업적 없음
yosimich
대표 업적 없음
brrb
대표 업적 없음
Bemanner
시스템 해킹 전문가
leilow
대표 업적 없음
leak
대표 업적 없음
chocovy
워게임: 1
avatar
pwnlife
대표 업적 없음

댓글 26

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