농소

The Lord Of The BOF // bugbear -> giant 본문

Wargame/The Lord Of The BOF

The Lord Of The BOF // bugbear -> giant

농소 2018. 2. 21. 03:07






c파일을 보시면 execve의 주소와 execve오프셋을 합하여 execve의 실제 주소를 구하고 있습니다.

복잡해 보이지만 그냥 execve라이브러리 함수와 ret과 비교하여 일치여부를 확인하고 있네요

execve를 이용하여 RTL공격을 하라는 문제 같습니다.

gdb를 열어 확인합니다.



execve의 주소를 확인해주고 ret에 넣어서 실행해 봅시다 



ldd  : /home/giant/assassin: No such file or directory

파일을 찾을 수 없다고 하네요

현재 권한이 다르기 때문에 실행이 안됩니다 c파일을 편집기를 통해 수정을 해주어야 겠네요



이렇게 현재 id인 bugbear로 고쳐 다시 실행시키겠습니다.



네 이번엔 정상적으로 동작하네요

이제 execve의 인자를 넣어야 하는데요

원형을 봅시다.



인자가 3개가 필요하네요

첫번째로 파일이름 주소, 두번째로 argv[] 포인터 배열, 세번째로 환경변수가 필요로 합니다.

execve( "/bin/sh", argv[], null )로 채워주면 되겠네요


전 문제 처럼 "/bin/sh"를 입력을 통해 넣어서 추가 해줄 수 도 있지만

 이번에는 system함수 내부에 존재하는 /bin/sh를 찾아서 써보도록 하겠습니다.


손으로 찾기는 힘드니 간단하게 프로그램을 작성해줍니다


int main()

{

  char *shell = 0x40058ae0;


  while( memcmp( "/bin/sh" , shell, 7 ) ) {

    shell++;

  }


  printf("/bin/sh: 0x%08x \n", shell );


  return 0;

}



자 이렇게 /bin/sh가 0x400fbff9에 있는것을 확인 할 수 있습니다.

이제 인자를 채워볼까요


일단 마지막 인자로 환경변수에 0을 넣을 거니 제가 0값을 채울 수는 없으니 null이 들어있는곳을 참조하도록 합시다



0값들 중에서 0xbffffbec를 선택하겠습니다.


이제 인자 값을 전부 채워주면



두번째 인자의 포인터배열 형태, 세번째 인자의 0값이 채워진 모습을 확인했습니다.

실제 실행할때 주소가 달라지므로 16바이트씩 이동해가며 실행시켜줍시다.



16바이트씩 이동하면서 주소값을 찾으니 정상적으로 쉘이 떨어지게됩니다.

(해당null값을 넣었을때 잘 안나와서 다른 null로 교체했습니다)