자 이제 레벨12의 소스를 보자
상당히 코드가 깔끔해졌다.
함수 하나를 콜 하는데
이 함수는 40바이트 버퍼에 41바이트 만큼의 argument 1을 복사한다.
결국, EBP를 1바이트 만큼만 덮어씌울 수 있다는 것이다.
이 공격이 무엇인가하니
SPO공격이라고 한다.
FPO공격이라고도 부르는 것 같다.
사실 무엇이 맞는지는 잘 모르겠다;;
SPO공격이란, Stack frame Pointer Overflow 의 약자로,
FPO공격이란, Frame Pointer Overwrite 의 약자로,
SFP에 저장된 EBP의 값을 1바이트만 변경하여 공격하는 기법이다.
하지만 이 공격은 main에서는 공격 할 수 없고, 함수가 호출되어 리턴될 때에만 사용이 가능하다.
main의 ebp가 변경되어, main이 리턴될 때, 변경된 주소로 실행이 되게 해야 하므로, leave 가 2번 작동되어야만 한다고 한다.
ret | ebp | main | edx | ebp | ret | buf |
이런식으로 저장이 되어 있다.
main의 ebp가 0xbffffb08 이고, 리턴주소는 0x080483b1이다.
우리는 이 ebp를 조작하여, 리턴주소가 있는 부분을 우리의 NOP[15]+쉘코드[25] 가 있는 부분으로 바꿔버리면 끝이다.
NOP[15]+쉘코드[25]+\xac 로 하면 메인의 ebp가 0xbffffaac로 바뀌게 되고, 리턴주소는 0x41414141 이 되어 버린다.
그래서 NOP을 타고 가다가 중간에 쉘코드를 만나면 쉘코드가 실행될 것이다.
그럼 main의 리턴주소가 될 부분에 NOP[15]+쉘코드[25] 가 있는 주소로 바꾸기 위해 아래와 같이 입력하였다.
`python -c 'print "\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\xac"'`
'WarGame > HackerSchool_LOB' 카테고리의 다른 글
HackerSchool LOB Level14 (0) | 2014.08.20 |
---|---|
HackerSchool LOB Level13 (0) | 2014.08.15 |
HackerSchool LOB Level11 (0) | 2014.07.31 |
HackerSchool LOB Level9 (0) | 2014.07.30 |
HackerSchool LOB Level8 (0) | 2014.07.29 |