zj3t

email: euntaejang@gmail.com

Latest Posts

FTZ-level11

By 오후 4:38 ,

일단 밑에 사진은 제가 푼 것을 요약한 것을 순서대로 나열한 것입니다. 설명은 밑에서 하겠습니다.







굉장이 짜증나는 문제였습니다. 

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char *argv[] )
{
char str[256];

  setreuid( 3092, 3092 );
strcpy( str, argv[1] );
printf( str );

이 코드가 힌트에서 준 attackme코드 입니다. 저 코드를 보고 Shellcode를 이용하여 /bin/bash를 실행해주면 되겠구나 싶었습니다.





여기 까지는 사진을 보고 이해가 가능하실 겁니다. 

즉 우리가 해야할 것은 buffer부터 sfp까지 NOP(0x90)까지 채운뒤 즉 268byte를 채운 뒤 return address를 쉘코드를 실행할 곳으로 바꾸어 주면 됩니다.

<shell code>-25byte(shell을 얻도록 해주는 코드)
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"

그래서 제가 맨첨에 시도한 방법은

243byte-NOP
25byte-shellcode

로 설정한뒤에 return address를 NOP으로 설정한 아무곳의 주소로 설정하는 것입니다.
리버싱에서도 했듯이 NOP은 아무명령도 아니기 때문에 NOP만 실행되다가 결국 shellcode를 만나 실행하게 되는 것입니다.

하지만 여기서 엄청나게 많은 시간을 소모하게 했습니다. 
바로 ASLR이 걸려있었습니다ㅋㅋ 다른 블로그를 보니 예전에는 ASLR이 없던 것 같았는데 지금 제가 풀때는 걸려 있었습니다. 


ASLR은 사진으로 확인할 수 있습니다.

그래서 생각한 방법이 RTL기법 입니다. (Return to lib) 
말 그대로, 리턴 값을 라이브러리가 있는 곳으로 바꿔버린다는 것입니다.

하지만 RTL을 사용하기에는 제가 systemhacking을 많이 공부한게 아니여서 잘 모르고 RTL에 모티브를 얻은 것이 환경변수를 이용한 것이였습니다.

저는 환경변수를 하나 만들어 그곳에 shellcode를 넣었고 환경변수의 주소를 알려주는 getenv함수를 이용하여 환경변수의 주소가 바뀌는지 확인하였습니다. 다행이 바뀌지 않는 것을 확인 할 수 있었습니다.



이렇게 해서 리턴어드레스를 환경변수의 주소로 설정해주어 level12의 쉘을 얻을 수 있었습니다.



RTL기법으로 푼 다른 분이 있어서 URL 첨부하겠습니다.




You Might Also Like

0 개의 댓글