Rating:

As I write it, 2 writeups are about using XXE, 2 another about abusing `rand(time(0))` and [one more about intended way](https://ctftime.org/writeup/12776). I solved it in intended way too. For more details, check linked writeup.

Solution idea is that you can compare top drink with top chef-drink so you can use binary search approach to find a chef-drink value in runtime. In my case, I added decreasing powers of 2 while drink was smaller then chef-drink.

Below are the files from the solution: opcode descriptions, solution generator and solution itself.

`lang.xml` — description of all "language" instructions.

``` xml

<plate> <宫保鸡丁/> </plate>

<plate> <paella>42</paella> </plate>

<plate> <불고기/> </plate>

<plate> <Борщ/> </plate>

<plate> <दाल/> </plate>

<plate> <ラーメン/> </plate>

<plate> <stroopwafels/> </plate>

<plate> <köttbullar/> </plate>

<plate> <γύρος/> </plate>

<plate> <rösti/> </plate>

<plate> <לאַטקעס/> </plate>

<plate> <poutine/> </plate>

<plate> <حُمُّص/> </plate>

<plate> <æblegrød/> </plate>
```

`gen.py` — solution generator.

``` python
prog = [''' <course>
<plate> <paella>0</paella> </plate>
<plate> <paella>0</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>''']

s = ''' <course>
<plate> <paella>{next_course}</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>{val_to_add}</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>{val_to_add}</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>{this_course}</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>'''

filt = ''' <course>
<plate> <宫保鸡丁/> </plate>
<plate> <Борщ/> </plate>
<plate> <宫保鸡丁/> </plate>
<plate> <दाल/> </plate>
<plate> <宫保鸡丁/> </plate>
<plate> <paella>1</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>{finish}</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>4</paella> </plate>
<plate> <stroopwafels/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>0</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>'''

for i in range(30, -1, -2):
prog.append(s.format(this_course=len(prog), next_course=len(prog) + 1, val_to_add=2**i))
prog.append(filt.format(finish=len(prog) + 1))
prog.append(' <course/>')

with open('sol.xml', 'w') as f:
f.write('\n<meal>\n')
f.write('\n'.join(prog))
f.write('\n <state/>\n</meal>\n')
```

`sol.xml` — generated solution.
``` xml

<meal>
<course>
<plate> <paella>0</paella> </plate>
<plate> <paella>0</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>2</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>1073741824</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>1073741824</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>1</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>3</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>268435456</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>268435456</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>2</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>4</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>67108864</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>67108864</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>3</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>5</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>16777216</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>16777216</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>4</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>6</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>4194304</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>4194304</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>5</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>7</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>1048576</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>1048576</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>6</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>8</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>262144</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>262144</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>7</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>9</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>65536</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>65536</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>8</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>10</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>16384</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>16384</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>9</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>11</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>4096</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>4096</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>10</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>12</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>1024</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>1024</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>11</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>13</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>256</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>256</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>12</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>14</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>64</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>64</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>13</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>15</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>16</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>16</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>14</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>16</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>4</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>4</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>15</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <paella>17</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>1</paella> </plate>
<plate> <rösti/> </plate>
<plate> <ラーメン/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>1</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>16</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course>
<plate> <宫保鸡丁/> </plate>
<plate> <Борщ/> </plate>
<plate> <宫保鸡丁/> </plate>
<plate> <दाल/> </plate>
<plate> <宫保鸡丁/> </plate>
<plate> <paella>1</paella> </plate>
<plate> <rösti/> </plate>
<plate> <paella>18</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <불고기/> </plate>
<plate> <paella>4</paella> </plate>
<plate> <stroopwafels/> </plate>
<plate> <æblegrød/> </plate>
<plate> <paella>0</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <paella>1</paella> </plate>
<plate> <æblegrød/> </plate>
</course>
<course/>
<state/>
</meal>
```