Sechack

포너블 로되리안을 해결하는 개쩌는 방법 본문

Pwnable

포너블 로되리안을 해결하는 개쩌는 방법

Sechack 2024. 5. 4. 00:04
반응형

포너블을 주분야로 하는 포너라면 누구나 공감하는 개빡치는 순간이 있다. 바로 로컬에서 exploit에 성공했는데 remote에서는 실패할때다. 이런 개빡치는 상황을 로컬에선 되고 리모트에선 안된다는 의미로 '로되리안' 이라고 한다. 포너라면 입에 달고사는 말일거다.

 

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

 

나랏말싸미 악용하기

설명 나랏말싸미... 듕귁에달아... 한글날을 기념하기 위해서 출제된 문제입니다. 한글로 작성한 멋진 시를 공유해주세요! 해당 문제의 실행파일은 나랏말싸미와 동일하며 플래그 형식은 DH{...}

dreamhack.io

 

사건의 발단은 위 문제이다.

 

일단 이 문제를 데프콘 뛰기전에 워밍업 하자는 가벼운 마음으로 잡았다. 익스 자체는 적당히 재밌게 했는데 로컬 따고 싱글벙글하게 remote날렸는데 익스가 안된다. 한두번 겪는 로되리안이 아니라서 이때까진 가벼운 마음으로 로되리안 해결을 하려 했는데.. 지금까지 쌓인 내공과 경험치를 총동원해도 해결이 안되는거였다.. 문제에서 준 Dockerfile을 그대로 빌드해도 안에서 프로세스로 실행할때랑 외부에서 접속요청 와서 socat으로 실행될때랑 heap layout도 달라지는 내 상식선에선 도무지 이해할 수 없는 일이 발생했다. libc가 같은데 도대체 heap layout이 왜 달라지는가!!

 

아무튼 단순히 주어진 Dockerfile build해서 빼온 libc가지고 offset만 맞춰서 해결할 수 있는 로되리안이 아니라 진짜 서버랑 실행 환경을 개똑같이 하고 테스트를 해야하는 상황이었다. Docker안에 gdb설치하자니 libc가 바뀌고 LD_PRELOAD를 쓰자니 이것도 억지로 libc끼우는거라 환경이 달라진다. 즉 문제에서 제공한 Dockerfile을 그대로 빌드해서 nc로 붙었을때 실행되는 바이너리를 디버깅해야만 한다는 말인데.. 이게 상식적으로 가능한가..?

 

놀랍게도 가능했다. host에서 Docker컨테이너 내부의 프로세스에 디버거를 붙일수가 있다.

 

 

nc로 접속하면 바이너리가 실행될거고

 

 

띠용..? host에서 ps -ef해보면 Docker내부에서 socat으로 실행해준 프로세스의 pid가 보인다.

 

 

디버거도 붙는다. Docker컨테이너가 host랑 커널을 공유하기 때문에 가능한 행위 같다.

 

별거아닌 내용을 제목으로 어그로를 끌었지만 지금까지 이거 모르고 Docker빌드해서 안에 gdb설치하고 LD_PRELOAD쓰고 로더 패치하고 하면서 로되리안 해결을 하던 포너들은 이거 보고 앞으로 로되리안으로 고통받는 일이 없길 바란다.

반응형
Comments