ipwn

[LOB(Lord Of Buffer overflow)] troll -> vampire 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] troll -> vampire

ipwn 2018. 1. 17. 14:28

이번 단계는 troll 단계이다.


이번엔 바로 copy file을 생성하고 시작해보도록 하겠다.



바로 코드를 보도록 하겠다.



저번보다 코드가 많이 짧아졌다.


argv를 몇 개 사용해도 제한이 없어졌고, argv[1]의 길이 제한도 사라졌다.


하지만 argv[1][46] == \xff이면 프로그램을 종료시킨다.


이 말은 즉 return address에서 2번째 bit가 \xff가 아니어야 한다는 말이다.


이건 어떻게 해줘야할까?


일단 예전처럼 뒷 공간에 nop을 200개 넣고 shellcode를 넣는 방식으로 core dump를 한 번 가져와보자.



core dump를 이용해 메모리를 읽어보겠다.



바로 메모리를 봤지만 buffer에서 \x90의 위치는 0xbfffXXXX으로이뤄져있다. 


즉 두번째 bit가 \xff로 이뤄져있다.


그렇다면 argv[1]은 다르지 않을까? 한 번 살펴보겠다.



흠 argv도 별반 다르지않다. 


그렇다면 두 번째 bit가 \xff가 아닌 다른 값으로 바꿔주려면 어떻게 해줘야할까?


우리는 메모리가 쌓일 때 에서 아래로 쌓이는 걸 알 수 있다.


이 말은 즉 메모리를 그냥 많이 넣어주기만 하면 공간은 엄청 많이 할당을 받아야 할 것이고 그 공간을 할당하다보면


\xff의 값은 바뀌게 될 것이란 말이다.


한 번 바뀌는지 뒤의 nop의 갯수를 13000개로 수정해서 core dump를 가져와보겠다.



nop 13000개를 return address의 뒷 공간에 넣어주고 메모리를 확인해봤다.


확실히 주소값이 낮은 위치로 할당을 받은 것을 알 수 있다.


하지만 여전히 두 번째 bit는 \xff이므로 좀 더 많은 양의 nop을 return address뒷 공간에 넣어보겠다.


nop을 130000개 넣어보도록 하겠다.



값을 이런 식으로 넣어주고 core dump를 읽어와보도록 하겠다.



드디어 두 번째 bit가 \xff가 아닌 \xfd로 바뀌었다.


이제 payload가 완벽해졌다.


우리가 넘겨줄 값은 dummy*44 + 0xbffdff10(임의의 nop의 위치) + nop(\x90)*130000 + shellcode가 될 것이다.


한 번 copy file에 payload를 넘겨주고 shell이 가져와지는지 확인해보자.



shell이 성공적으로 가져와졌다.


이제 원본 file에 payload를 넣어주어 shell이 가져와지는지 확인해보겠다.



성공적으로 shell이 가져와졌다.


vampire로 가는 password는 music world이다.


Comments