System/LOB

[LOB_2]gremlin

dcho 2019. 7. 25. 19:19
SMALL
gremlin // hello bof world

소스파일을 확인해 어떻게 구성되어있는지 확인해준다.

힌트가 되는 문자 자료형 배열 buffer 의 크기가 16인 것을 확인해 볼수 있다.

다음으로 gdb를 이용하여 어셈블리 코드와 메모리에 적재될 logical address를 살펴본다.

저는 인텔 문법이 편하므로 인텔 문법으로 보기위해

gdb 에서 set disassembly-flavor intel 명령어를 이용해 intel 문법으로 본다. (이젠 외워야지)

여기서 확인해 보아야할 곳은 스택에 esp 레지스터가 가리키는 곳을 확인해 준다. 변수의 크기를 할당해주기 위해 sub  op 코드를 이용하여 esp -= 16을 해준 것을 확인해 볼수 있다.

그리고 아까 c 소스파일에서 조건문이 있었는데 어셈블리 코드에서 조건분기문이 작성된 것을 보아 c언어 if 문에 해당하는 것을 확인해 볼수 있었다.

그러면 ebp+8 위치에 인자값이 저장되는 주소를 확인할수 있다.

그 밑 -4 위치에는 ret이 있기에 그곳의 주소를 참조할수있게 되었다. 그렇다면 버퍼오버플로우의 여러가지 방식중 환경변수를 이용하는 방법을 선택해서 가기로했다.

“HA”라는 환경변수를 이용할것이기에 환경변수를 가져오는 getenv 함수를 이용해 “crush.c”파일을 생성하고 컴파일 해준다.

export 를 이용하여 환경변수 생성해준다.

메모리주소를 예측을 한다고 하지만 매우 어렵다 그래서 처음에 NOP를 넣어서 안전하게 실행하려고 넣고 쉘코드를 넣어준다.

환경변수가 잘 등록되었나 확인해주고

환경 변수 주소값 확인

버퍼랑 SFP에 20 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_1]gate  (0) 2019.07.25