본문으로 바로가기

pwnable.xyz / Jmp table

category Wargame/pwnable.xyz 2020. 1. 13. 18:41
    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