Tags: windows 

Rating:

## Infos

**Author**: awe
**Category**: Pwn
**Difficulty**: Easy
**Solves**: 2 (WTF)

## Description:

After monitoring the number of people escaping from `winworld` during the Insomni'hack Teaser, the droids became confident that Windows 10 is just too secured, so they decided to use it again to manage their army.
The protections are the same `winworld`, but the difficulty is... not quite the same ;)

Running on Windows 10 with:
```bash
AppJailLauncher.exe /key:flag.txt /port:1337 /timeout:12000000 easywin.exe
```

## Solution:

There is an obvious buffer overflow in the "change target" function, which allows to overwrite a format and a function pointer.

1) Use the format string to leak `ucrtbase.dll`. At offset 5 you have `ucrtbase!_argc`. Compute the base of `ucrtbase` from its offset.
2) Overwrite the function pointer with `ucrtbase!system` and trigger it. The binary has Control Flow Guard but `system` is a valid target, so no problem.
3) First argument of `system` is our buffer (how convenient?), however our charset is limited to `c > 0x20 && c < 0x7f` so we can't use space characters. We can use `,` or `^` to circumvent that restriction: `type,flag.txt\x00`.
4) For some reason remotely this didn't work (buffering or whatever), adding another command that prints more bytes does the trick: `type,flag.txt&whoami^/all\x00`
5) Get the flag: `INS{command^injection^for^the^win}`

Original writeup (https://github.com/Insomnihack/Insomnihack-2017/tree/master/pwn/easywin).