1. /lib/x86_64-linux-gnu/libc-2.23.so
libc 라이브러리의 do_system() 함수 내에서 __execve() 함수를 이용해 shell을 호출한다.
__execve (_PATH_BSHELL, (char *const *) args, __environ);
2. One gadget 찾기
1) strings
strings 이용해서 라이브러리 파일에서 "/bin/sh" 문자열이 위치한 offset 주소를 구한다.
$ strings -t x /lib/x86_64-linux-gnu/libc-2.23.so | grep "/bin/sh"
2) objdump
$ objdump -M intel -d /lib/x86_64-linux-gnu/libc-2.23.so | grep -C8 18cd57
execve() 함수 사용하려면
첫 번째 인자 값으로 RDI 레지스터에 "/bin/sh" offset 주소 저장
두 번째 인자 값으로 RSI 레지스터에 [rsp+0x30] 영역 값 저장 => Null(0) 이어야 함
3) one_gadget
$ gem install one_gadget
으로 one_gadget 스크립트를 설치하고, 라이브러리에서 one gadget을 찾는다.
$ one_gadget /lib/x86_64-linux-gnu/libc.so.6
execve() 함수만 찾아서 objdump 결과보다는 offset 주소 개수 적음
3. vuln code
-RSI 레지스터에 [rsp+0x30] 영역 값이 저장되는데, 이 값으 null 값이어야 하므로 memset 함수로 0으로 초기화하는 과정 필요
- asdf 전역 변수 주소 + index = read got 가 되도록 한다.
index = read got - asdf 전역 변수 주소
따라서 index 로 0xffffffffffffffa8 을 준다.
첫 번째 read : 0xffffffffffffffa8
두 번째 read : asdf + index => read_got 아무것도 주지 않고 sleep(0.5)
세 번째 read : one_gadget
4. exploit
[TechNote] malloc (Heap) (0) | 2019.11.02 |
---|---|
[Exploit Tech] JOP(Jump-Oriented Programming) (0) | 2019.11.02 |
[Exploit Tech] ROP (Return Oriented Programming) -x64 (0) | 2019.08.17 |
[Exploit Tech] ROP (Return Oriented Programming) -x86 (0) | 2019.08.17 |
Return to Shellcode (0) | 2019.08.10 |