SMALL
gate // gate
우선 어떤 파일이 있나 확인을 해준다.
컴파일된 gremlin, 그리고 gremlin.c 소스파일이 있다.
소스파일을 확인해 어떻게 구성되어있는지 확인해준다.
힌트가 되는 문자 자료형 배열 buffer 의 크기가 256인 것을 확인해 볼수 있다.
다음으로 gdb를 이용하여 어셈블리 코드와 메모리에 적재될 logical address를 살펴본다.
저는 인텔 문법이 편하므로 인텔 문법으로 보기위해
gdb 에서 set disassembly-flavor intel 명령어를 이용해 intel 문법으로 본다.
여기서 확인해 보아야할 곳은 스택에 esp 레지스터가 가리키는 곳을 확인해 준다. 변수의 크기를 할당해주기 위해 sub op 코드를 이용하여 esp -= 256을 해준 것을 확인해 볼수 있다.
그리고 아까 c 소스파일에서 조건문이 있었는데 어셈블리 코드에서 조건분기문이 작성된 것을 보아 c언어 if 문에 해당하는 것을 확인해 볼수 있었다.
그러면 ebp+8 위치에 인자값이 저장되는 주소를 확인할수 있다.
그 밑 -4 위치에는 ret이 있기에 그곳의 주소를 참조할수있게 되었다. 그렇다면 버퍼오버플로우의 여러가지 방식중 환경변수를 이용하는 방법을 선택해서 가기로했다.
“HA”라는 환경변수를 이용할것이기에 환경변수를 가져오는 getenv 함수를 이용해 “crush.c”파일을 생성하고 컴파일 해준다.
export 를 이용하여 환경변수 생성해준다.
메모리주소를 예측을 한다고 하지만 매우 어렵다 그래서 처음에 NOP를 넣어서 안전하게 실행하려고 넣고 쉘코드를 넣어준다.
환경변수가 잘 등록되었나 확인해주고
환경 변수 주소값 확인
버퍼랑 SFP에 260 NOP값으로 덮어씌워주고 환경변수의 주소를 ret에 넣어줌으로써 쉘 코드를 실행했다.
클리어!
'System > LOB' 카테고리의 다른 글
[LOB_6]wolfman (0) | 2019.07.25 |
---|---|
[LOB_5]orc (0) | 2019.07.25 |
[LOB_4]goblin (0) | 2019.07.25 |
[LOB_3]cobolt (0) | 2019.07.25 |
[LOB_2]gremlin (0) | 2019.07.25 |