slide-image

LOB

[Load Of Buffer overflow]

#04 :goblin->orc

 

이번에도 정리용.

 

일단 orc와 orc.c가 있었는데 orc.c를 컴파일한 게 orc일 것이고, orc.c 코드 내용은 위와 같았다.

일단 코드에서 봐야할 부분은, 주석에 egghunter라고 써져있는데, 공격 기법 중에서 쉘코드를 조각내어 배치시키는 기법을 에그 헌팅이라고 한다. 버퍼사이즈가 너무 작아서 쉘코드를 삽입하기 어려울 때, EIP를 우회해 상대적으로 작은 버퍼에서 쉘코드 부분의 코드를 실행하게 하는 기법이다.

 

그리고 **environ이 뭔지 몰라서 검색해보니 리눅스 환경에서 C프로그래밍으로 환경변수를 외부변수 environ을 이용해 환경변수 문자열 배열에 직접적으로 접근할 수 있다고 한다. #include <stdlib.h>와 extern char **environ으로 선언 후 만약 환경변수를 모두 출력하고 싶으면 for (int i=0; environ[i] != NULL ; i++) printf(“environ[%d] : %s\n”, i, environ[i]);식으로 접근하면 된다고 한다.

 

또한 memset은 void *memset(void *ptr, int value, size_t num) 꼴의 c언어 함수로 ptr로 시작하는 메모리 주소부터 num개의 바이트를 value로 채운다는 뜻이다. 즉 ptr이라는 메모리 시작주소를 num개 만큼 value로 채운다는 것인데, environ은 환경변수들 전체를 가르키는 포인터고, 각 환경변수의 크기만큼 0으로 채운다는 것이므로, 모든 환경변수가 0으로 초기화 된다는 뜻이다.

 

그러면 환경변수를 이용한 공격이 불가하니까 에그 헌팅 기법을 쓰라는 말인 것 같다.

 

그리고 인자로 주어진 값의 [47]인덱스, 즉 48번째 바이트가 \xbf가 아니면 종료하는 것으로 보아 스택 부분의 주소를 이용해야한다는 것을 알 수 있다.

...더보기

일단 orc를 temp로 복사하고 디버깅을 했다.

너무 길어서 짤랐는데, strcpy함수 이전 버퍼크기만 확인하려고 한다. 40바이트가 버퍼인 것으로 보아 페이로드는 대충 40바이트의 버퍼와, 4바이트의 SFP, 리턴 어드레스 4바이트로 총 48바이트인 것 같다.

 

내가 쓸 쉘코드는 \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80로 총 25바이트짜리를 쓰려고 하는데, 그러면 리턴어드레스를 제외하고는 44-25=19바이트를 아무거나 채우고, 4바이트를 방금 내가 사용한 쉘코드의 시작주소로 해주고 싶었다. 일단 그러려면 코어덤프를 뜨거나 코딩을 해주어야 하는데 코어덤프는 귀찮아서 코딩을 해주었다.

Orc.c를 temp.c로 복사해서 앞의 쉘코드(정확히 말하면 buffer로 복사된 부분의 맨 앞부분)의 주소를 알 수 있도록 코드를 살짝 바꿨다. (맨 밑의 prinf(“%x\n”, buffer);부분)

 

그 전의 temp를 지우고 다시 컴파일해서

 

48번째가 \xbf여야 하니까 그냥 대충 쉘코드 25바이트랑 A 19개 쓰고, 나머지 4바이트 주소값을 \xbf\xbf\xbf\xbf으로 해서 temp인자로 주어 앞의 주소값 알아낸 다음에, 이제 진짜 orc에 앞의 페이로드에 방금 알아낸 주소값만 바꿔서 넣어주었다.

성공.


생각보다 옛날에 내가 했던 방법들을 돌아보는 게 도움이 되는 것 같다.

아 이땐 이랬구나..하면서 지금은 뭐가 나아졌는지 알 수 있는 느낌이다.

'Wargame > LOB(Redhat)' 카테고리의 다른 글

[LOB] wolfman->darkelf  (0) 2019.03.28
[LOB] orc->wolfman  (0) 2019.03.28
[LOB] cobolt->goblin  (0) 2019.03.28
[LOB] gremlin->cobolt  (0) 2019.03.28
[LOB] gate->gremlin  (0) 2019.03.28