Smash the Stack IO64 - Level02

Level02

In diesem besagten Level gilt es Folgendes Mathematische Problem zu lösen:

#include <unistd.h>

int main(int i, long **a) {
	if(*a[1] * 0x1064deadbeef4601u == 0xd1038d2e07b42569u)
		execl("/bin/sh", "sh", 0);
	return 0;
}

Naiverweise liegt es nahe die beiden Hex-Werte zu dividieren um besagten Wert für *a[1] zu ermitteln. Diese Annahme ist falsch, da der Resultierende Wert kein Integer ist. Um das besagte Problem zu lösen, ist es nötig das modulare Inverse () des Faktors multipliziert mit dem Wert: zu ermitteln. Für eine 2er Potenz lässt sich dies über den Satz von Euler lösen:

Folgender Exploit nutzt den hier vorgestellten Umstand aus.

#!/usr/bin/env python

import os
import sys
import struct

def p(x):
    return struct.pack('<Q', x)

def calc(v1, v2):
    return pow(v1, 2**63-1, 2**64) * v2 % 2**64

payload = p(calc(0x1064deadbeef4601,
                0xd1038d2e07b42569))

def exploit(vuln):
    args = [vuln, payload]
    env = {"NULL":"NULL"}
    os.execve(vuln, args, env)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print "Usage: %s target_program" % sys.argv[0]
    else:
        exploit(sys.argv[1])

Walkthrough

Viele Wege führen zum Ziel, hier nun meiner. Wer also die Level selber lösen möchte, sollte an dieser Stelle aussteigen. Im weiteren wird auf genaue Erläuterung verzichtet, da diese aus dem Kontext hervor gehen.

[email protected]:/levels$ cat level02.c
#include <unistd.h>

int main(int i, long **a) {
	if(*a[1] * 0x1064deadbeef4601u == 0xd1038d2e07b42569u)
		execl("/bin/sh", "sh", 0);
	return 0;
}
/* -- noname */
[email protected]:/levels$ python
Python 2.7.3 (default, Mar 13 2014, 11:03:55) 
[GCC 4.7.2] on linux2
Type "help","copyright","credits" or "license" for more information.
>>> import struct
>>> a1 = pow(0x1064deadbeef4601, 2**63-1, 2**64) * 0xd1038d2e07b42569 % 2**64
>>> struct.pack('<Q', a1)
'io64pass'
>>> a1 * 0x1064deadbeef4601 % 2**64 == 0xd1038d2e07b42569
True
>>> hex(a1)
'0x7373617034366f69L'
>>>
[email protected]:/levels$ ./level02 $(python -c "print('\x73\x73\x61\x70\x34\x36\x6f\x69'[::-1])")
$ cat /home/level3/.pass
X4DafQbnaTY5hiXe
$

Referenzen