LOB goblin풀이
goblin을 풀어보자.
이번엔 egghunter가 존재한다.
환경변수를 못쓰게 되었다.
일단 buffer를 40바이트 할당했고,
int i가 존재한다.
첫번째 if문에서 넘겨주는 값이 2보다 작으면 안된다고 하고,
//egghunter부분에서
for문으로 환경변수의 값을 0으로 memset하고,
if문에서는 두번째로 넘겨주는 인자의 47번째 인덱스,
즉 ./orc `pyhton~~~~ 에서 `python~~이부분의 47번째 인덱스의 값이 /xbf여야 한다.
그리고 strcpy로 입력을 받는다.
문제를 어떻게 풀까..
buffer도 쉘코드를 다 넣을만큼 충분하지 않으니 argv[1]의 자리를 이용하자.
argv[1]는 우리가 작성하는 익스플로잇인 `python ~~`이다.
위치는 문제를 풀면서 확인해보장.
gdb를 확인해보자.
스택을 44만큼 확장했다.
ebp-40이 buffer의 시작위치이다.
44가 왜 아닐까 생각해보니
i가 존재한다.
buffer선언하고 i선언했으니 i가 buffer보다 위에 있겠다.
그럼 ret는 44에서 시작해 4만큼이겠다.
gdb에서 확인해보자.
먼저 argv[1]을 입력받은 직후에 break를 걸어주자.
그리고 argv[1]을 아래처럼 넣어준다.
\xbf\xbf\xbf\xbf부분은 위에서 if문을 우회하기 위해서이다. 아무튼 \xbf만들어가면 되니까.
그러고 buf에 값이 들어갔는지 확인해보면
우리가 넣은 값이 낮은 곳과 높은 곳 2군데에 존재한다.
뭐지?
왜냐하면 strcpy함수가 argv[1]의 값을 복사해 buffer에 넣어주기 때문에 둘 중하나는 argv이고 다른 하나는 buffer이다.
근데 잘 생각해보면 argv[1]이 더 높은위치에 있다는 걸 알수 있다.
스택에서 더 높은 위치에 있는 argv에 값을 먼저 넣어주고,
그걸 낮은위치에 있는 buf에게 전달한다.
그러니 argv[1]에 nop sled를 입력한 후 argv[1]의 적당한 위치를 return값으로 전달하면 argv[1]의 위치로 return하겠지?
그럼 다시확인해보자.분명 gdb다시 실행하면 값이 밀린다.
적당히 0xbffffde4로 return하게 하겠다.
이렇게 익스플로잇했다.
스택 채우고,ret에 argv[1]의 위치 넘겨주고 쉘코드까지 흘러갈수 있도록 nop을 조금 채워준뒤 쉘로 마무리.
풀렸따.