예전 문제와 달리 코드 길이가 너무 길더군요. 어셈으로 봤는데 시간이 쫌 걸릴꺼 같아서 소스코드를 보았습니다.
소스코드를 길지만 잠시 일부만 올리겠습니다.
사실
FD_ZERO
FD_SET
FD_SETSIZE
FD_ISSET
위 함수들을 잘몰라서 분석이 어려웠습니다. 머리가 쫌..그래서 이해도 잘 안되더군요.
하지만 위 함수들이 하는 일은 확실하게 몰라도 문제는 풀수있었습니다.
소스를 분석해보겠습니다.
쭉 변수를 생성 후 check값이 0xdeadbeef이면 shellout() 함수를 실행시키게 됩니다.
다른 부분을 보시겠습니다.
1byte씩 읽어서 스위치 문으로 넘겨줍니다.
우리의 목표는 check값에 0xdeadbeef만 넣어주면 끝납니다.
어셈코드로 보시겠습니다.
스택에 공간을 할당하고 비교하는 부분까지 나타내본 것입니다. 위 어셈을 스택에 간단하게 표현해보도록 하겠습니다.
위와 같이 됩니다. 그러면 위 소스를 보시면 string에는 값을 입력 받습니다. count가 offset으로 작용하게 되죠.
그러면 check에 값을 입력 하려면 어떻게 하면 될까요??
string[-4]에서부터 값을 입력 받으면 됩니다.
그리고 소스코드를 보시면 \x08을 입력 받으면 count값이 -1씩 줄어들게됩니다.
그러면 \x08을 4번을 입력하고 0xdeadbeef를 입력하면 됩니다.
시나리오대로 공격을 해보겠습니다.
성공입니다. 딱 8byte만 넣어주시면 쉘을 따게 됩니다.
끝.
'My Study > Exploit' 카테고리의 다른 글
Hackerschool level20 (0) | 2010.03.30 |
---|---|
Hackerschool level19 (2) | 2010.03.27 |
Hackerschool level17 (0) | 2010.03.23 |
Hackerschool level16 (0) | 2010.03.23 |
Hackerschool level15 (0) | 2010.03.23 |