-
LEVEL 15 assassin write-upSystem hacking training/Hackerschool LOB 2018. 5. 13. 15:37
giant -> assassin
[문제 + 힌트]
소스코드 먼저 분석을 해보면 argc가 2이상 즉 인자값이 2개 이상이여야하고 argv[1][47] 가 \xbf 혹은 \x40이면 안된다.
저 말은 return 할 주소가 \xbf 로 시작하는 스택의 어느 공간도 안되고 \x40으로 시작하는 코드영역도 안된다는 것이다.
그리고 취약점은 strcpy()의 사용으로 인해서 bof가 터진다.
그 후 memset()로 buffer+SFP를 0으로 초기화하면서 프로그램이 종료된다.
이 문제는 간단하게 ret가젯을 이용하여 쉽게 우회가 가능하다.
ret의 주소는 \xbf도 \x40도 아니기 때문에 ret 가젯을 이용하여 system()를 불러오던 환경변수에 쉘코드를 넣고 쉘코드를 실행시키던 할 수 있다.
objdump -d 옵션을 주어 ret 가젯을 찾은 뒤 이 중 아무 주소나 골라서 ret 공간에 넣어주고 그 다음에 실행할 주소를 넣으면 되는데
첫번째 방법은 환경변수의 주소를 넣는것이다.
환경변수를 구하는 프로그램을 만들고 ret가젯의 주소를 ret공간에 넣어준뒤 쉘코드가 들어간 환경변수의 주소를 다음으로 넣어주면 쉽게 익스가 가능하다.
두번째 방법은 system("/bin/sh"); 방법인데.
RTL기법을 이용하여 익스가 가능하다.
RTL기법을 하기 위해 필요한 준비물들은 다음과 같다.
libc base address, system() address, /bin/sh offset
먼저 libc의 base 주소와 /bin/sh의 offset을 구해보자.
ldd 명령으로 바이너리가 사용하는 공유 라이브러리의 주소를 얻어오고 이 공유 라이브러리에서 /bin/sh 문자열을 찾으면 해당 offset값을 얻을 수 있다.
여기서 libc base address : 0x40018000
/bin/sh offset : 0xe81c0 + 7 = 0xe81c7
따라서 /bin/sh의 주소는 libc base address에 offset을 더한 401001c7가 된다.
이제 system()의 주소만 알면 된다.
tmp 디렉터리에 assassin 파일을 복사한 뒤 gdb로 쉽게 알아올 수 있다.
따라서 system() address : 0x40058ae0
필요한 것들을 구했으니 이제 페이로드를 구성하면 다음과 같다.
python -c 'print "A"*44+"ret가젯"+"system() address"+"dummy(4byte)"+"/bin/sh address"'
익스를 해보면
쉘을 띄울 수 있다.
이상 풀이를 마친다.
반응형'System hacking training > Hackerschool LOB' 카테고리의 다른 글
LEVEL 17 succubus write-up (1) 2018.05.17 LEVEL 16 zombie_assassin write-up (0) 2018.05.13 LEVEL 14 giant write-up (0) 2018.05.12 LEVEL 13 bugbear write-up (0) 2018.04.26 LEVEL 12 darkknight write-up (0) 2018.04.22