LOB golem -> darkknight
ID : golem
Passwd : cup of coffee
접속해서 ls 명령어로 파일을 확인합니다.
cat 명령으로 코드를 열어봅니다.
FPO를 이용하라고 합니다. FPO는 sfp를 조작하는 기법입니다.
FPO는 Frame Pointer Overflow이고 sfp를 조작해서 원하는 곳으로 Return 시킬 수 있게합니다.
저기 보시면 main에서 argv[1] 인자를 problem_child 함수에 넘겨주어 buffer에 복사하는데, 41byte 만큼 할 수 있습니다.
sfp의 맨 뒤의 1byte를 조작할 수 있겠네요!
여기서 잘 생각해보면,
sfp를 변조해 놓고 problem_child에서 leave를 하면 esp는 현재 ebp를 가르키고, ebp에는 변조된 ebp가 들어갑니다.
problem_child함수의 leave를 만났을 때,
| sfp | return address | -> | sfp | return address | -> | sfp | return address |
| | |
ebp ebp esp
esp (sfp는 변조된 상태)
ret을 하면 main함수의 끝으로 가겠네요.
main함수의 leave를 만납니다. leave를 하면 esp는 현재 변조된 ebp를 가르키고, ebp에는 main 부모 함수의 ebp가 들어가겠네요. 만약에 변조된 ebp가 buffer 4byte 앞이라면 어떨까요?
main함수의 leave를 만났을 때,
| 4byte | buffer(40) | sfp | ret | -> | 4byte | buffer | sfp | ret | -> | 4byte | buffer | sfp | ret |
| | |
ebp ebp esp
esp
여기서 ret을 만나게 되면 esp가 가리키고 있는 buffer가 Return Address로 들어가겠네요!
그리고 buffer에 셸코드가 등록된 환경 변수의 주소가 있으면, 쉘이 실행 될 것 같습니다.
해야할 것들은 환경 변수에 셸코드 올리고 주소 가져오기, 버퍼 – 4byte의 주소 찾기.
환경 변수부터 등록하겠습니다.
export SC=$(python –c ‘print “\x90”*13000 + "\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"’)
tmp 디렉터리를 만들고 환경 변수의 주소를 가져오는 코드를 짜겠습니다.
컴파일하고, 실행해보겠습니다.
환경 변수의 주소를 알아냈습니다.
이제 darkknight 실행 파일을 tmp로 가져와서 GDB로 열어보겠습니다.
buffer – 4byte의 주소를 찾아야하기 때문에, problem_child함수 leave 전에 break point를 걸도록 하겠습니다.
buffer – 4byte를 찾아보겠습니다.
0xbfffc7b0 바로 여기가 buffer – 4byte의 주소입니다.
payload : ./darkknight `python –c ‘print “\xc9\xcb\xff\xbf" + ”\x90”*36” + “\xb0”’`
core가 나왔네요. gdb로 열어서 확인하겠습니다.
buffer – 4byte의 주소가 0xbfffc7a0으로 바뀌었네요.
payload : ./darkknight `python –c ‘print “\xc9\xcb\xff\xbf" + ”\x90”*36” + “\xa0”’`
원본 파일에 공격해보겠습니다.
exploit!
감사합니다.
'System&Write up > LOB' 카테고리의 다른 글
LOB bugbear -> giant Write up (0) | 2017.11.08 |
---|---|
LOB darkknight -> bugbear Write up (0) | 2017.10.26 |
LOB skeleton -> golem Write up (0) | 2017.10.12 |
LOB vampire -> skeleton Write up (0) | 2017.10.11 |
LOB troll -> vampire Write up (0) | 2017.10.10 |