둘둘리둘둘리둘둘리둘둘리둘둘리둘

[Hacker school FTZ] Level19 -> Level20 본문

War game/해커 스쿨 FTZ

[Hacker school FTZ] Level19 -> Level20

dool2ly 2015. 8. 20. 23:27

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풀이--




Comments