n = read_long();
if ( n <= 4 ) vtable[n](); else puts("Invalid."); |
입력받은 정수를 index로 함수 포인터 배열에 있는 함수를 실행한다.
.data:00000000006020B0 public size
.data:00000000006020B0 ; size_t size .data:00000000006020B0 size dq 1 ; DATA XREF: do_malloc+1E↑w .data:00000000006020B0 ; do_malloc+25↑r ... .data:00000000006020B8 public heap_buffer .data:00000000006020B8 ; void *heap_buffer .data:00000000006020B8 heap_buffer dq 1 ; DATA XREF: do_malloc+3F↑w .data:00000000006020B8 ; do_malloc+50↑w ... .data:00000000006020C0 public vtable .data:00000000006020C0 ; void (__fastcall *vtable[5])() .data:00000000006020C0 vtable dq offset do_exit ; DATA XREF: main+4E↑o .data:00000000006020C0 ; main+55↑r .data:00000000006020C0 dq offset do_malloc .data:00000000006020C0 dq offset do_free .data:00000000006020C0 dq offset do_read .data:00000000006020C0 dq offset do_write |
n
을 검사하는 과정에서 음수는 막지 않기 때문에 vtable
이 위치한 0x6020C0 이전 주소에 있는 값을 사용할 수 있다. vtable
이전 영역에서 자유롭게 값을 쓸 수 있는 곳은 0x6020B0 에 위치한 size
가 있으며, 이 값은 do_malloc
함수에서 수정할 수 있다.
먼저 do_malloc
에서 _
의 주소 0x400A31을 크기로 넣어주고 -2를 보내주면 플래그가 나온다.
Last update: 10/23/2020
'Wargame > pwnable.xyz' 카테고리의 다른 글
pwnable.xyz / Game (0) | 2020.01.13 |
---|---|
pwnable.xyz / l33t-ness (0) | 2020.01.13 |
pwnable.xyz / TLSv00 (0) | 2020.01.13 |
pwnable.xyz / Free Spirit (0) | 2020.01.13 |
pwnable.xyz / two targets (0) | 2020.01.13 |