passwd 등 내부적으로 `` ruid``를 체크하는 작업을 수행하려면 `` ruid``를 변경해 주어야 한다.



`` setuid`` bit가 설정 되어있는 바이너리를 실행하면 `` euid``가 변경된다. 

`` ruid``는 `` euid``가 변경된 상태에서 직접 ``c setuid()``를 호출해줄 때 변경된다.


때문에 ``c setuid()``를 호출하지 않는 바이너리를 이용해 쉘을 실행하더라도 `` euid``만 변경되고 `` ruid``는 그대로인 상태다.

이런 경우, 

  1. 쉘을 실행하기 전에 ``c setuid()``도 실행하도록 하면 ``c ruid == euid``인 쉘을 얻을 수 있다.
  2. `` euid``만 변경된 쉘에서 ``c setuid(geteuid()) / system("/bin/sh")``를 새로 컴파일해서 실행하면 ``c ruid == euid``인 쉘을 얻을 수 있다.
    일단 `` euid``가 변경되고 나면 그 이후 실행되는 subprocess는 모두 그 `` euid``로 실행되기 때문에 가능하다.



'OS > LINUX & UNIX' 카테고리의 다른 글

[compile process] Shared Library  (0) 2016.11.21
main startup routine bt  (0) 2016.11.15
[shell] pipe  (0) 2016.11.03
PLT, GOT  (0) 2016.11.01
NetCat ( nc )  (0) 2016.10.25