wiiuhaxx_common/README.md

115 lines
5.3 KiB
Markdown
Raw Permalink Normal View History

# README
This fork is supposed to be a common base for Wii U ROP-chains.
2019-01-06 18:12:03 +01:00
## Building
Before using the ROP-chain, some files need to be compiled/generated, you can do it with `make`.
The makefile expects some binaries/files.
- `bin/rpxgadgetfinder.jar` [Download](https://github.com/wiiu-env/RPXGadgetFinder/releases) (requires Java 11(!))
- `tmp/532/coreinit.rpl` from 00050010-1000400A OSv10 v11464
- `tmp/532/gx2.rpl` from 00050010-1000400A OSv10 v11464
- `tmp/550/coreinit.rpl` from 00050010-1000400A OSv10 v15702
- `tmp/550/gx2.rpl` from 00050010-1000400A OSv10 v15702
When you have all needed files, you can use `make`.
On success, you can now find the following files:
- `wiiuhaxx_rop_sysver_*.php` one for each supported firmware.
- `wiiuhaxx_loader.bin`
# Original README
2016-01-12 20:29:11 +01:00
This is a common codebase for generating ROP-chains/etc for *seperate* Wii U PowerPC-userland exploits. This uses addresses auto-located from coreinit, with .php for each sysver that was pre-generated. This is basically a Wii U version of this: https://github.com/yellows8/3ds_browserhax_common
2015-12-25 02:34:06 +01:00
Currently only binary ROP-chains are supported, hence no support for using this easily with WebKit exploits. The core1-switch ROP here doesn't work correctly currently, hence this codebase isn't usable as-is unless the current core is already core1(which isn't the case for WebKit exploits it seems). In other words, this codebase is currently only usable with non-WebKit exploits. Hence the use of php, this is intended for running under browser-based titles, but could be used with others as well if the ROP-chain(s) are usable with them.
2015-11-22 19:08:09 +01:00
You must specify the "sysver={val}" URL parameter for pages using this codebase, for selecting your Wii U system-version:
* "532": 5.3.2
2016-01-12 18:40:39 +01:00
* "540": 5.4.0
* "550": 5.5.0 / 5.5.1
2015-11-22 19:08:09 +01:00
# Usage
This codebase uses config/etc names from the 3ds repo mentioned above.
If the exploit .php has to select a sysver without using the value selected with via the URL param, that could be done with the following for example(prior to using the require_once() for the common .php): "$sysver = 550;" DO NOT set $sysver to any data directly specified by the user.
The $ropchainselect field determines which ROP-chain to use. Only one ROP-chain is implemented currently. When this param isn't specified, the codebase will select the default ROP-chain(val1).
The default ROP-chain does the following(only usable with titles which have codegen access):
* 1) Runs the core1-switch ROP(see above).
* 2) Loads the codebin payload into the codegen/JIT area(with the required OSSwitchSecCodeGenMode() calls before/after), and does dcache/icache flushing/invalidation.
* 3) Pops addresses into registers which the codebin could then use, see source.
* 4) Jumps to the codebin payload.
* 5) See source.
The memory address of the codebin payload is required, see below. If the payload isn't guaranteed to always be at the exact same address all the time, storing a PowerPC NOP-sled right before the payload in memory is highly recommended(big-endian word value 0x60000000). The output of wiiuhaxx_generatepayload() is: wiiuhaxx_loader followed by the actual payload, with 4-byte alignment for the total size(see below).
2015-12-25 02:34:06 +01:00
Also note that this codebase *itself* does not need the address where the initial ROP-chain is located at all.
Example that the exploit .php can use:
```
<?php
...
require_once("wiiu_browserhax_common.php");
...
$generatebinrop = 1;
$payload_srcaddr = <address of payload codebin>;
$ROPHEAP = <some valid address the ROP can use for storing tmp data>;//Such as the following: $payload_srcaddr-0x1000.
generate_ropchain();
...
$payload = wiiuhaxx_generatepayload();//Binary codebin, include this in the output exploit so that it lands in memory usable by the ROP.
2015-12-25 02:34:06 +01:00
if($payload === FALSE)
{
header("HTTP/1.1 500 Internal Server Error");
die("The payload binary doesn't exist / is invalid.\n");
}
...
else if($i<{targetoffset})
{
$writeval = $ROP_POPJUMPLR_STACK12;//ROP NOP-sled.
}
else if($i=={targetoffset})
{
$con.= pack("N*", $ROP_POPJUMPLR_STACK12);
$con.= pack("N*", 0x48484848);//If LR ever gets loaded from here there's no known way to recover from that automatically, this code would need manually adjusted if that ever happens.
$i+= 0x8;
$con.= $ROPCHAIN;
$i+= strlen($ROPCHAIN)-4;
//Verify that the $ROPCHAIN isn't too large somewhere in here.
continue;
}
...
?>
```
A config file located at "wiiuhaxx_common_cfg.php" is also required.
* $wiiuhaxxcfg_payloadfilepath is the filepath for the actual codebin payload to run, this will be loaded to codegen+0.
2015-12-25 02:34:06 +01:00
* $wiiuhaxxcfg_loaderfilepath is the filepath for wiiuhaxx_loader.bin. This loads the above payload, since due to the NOP-sled the initial code which runs(wiiuhaxx_loader) won't (always) land at codegen+0. This can be built by running the following: "make OUTPATH={directorypath/filepath to copy the .bin to}".
For example:
```
<?php
2016-01-16 17:18:27 +01:00
$wiiuhaxxcfg_payloadfilepath = "<filepath for actual payload, such as wiiuhax_payload.bin, or for example: {projectdir}/bin/code550.bin>";//Remember that this is just an example, you can programmatically select the payload path by checking the request URL/etc if you want as well.
2016-01-12 21:56:24 +01:00
$wiiuhaxxcfg_loaderfilepath = "<filepath for wiiuhaxx_loader.bin>";
$wiiuhaxxcfg_searchpayloadfilepath = "<filepath for wiiuhaxx_searcher.bin>";
?>
```