-
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다.
Golem에서 Darkknight로 가기위한 관문이다.
우선 코드를 보도록 하자
힌트를 보니 FPO라고 쓰여있다.
FPO란 Frame Pointer Overflow의 약자로 FPO를 이용해서 문제를 풀라는 의미이다.
보면 strncpy함수에서 버퍼의 크기가 40인데 41개까지 입력을 받을 수 있는 것이보인다.
그렇기 때문에 우리는 41번째의 버퍼 1Byte가 변조 가능하다.
즉, SFP -> Stack Frame Pointer를 변조하면된다.
FPO를 진행하기위해서는 두 가지 조건이 필요하다.
1. 서브함수가 있어야 한다.
2. 서브함수에서 SFP 하위 1Byte를 덮어쓸 수 있어야한다.
우선 디버깅을 위해 복사를 해주자~
main함수에는 그다지 필요한 것이 없기 때문에 problem_child함수를 우선적으로 보자
strncpy함수에 breakpoint를 걸고 값이 어떤식으로 들어가는지 우선 확인해보자!!
40개의 문자열 "a"와 41번째는 알아보기 쉽게 "b"를 넣었다.
메모리를 들여다보니 sfp, ret, argc, 함수인자 순으로 보이고 마지막에 끝이 62로 변조된 sfp와 ret가 보였다.
우리가 바꿔야할 것은 마지막에 있는 sfp 즉, 0xbffffa62를 쉘코드의 시작주소로 변조하면된다.
스택의 모양은 대략 이런 형태로 될 것이다.
이렇게 공격을 진행하게되면 서브함수가 끝나면서 진행되는 leave gadget이 진행될 때
[ mov esp, ebp ]
[ pop ebp ]
위의 동작으로 우리가 수정해놓은 sfp의 값으로 ebp가 설정되고
ret gadget을 거쳐 esp는 main으로 복귀하게된다.
그 다음 main에서의 leave gadget이 진행되면
[ mov esp, ebp] 로 인하여 esp가 변조된 ebp인 쉘코드가 있는 주소를 가리키게된다.
[ pop ebp ]가 진행되면 ebp는 이상한 값을 가리키게되고
이 상태에서 ret gadget이 진행되게되면
[ pop eip ] -> esp값을 eip에 저장
[ jmp eip ] -> eip로 jump하면서 쉘코드가 실행됨
깰꼼하게 쉘코드가 실행될 것이다.
사용된 쉘코드(25Byte)는 다음과 같다.
"\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"
payload를 구성해서 한 번 진행해보자
혹시모르기 때문에 40까지 채워지지 않은 크기는 nop sled를 위해 nop으로 채웠다.
25Byte길이의 쉘코드를 사용했기 때문에 15개의 nop sled를 이용했다.
마지막은 쉘코드를 실행시키기 위해 sfp의 마지막을 0x78로 변조하였다.
즉, sfp는 0xbffffa78로 변조되었다.
그렇기 때문에 이 함수가 종료되면서 leave가 진행될 때
main의 ebp값이 0xbffffa78이 되면서 nop sled를 타고 쉘코드가 실행될 것이다.
역시나ㅎㅎ 한 번에 쉘코드가 따졌다.
이제 복사본이 아닌 원본에 같은방식으로 진행하면된다~~
다음 단계로~
반응형'표튜터와 함께하는 Pwnable > The Lord Of the BOF Write-up' 카테고리의 다른 글
[LOB] Bugbear -> Giant Write-up (0) 2019.03.03 [LOB] Darkknigth -> Bugbear Write-up (0) 2019.03.02 [LOB] Skeleton -> Golem Write-up (0) 2019.02.27 [LOB] Vampire -> Skeleton Write-up (0) 2019.02.27 [LOB] Troll -> Vampire Write-up (0) 2019.02.26 댓글