Tags: python programming

Rating: 5.0

# CSAW 2016 Quals
# coinslot
##### Brad Daniels -- USF Whitehatter's Computer Security Club
##### misc -- 25 points
## Description

\#Hope \#Change \#Obama2008

nc misc.chal.csaw.io 8000

## Solution
The server gives us the following.
~~~
sh$nc misc.chal.csaw.io 8000$0.03
$10,000 bills: 0$5,000 bills: 0
$1,000 bills: 0$500 bills: 0
$100 bills: 0 0$50 bills: 0
$20 bills: 0$10 bills: 0
$5 bills: 0$1 bills: 0
half-dollars (50c): 0
quarters (25c): 0
dimes (10c): 0
nickels (5c): 0
pennies (1c): 3
correct!
$0.01$10,000 bills: 1
...
~~~
It's a classic [change-making problem](https://en.wikipedia.org/wiki/Change-making_problem)!

This was relatively straightforward to code a solution to, however I did run into some issues with Python occasionally casting the change string to an incorrect float, so I opted to convert everything to integers (# of pennies).

~~~python
import socket
import re

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("misc.chal.csaw.io", 8000))

resp = s.recv(1024)
print resp,

while len(resp) > 0:

m = re.match(".*\$(\d{1,50})\.(\d\d).*", resp, re.DOTALL) if m: change = int(m.group(1)) * 100 + int(m.group(2)) else: resp = s.recv(1024) print resp quit() denoms = [1000000, 500000, 100000, 50000, 10000, 5000, 2000, 1000, 500, 100, 50, 25, 10, 5, 1] for denom in denoms: num = 0 num = change/denom print num if num > 0: change = change - (denom * num) s.send(str(num) + '\n') resp = s.recv(1024) print resp, ~~~ 15 minutes later, we get the flag: ~~~ ...$81667.36
$10,000 bills: 8$5,000 bills: 0
$1,000 bills: 1$500 bills: 1
$100 bills: 1$50 bills: 1
$20 bills: 0$10 bills: 1
$5 bills: 1$1 bills: 2
half-dollars (50c): 0
quarters (25c): 1
dimes (10c): 1
nickels (5c): 0
pennies (1c): 1
correct!
flag{started-from-the-bottom-now-my-whole-team-fucking-here}
~~~

Original writeup (https://github.com/WCSC/writeups/tree/master/csaw2016-quals/coinslot).