이 문제만 이틀동안 봤는데도 해결을 못했다 ㅠㅠ
끝나고 올라온 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/
Ghidra가 원래는 wasm파일을 지원하지 않지만
https://github.com/nneonneo/ghidra-wasm-plugin
요 플러그인을 쓰면은 wasm도 디컴파일해준다고 한다.
그래서 디컴파일해서 난독화된 flag값을 xor 역연산 하면은 flag가 나온다.
나는 wasm2c 로 디컴파일해서 저렇게 코드가 정갈하게 나오지 않았는데 Ghidra로 디컴파일하면은 rust로 이쁘게 나오는듯 하다....
최근 wasm문제가 많이 나온다고 하는데 rust랑 wasm좀 공부 해놔야겠다
'Web Hacking > WriteUp' 카테고리의 다른 글
ASIS CTF 2024 Web Writeup (0) | 2024.09.22 |
---|---|
WhiteHat School 2nd CTF SSH Tunneling Final Writeup (0) | 2024.09.05 |
Project Sekai CTF 2024 Web Writeup (0) | 2024.08.24 |
[CCE 2024] Advanced Login System WriteUp (0) | 2024.08.07 |
[CCE 2024] Web WriteUp (0) | 2024.08.05 |