cgy12306

[LOB] golem 본문

Wargame/LOB

[LOB] golem

cgy12306 2019. 9. 30. 10:48

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