둘둘리둘둘리둘둘리둘둘리둘둘리둘
[Hacker school FTZ] Level19 -> Level20 본문
main()
{ char buf[20];
gets(buf);
printf("%s\n",buf);
}
여태까지의 문제와 달리 setreuid를 main에서 호출하지 않는다.
그말은 직접 setreuid를 실행해 준 후 쉘을 실행시켜야 level20의 권한을 얻을 수 있다는 것 이다.
단순하게 생각해서 여태까지 풀어왔던 방법에서 쉘 코드에 setreuid(3100,3100)만 추가해 주고 환경변수에 쉘 코드 등록 후 리턴 주소를 환경변수로 덮어주면 된다. 물론 쉘코드를 짜야하는 번거로움이 있다.
--풀이--
다른 방법으로는 RTL로 여러 함수를 호출할 수 있는 RTL Chaining도 가능한데 pop-pop-ret가젯을 필요로 한다.
RTL chaining을 간단히 설명하자면
라이브러리 함수 호출 순서를 문제의 setreuid(3100,3100)-system("/bin/sh")-exit()를 예로 들은 페이로드가 아래와 같다.
[ 더미(44) | setreuid | PPR | 3100 | 3100 | system | exit | &"/bin/sh" ]
1 2 3 4 5 6 7 8
setreuid가 종료되면 POP-POP-RET을 수행하여 esp가 system을 가리킨 후 리턴하여 system을 호출하는 방식이다.
2에서 ebp+8(인자1)인 4와 ebp+12(인자2)를 사용하고 그다음 3이 호출되면 POP-POP동안 esp이 6으로 이동되어 RET에서 6이 실행된다..........................직접 디버깅해보면 이해가 쉽다..........
--RTL chaining풀이--
'War game > 해커 스쿨 FTZ' 카테고리의 다른 글
[Hacker school FTZ] Level20 -> Clear ! (0) | 2015.08.21 |
---|---|
[Hacker school FTZ] Level18 -> Level19 (0) | 2015.08.20 |
[Hacker school FTZ] Level17 -> Level18 (0) | 2015.08.20 |
[Hacker school FTZ] Level16 -> Level17 (0) | 2015.08.20 |
[Hacker school FTZ] Level15 -> Level16 (0) | 2015.08.20 |