cat darknight.c
코드를 보면 제일 위에 FPO라고 적혀있고 코드 안에 strncpy함수에 의해 buffer크기보다 1byte 더 받는 것을 알 수 있다. 즉, 1byte BOF가 발생하게 된다.
FPO기법이 1byte BOF를 이용하는 방법이다.
EBP가 변하면 EBP+4도 변하게 되는데 EBP+4는 RET이다. SFP의 1byte를 덮어 씀으로써 ebp를 조작해서 RET값도 덮으면 된다.
우선 스택에 레지스터 주소값들을 살펴보기 위해 브레이크 포인트를 걸고 확인해보자.
main 함수 안에 불리는 problem_child 함수에서 leave부분에 BP를 걸고
A를 41byte 넣고 ebp의 값을 확인해보니 0xbffffafc에 있는 것을 알 수 있다.
그래서 0xbffffa00부터 확인해보았다.
빨간 색으로 표시한 부분을 보면 SFP 1byte에 0x41이 overwrite 된 걸 알 수 있다.
이는 A를 40byte채워서 실행하고 비교해보면 overwrite된 걸 알 수 있다.
→ r `python –c’print“A”*40’`실행 시
여기서 다시 정리해보면
prblem_child에서 1byte가 SFP에 overwrite되어서 ebp가 변조되고 main함수의 leave( mov ebp,esp + pop ebp) 명령어를 통해 변조된 ebp로 이동하고 leave에서 esp가 4byte 증가하고 만난 주소값으로 RET되는데 그곳에 쉘코드가 있어야한다.
그러니까 변조된 ebp(버퍼)로 왔을 때 4byte쓰레기 값을 넣어줘야 esp가 4byte증가된 곳으로 이동한 후에 쉘코드가 있는 곳으로 RET하게 된다.
아 ebp를 변조시켜서 buffer로 이동하게 해줄 것인데 보면 ebp값도 0xbffffaXX에서 XX부분을 overwrite해 줄 수 있고 buffer도 0xbffffad4에서 시작되니까 여기로 돌리면 된다.
그런데 하다가 bash2안한게 생각나서 bash2하고 혹시나 싶어 다시 problem_child에서 leave부분에 BP걸고 r `python –c ‘print“\x90”*41“’`을 실행하고 ebp값을 확인하였더니
달라졌다.
다시 buffer 시작주소를 확인한 후 (0xbffffa84) 쉘코드의 주소를 찾기 위해 쓰레기값[4byte] + 쉘코드 주소 찾기 전에 임의적으로 그냥 \xbf 4개[4byte] + \x90*7[7byte] + 쉘코드[25byte] + \x84를 실행해보자.
쉘코드의 주소는 0xbffffa90으로 공격하자
'LOB' 카테고리의 다른 글
LOB 14번 (bugbear → giant) (0) | 2016.10.13 |
---|---|
LOB 13번 (darkknight → bugbear) (0) | 2016.10.13 |
LOB 11번(skeleton → golem) (0) | 2016.10.04 |
LOB 10번(vampire → skeleton) (0) | 2016.10.04 |
LOB 9번(troll → vampire) (0) | 2016.10.04 |