저번 코드게이트 주니어 문제를 풀어보겠다.
생각보다 난이도가 어렵지 않아서 쉽게 풀었다.
32비트 파일이고 NX/SSP가 걸려있다.
바이너리는 fork()가 되어있어서 Canary값이 고정이다.
그럼 바이너리를 분석을 해보자.
소켓이 연결이 되면 이와 같은 함수로 이동이 된다.
Welcome()으로 먼저 이동이 된다.
Welcome()을 열어보면 간단한 인사말을 출력을 해준다.
list()를 보기전에 Bye()을 보면 간단하게 끝나는 문구를 출력을 해준다.
list()는 열어서 자세하게 확인을 해야한다.
이곳에서 취약점이 발생한다.
확인을 해보니 sub_8048907()에서 취약점이 일어난다...
sub_8048907()을 열어보면 recv()를 받는 함수이다.
그럼 v2에다 100의 값을 입력을 받는 것인데 v2의 공간을 보면 오버플로우가 일어난다.
하지만 카나리가 있기 때문에 카나리를 릭을 해줘야 한다.
그럼 카나리를 릭을 해보자.
v2에 40을 넣어 주었는데 카나리가 나오지가 않아서
41을 넣어줬더니 카나리가 나왔다.
카나리는 little endian으로 바꿔준 후 첫 바이트에는 00을 넣어주자.
그럼 카나리를 구해줬으니 익스플로잇을 바로 짜보겠다.
system함수를 leak해서 구해주지 않는 이유는 system함수가 이미 바이너리에 있다!!!???!?
그래서 그냥 plt로 사용을 해줬다.
여기서 살짝 헷갈린게 값을 준다음에 바로 실행이 왜 안되나 살짝 애를 먹었다.
왜 그러나 했더니 while(1)로 묶여 있어서 바로 안끝났던 것이었다...
3번을 해주면 whil(1)을 끝내고나서 우리가 덮어주었던 곳으로 ret를 해주는 것이다.
.
.
그럼 nc로 포트를 열어주고 flag를 받아보자.
그닥 어려운 문제는 아니였던 것 같다.
system의 주소도 친절하게 나와있고..
코드게이트는 문제가 너무 재밌는거 같다 후... 다른 문제도 풀어봐야겠다.
'SYSTEM HACKING > 문제 풀이' 카테고리의 다른 글
| 간단한 Crc CTF 문제 (0) | 2018.01.29 |
|---|---|
| 2016 Codegate -Watermelon (0) | 2018.01.24 |
| 2014 Codegate -nuclear (0) | 2018.01.10 |
| 2014 Codegate -Angry_Doraemon (0) | 2018.01.08 |
| Plaid CTF 2018 - EBP (0) | 2018.01.05 |
babypwn