Web Hacking/WriteUp

Buckeye CTF 2024 instructions Writeup

프레딕 2024. 10. 1. 21:21
728x90

이 문제만 이틀동안 봤는데도 해결을 못했다 ㅠㅠ

끝나고 올라온 writeup을 바탕으로 해결한 과정을 적어놓겠다.

 

일단 이 문제는 wasm(웹 어셈블리)문제이다.

문제 접속하면 rust를 컴파일하라고 하고 js파일과 wasm파일 두개 올라온게 끝이다.

일단 rust를 컴파일해서 wasm 파일을 만들면은 wasm파일을 import하기 위해 js와 같이 써야한다.

요 부분이 그부분이다.

 

그다음 wasm파일을 디컴파일도 해보고 별짓을 다했는데 해결을 못했다.

writeup을 보니 js파일에 state를 지정하는 부분이 있었는데 요 부분이 다시보니 의심스럽게 생기긴 했다.

    imports.wbg.__wbg_state_3308b4f9bac86286 = function(arg0) {
        const ret = getObject(arg0).state;
        return {"nominal":0,"fair":1,"serious":2,"critical":3,}[ret] ?? 4;
    };
    imports.wbg.__wbg_new_064a8a4f7d4a5a7d = function() { return handleError(function (arg0) {
        const ret = new PressureObserver(getObject(arg0));
        return addHeapObject(ret);
    }, arguments) };
    imports.wbg.__wbg_observe_ed4527e4ed34748f = function(arg0, arg1) {
        const ret = getObject(arg0).observe(["thermals","cpu",][arg1]);
        return addHeapObject(ret);
    };

state가 nominal, fair, serious, critical인지 확인하고 있다.

그래서 저부분의 object가 어떻게 생겼는지 bp를 걸고 확인해봤다.

현재 cpu state가 nominal인걸 볼 수 있다.

그럼 이 heap[135]값을 critical로 바꿔보겠다.

그러면 갑자기 저 게가 땀을 흘리기 시작한다.

그리고 몇초 기다리면은 flag를 출력한다.

 

이렇게 쉬운거였는데 ㅠㅠ 근데 이걸 진짜 디컴파일해서 푼 ㅁㅊ 팀이 있었다.

https://ondrysak.github.io/posts/buckeyectf24_instructions/

 

BuckeyeCTF 2024 - instructions

Writeup for instructions web challenge!

ondrysak.github.io

Ghidra가 원래는 wasm파일을 지원하지 않지만
https://github.com/nneonneo/ghidra-wasm-plugin

 

GitHub - nneonneo/ghidra-wasm-plugin: Ghidra Wasm plugin with disassembly and decompilation support

Ghidra Wasm plugin with disassembly and decompilation support - nneonneo/ghidra-wasm-plugin

github.com

요 플러그인을 쓰면은 wasm도 디컴파일해준다고 한다.

그래서 디컴파일해서 난독화된 flag값을 xor 역연산 하면은 flag가 나온다.

나는 wasm2c 로 디컴파일해서 저렇게 코드가 정갈하게 나오지 않았는데 Ghidra로 디컴파일하면은 rust로 이쁘게 나오는듯 하다....

 

최근 wasm문제가 많이 나온다고 하는데 rust랑 wasm좀 공부 해놔야겠다

728x90
반응형