LEVEL3
(cobolt -> goblin) : small buffer + stdin
이번 문제는 저번문제와 값과 모든 것이 똑같을 것이다.
하지만 다른 것은 저번에는 argv로 인자를 받았다.
즉 프로그램을 시작할때 값을 같이 주는 것이다.
하지만 이번에는 gets로 값을 받는다.프로그램을 시작할때 값을 받는게 아니라 시작을 한 후에 값을 받게된다.
그래서 입력방식이 달라진다.정확한 것은 풀면서 느껴보자!
저번 문제와 거의 동일하니 자세하게 분석한 것은
.
.
.
.
저번과 동일하게 쉘코드와 입력하는 값은 똑같게 하되 saved eip와 입력방식을 다르게 해주겠다!
gdb로 파일을 열어보자!
값을 받은후인 main+15에 브레이크포인트를 걸고
saved eip값을 구해보겠다.
buufer의 공간+saved ebp 20byte, saved eip=4byte,NOP(\x90)*50,shellcode
(----------------A로대체-----------)(-----B로대체----)(---C로대체---)
우리는 NOP의 주소를 구해서 saved eip에 넣어주면 된다.
NOP를 C로 대체했으니까 C의 주소를 구해서 saved eip에 넣어주면 될 것이다.
이제는 입력방식에 대해서 설명하겠다.
argv형식으로 프로그램을 시작할 때 파이썬으로 값을 주려면
./파일이름 `python -c '[쓰고싶은 명령어]'`를 사용하면 된다.
하지만 프로그램 안에 입력받는 방식이 있다면...
(python -c '[쓰고싶은 명령어]';cat) | ./[파일명]와 같이 하면된다.
;cat을 쓰는 이유는 ;는 리눅스에서 여러 명령어를 받기 위한 것이고 cat은 쉘이 실행됬을 때 바로꺼지지 않게 해준다.
이제 실행을 해보자
보면 전단계와 다르게bash$가 떠있지 않는다.(※입력방식 차이)
원래는 한번 실행을 하고 바로 꺼지게 되는데 그것을 ;cat이 방지했다고 봐주면된다!
'WarGame > The Lord of Bufferoverflow(LOB)' 카테고리의 다른 글
The Lord of Bufferoverflow(LOB) wolfman -> darkelf (0) | 2017.12.08 |
---|---|
The Lord of Bufferoverflow(LOB) orc -> wolfman (0) | 2017.12.03 |
The Lord of Bufferoverflow(LOB) goblin -> orc (0) | 2017.12.03 |
The Lord of Bufferoverflow(LOB) gremlin -> cobolt (0) | 2017.12.01 |
The Lord of Bufferoverflow(LOB) gate -> gremlin (0) | 2017.11.30 |