본문 바로가기

LOB

LOB 12번 (golem → darknight)

cat darknight.c


코드를 보면 제일 위에 FPO라고 적혀있고 코드 안에 strncpy함수에 의해 buffer크기보다 1byte 더 받는 것을 알 수 있다. , 1byte BOF가 발생하게 된다.

FPO기법이 1byte BOF를 이용하는 방법이다.



EBP가 변하면 EBP+4도 변하게 되는데 EBP+4RET이다. SFP1byte를 덮어 씀으로써 ebp를 조작해서 RET값도 덮으면 된다.

 

우선 스택에 레지스터 주소값들을 살펴보기 위해 브레이크 포인트를 걸고 확인해보자.


main 함수 안에 불리는 problem_child 함수에서 leave부분에 BP를 걸고


A41byte 넣고 ebp의 값을 확인해보니 0xbffffafc에 있는 것을 알 수 있다.

그래서 0xbffffa00부터 확인해보았다.


빨간 색으로 표시한 부분을 보면 SFP 1byte0x41overwrite 된 걸 알 수 있다.

이는 A40byte채워서 실행하고 비교해보면 overwrite된 걸 알 수 있다.


r `python c’print“A”*40’`실행 시

 

여기서 다시 정리해보면

prblem_child에서 1byteSFPoverwrite되어서 ebp가 변조되고 main함수의 leave( mov ebp,esp + pop ebp) 명령어를 통해 변조된 ebp로 이동하고 leave에서 esp4byte 증가하고 만난 주소값으로 RET되는데 그곳에 쉘코드가 있어야한다.

그러니까 변조된 ebp(버퍼)로 왔을 때 4byte쓰레기 값을 넣어줘야 esp4byte증가된 곳으로 이동한 후에 쉘코드가 있는 곳으로 RET하게 된다.

ebp를 변조시켜서 buffer로 이동하게 해줄 것인데 보면 ebp값도 0xbffffaXX에서 XX부분을 overwrite해 줄 수 있고 buffer0xbffffad4에서 시작되니까 여기로 돌리면 된다.

 

그런데 하다가 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