cgy12306
[LOB] golem 본문
ID : golem
PW : cup of coffee
FPO(Frame Pointer Overwrite)는 서브 함수가 필요하고 1바이트 오버플로우가 일어나면 EBP를 조작함으로써 원하는 주소로 이동할 수 있는 기법이다.
problem_child 함수를 호출해서 buffer를 40 byte만큼 할당 해주고 입력받은 argv[1]에서 strncpy함수를 이용하여 41byte만큼 buffer로 이동한다.
problem_child 함수에서 sfp가 변조됨으로써 함수 에필로그가 발생할 때 main 함수의 ebp는 sfp값을 참조하여 sfp-4의 값이 ret이 실행될 주소가 된다.
problem_child 함수의 leave 지점에다가 breakpoint를 걸어주고 A를 40개 넣어보고 스택을 확인해 보자.
A가 40개 들어간 걸 확인할 수 있다.
A를 41개 넣어보자.
A를 41개 넣었더니 0xbffffaec지점에서 0xbffffa00에서 0xbffffa41로 바뀐 것을 볼 수 있다. 0xbffffaec는 problem_child함수의 sfp이다.
A를 40개 넣고 0x04를 추가해주고 nop을1000개 넣어준 뒤 쉘코드를 넣고 다시 nop를 100개 넣어줘 봤다.
sfp가 0xbffff604로 바뀌었고 41이 40개 들어간 것을 볼 수 있다.
이렇게 되면 sfp가 0xbffff604로 바껴서 main의 ebp는 0xbffff604를 가리키게 될 것이고, ebp+4 지점인 0xbffff608 지점을 ret으로 삼게 될 것이다. 우리는 ret에 들어가게 될 값을 nop이 들어가있는 주소를 넣어줘야 한다.
다시 값을 줄여서 nop을 100개씩만 넣어주자.
스택을 다시 살펴보면 주소로 삼을 수 있는 값들이 보인다.
nop 주소는 0xbffffb94부터 0xbffffbcc지점중 하나를 선택하면 된다.
시나리오는 nop을 36byte 넣어주고, 그 사이에 op코드가 들어있는 지점의 주소를 넣어준 후 마지막 1byte는 (op코드가 들어있는 지점의 주소-4) 지점을 가리키는 주소의 마지막 byte를 넣어주면 된다.
'Wargame > LOB' 카테고리의 다른 글
[LOB] bugbear (0) | 2019.09.30 |
---|---|
[LOB] darkknight (0) | 2019.09.30 |
[LOB] skeleton (0) | 2019.09.30 |
[LOB] vampire (0) | 2019.07.19 |
[LOB] troll (0) | 2019.07.16 |
Comments