Post

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어떤 식으로 동작하는지 나와있다.

1
gem install one\_gadget

one_gadget으로 나온 결과는 잘 되는지 꼭 테스트해봐야 한다. 에러가 발생하는 경우도 있기 때문.

1
jump \*base+offset

바이너리가 컴파일된 시스템의 libc 버전과, 바이너리를 실행하는 현재 시스템의 libc 버전이 다른 경우 one gadget으로 찾은 gadget을 실행하면 relocation error가 발생하며 쉘이 제대로 실행되지 않을 수 있다.

1
2
3
4
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/와 같이 사용해야 한다.

1
2
3
4
5
6
7
8
9
10
$ ./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해주어야 한다.

https://github.com/niklasb/libc-database

  • htons는 안되는 듯.
  • fclose는 두 개 있으나, 잘 동작하는 듯.
This post is licensed under CC BY 4.0 by the author.