one_gadget / libc-database
one_gadget
- objdump나, one_gadget으로 구한 offset은 library mapping 시작 주소에 +하면된다.
- constraints 를 확인한다.
https://github.com/david942j/one_gadget
https://david942j.blogspot.kr/2017/02/project-one-gadget-in-glibc.html 어떤 식으로 동작하는지 나와있다.
```bash
gem install one_gadget
```
one_gadget으로 나온 결과는 잘 되는지 꼭 테스트해봐야 한다. 에러가 발생하는 경우도 있기 때문.
```bash
jump *base+offset
```
바이너리가 컴파일된 시스템의 libc 버전과, 바이너리를 실행하는 현재 시스템의 libc 버전이 다른 경우
one gadget으로 찾은 gadget을 실행하면 relocation error가 발생하며 쉘이 제대로 실행되지 않을 수 있다.
```
process 24835 is executing new program: /bin/dash
E▒H▒}▒: relocation error: ̉E▒H▒}▒: symbol ▒!, version GLIBC_2.2.5 not defined in file libc.so.6 with link time reference
[Inferior 1 (process 24835) exited with code 0177]
```
libc-database
이게 틀리게 가르쳐 줄 때도 있기 때문에 http://libcdb.com/ 와 같이 사용해야 한다.
```bash
$ ./find __libc_start_main_ret a83
ubuntu-trusty-i386-libc6 (id libc6_2.19-0ubuntu6.13_i386)
$ ./find __malloc_hook 740 # 함수가 아니라 symbol도 된다.
ubuntu-trusty-amd64-libc6 (id libc6_2.19-0ubuntu6.13_amd64)
$ ./dump libc6_2.19-0ubuntu6.13_i386
$ ./add ~/local/libc.so.6 # dump 하려면 .symbols가 있어야 해서, local file은 add해주어야 한다.
```
- htons는 안되는 듯.
- fclose는 두 개 있으나, 잘 동작하는 듯.
'Security > System Exploit' 카테고리의 다른 글
Poison null byte (0) | 2017.08.15 |
---|---|
overlapping chunk (0) | 2017.08.15 |
pwntools (0) | 2017.08.13 |
Shellcode (0) | 2017.07.26 |
UAF, Use After Free (0) | 2017.07.23 |