-
메모리 보호 기법 우회 프로젝트 종료 후기시스템 해킹 지식/삽질하며 알아가는 Linux에서의 메모리 보호기법 2019. 6. 15. 03:21반응형SMALL
안녕하세요. Luke입니다.
이로써 제가 포너블을 입문한지 약 4개월 정도 되는 날이군요!
약 6개월정도로 메모리 보호기법 올클리어를 목표로 잡았는데, 열심히 하다 보니 메모리 보호기법을 공략하는에 한 2개월정도 밖에 안된 것 같습니다. 예상한 목표치보다 훨씬 빠르게 목표를 이루어내어 매우 기쁩니다.
저는 올해 2월 해커스쿨 핸드북을 통해 포너블에 입문했으며, LOB를 풀며 BOF의 기초를 익혔습니다(올클은 아닙니다.)
그리고 우연히 RTL이라는 기법을 익힐 때 쯤 A0V3R CTF에서 더 이상 제가 풀 수 있는 문제가 없을 때 뭐라도 더 도전해보자 라는 마음으로 석지원 형이 내신 Penguin이라는 문제를 접했고, 결국 풀지는 못했지만 이로 인해 Canary라는 메모리 보호기법이라는 것의 존재와, NX가 걸리면 쉘코드가 안에서 실행이 되지 않는다는 것을 알게 되었습니다. 대회가 끝난 후 조준하라는 친구를 통해 ROP라는 기법에 대해 배운 후 ropasauruxrex라는 문제를 통해 처음으로 NX를 우회하는 법을 배웠습니다.(사실상 이 친구가 정말 저를 많이 도와줬습니다.)
그러고 나서 생긴 목표이자 저의 프로젝트가 메모리 보호 기법을 모두 클리어 하는 것이었습니다. ROP를 완벽하게 익힌 후 해킹캠프에 붙게되어 해킹캠프를 다녀오게 되었고, 해캠CTF에서 64비트 ROP라는 벽을 만나게 되었습니다. 32비트 익스 시나리오대로는 전혀 되지도 않고, 스택에 올라가는 구조도 다르고... 어쨋든 그 벽을 만나게 되어 저는 익스 시나리오만 짜서 팀원에게 넘겼습니다. 그 문제가 해캠CTF의 Ucanfind였습니다. 그래서 집에 와서 무조건 연구한게 64비트 환경에서의 ROP 익스플로잇이었고, 그래서 푼 문제가 Codegate 2018의 BaskinRobbins였습니다. 그리고 나서 이제 그 한이 쌓였던 ucanfind라는 문제를 다시 꺼내서 풀게 되었지요.
64비트 rop를 전부 클리어 한 뒤 이제 다시 원래의 목표인 메모리 보호기법을 조지기 위해 Relro라는 것에 대해 알아보았습니다. Relro는 got overwrite가 안되므로 상대적인 주소인 offset을 이용해 libc base를 구한뒤 system의 주소를 구하는 방법을 사용하였어야 합니다. 이 문제는 두 문제를 풀었었습니다. 한 문제는 pwnable.tw의 Silver Bullet인데 이건 Write-Up작성이 금지 되어있는 문제라 블로그에 포스팅을 못했습니다. 그리고 다른 문제는 아까 말했던 ucanfind를 Full relro가 걸려있다 생각하고 풀었었습니다. 그래서 이걸 Write-Up으로 작성하였지요.
그리고 이제 제일 골치 아팠던 Canary였는데요. 그 미련남았던 펭귄을 끝낼 수 있는 시기가 온 것이었습니다. Canary는 정말 정보가 없어서 블로그만 보고 삽질을 많이 했었습니다. 뭐 찾아보기로는 Brute Forcing이라는 방법도 있고 Leak을 하는 방법도 있었는데 저는 ㅋ Canary가 계속 바뀔 것이라는 생각을 못하고 Brute Forcing에 집착하다 시간을 조금 많이 버렸습니다.(*브루트 포싱은 fork가 되어 있을 때만 자식함수에서 실행 되므로 canary가 바뀌지 않는 다는 점을 이용해 공략이 가능합니다.) 그래서 결국 이게 안된다는 걸 페친찬스로 알게되어서 Leak이라는 방법으로 풀었습니다. leak이라는 방법은 은근 쉬웠습니다. 버퍼를 덮고 canary부분을 \n으로 1바이트를 덮게 되면 변수에서의 문자열의 종료를 뜻하는 널바이트가 덮여서 같이 카나리가 leak되게 됩니다. 이를 이용해 문제를 풀었습니다.
그리고 마지막 PIE! 이름이 PIE라서 쫄았는데... 생각보다 어렵진 않았어요.(우분투 18.04로 삽질한건 안비밀). 결론은 Aslr의 바이너리 버전이었어요. 전부 offset을 구해서 하면 됩니다.
NX 우회 라업: https://weekhack.tistory.com/11
64비트 ROP NX: https://weekhack.tistory.com/13
Full Relro: https://weekhack.tistory.com/18
Canary: https://weekhack.tistory.com/21
PIE: https://weekhack.tistory.com/29
어쨋든 매우 기분이 좋습니다! 이제 앞으로는 HackCTF의 포너블 문제를 올클해보려 합니다. 재미있거나 흥미로운 문제는 당연히 전부 가져와 롸업을 써야죠 ㅎㅎ
제가 개인적으로 롸업쓰는거 좋아해서 너무 쉬운 문제만 빼면 32비트 ROP수준만 되어도 그냥 라업쓸거 같습니다 ㅎㅎ
조만간 다른 롸업으로 뵈요 ㅎㅎ
반응형LIST