ipwn
[LOB(Lord Of Buffer overflow)] troll -> vampire 본문
이번 단계는 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이다.
'Write up > LOB' 카테고리의 다른 글
[LOB(Lord Of Buffer overflow)] skeleton -> golem (0) | 2018.01.18 |
---|---|
[LOB(Lord Of Buffer overflow)] vampire -> skeleton (0) | 2018.01.17 |
[LOB(Lord Of Buffer overflow)] orge -> troll (0) | 2018.01.17 |
[LOB(Lord Of Buffer overflow)] darkelf -> orge (0) | 2018.01.17 |
[LOB(Lord Of Buffer overflow)] wolfman -> darkelf (0) | 2018.01.16 |