libc에서 offset 찾기.

2022. 7. 29. 21:40·Tips & theory
728x90
반응형

pwnable 문제를 풀다보면 libc 파일을 제공해주는 경우가 다수 있다.

하지만 offset을 구할때 자꾸 헷갈리는 부분이 있어 다시 정리한다.


pwntools로 찾기

해당 파일의 libc 버전 또는 경로를 확인해서

┌──(kali㉿kali)-[~/Downloads/1279bf21-e0f3-46a4-b577-3c3955c458fb]
└─$ ldd oneshot           
        linux-vdso.so.1 (0x00007ffc07293000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f361f1f0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f361f5e1000)

간단한 파이썬 코딩으로 libc 파일의 offset 확인.

from pwn import *

libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

print('system = ',hex(libc.symbols['system']))
print('read = ',hex(libc.symbols['read']))
print('puts = ',hex(libc.symbols['puts']))
┌──(kali㉿kali)-[~/Downloads/1279bf21-e0f3-46a4-b577-3c3955c458fb]
└─$ python test.py
[*] '/lib/x86_64-linux-gnu/libc.so.6'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
system =  0x49860
read =  0xee550
puts =  0x75e10

장점은 gdb로 찾기 어려운 함수의 offset까지 쉽게 찾을 수 있다.


gdb로 찾기

아래와 같이 프로그램 실행 전 간단히 찾을 수 있다.

┌──(kali㉿kali)-[~/Downloads/1279bf21-e0f3-46a4-b577-3c3955c458fb]
└─$ gdb -q /lib/x86_64-linux-gnu/libc.so.6
GEF for linux ready, type `gef' to start, `gef config' to configure
90 commands loaded and 5 functions added for GDB 10.1.90.20210103-git in 0.00ms using Python engine 3.10
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...
Reading symbols from /usr/lib/debug/.build-id/3f/d3cdd423a18458d9db3a5e50a2b3c0d4529c07.debug...
gef➤  p system
$1 = {int (const char *)} 0x49860 <__libc_system>
gef➤  p read
$2 = {ssize_t (int, void *, size_t)} 0xee550 <__GI___libc_read>
gef➤  p puts
$3 = {int (const char *)} 0x75e10 <__GI__IO_puts>

하지만 _free_hook과 같이 일부는 함수 실행 전에는 찾아지지 않는다.

gef➤  p __free_hook
$5 = (void (*)(void *, const void *)) 0x0

objdump로 찾기.

짠 하고 나올 것만 같지만 실상은 그렇지 않다... 노가다 of 노가다.

┌──(kali㉿kali)-[~/Downloads/1279bf21-e0f3-46a4-b577-3c3955c458fb]
└─$ objdump -d /lib/x86_64-linux-gnu/libc.so.6 | grep __libc_system
0000000000049860 <__libc_system>:
   49863:       74 0b                   je     49870 <__libc_system+0x10>
                                                                                                                    
┌──(kali㉿kali)-[~/Downloads/1279bf21-e0f3-46a4-b577-3c3955c458fb]
└─$ objdump -d /lib/x86_64-linux-gnu/libc.so.6 | grep __GI__IO_puts   
0000000000026a38 <__GI__IO_puts.cold>:
   26a3f:       75 29                   jne    26a6a <__GI__IO_puts.cold+0x32>
   26a51:       75 17                   jne    26a6a <__GI__IO_puts.cold+0x32>
   26a65:       75 0b                   jne    26a72 <__GI__IO_puts.cold+0x3a>
   26a77:       7e f1                   jle    26a6a <__GI__IO_puts.cold+0x32>
   26a8d:       eb db                   jmp    26a6a <__GI__IO_puts.cold+0x32>
   75fe3:       e9 50 0a fb ff          jmp    26a38 <__GI__IO_puts.cold>
                                                                                                                    
┌──(kali㉿kali)-[~/Downloads/1279bf21-e0f3-46a4-b577-3c3955c458fb]
└─$ objdump -d /lib/x86_64-linux-gnu/libc.so.6 | grep puts         
...
0000000000075e10 <_IO_puts>:
...

... 속에 사실 함께 출력된 많은 데이터들이 있음...

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Tips & theory' 카테고리의 다른 글

fsb  (0) 2022.07.30
입/출력 함수의 입력, 출력 방식.  (0) 2022.07.29
문제에서 제공된 libc 파일 사용.  (0) 2022.07.28
GDB run 실행 후 입력 값 넘기기  (0) 2022.07.15
/bin/sh 문자열 주소 찾는 방법.  (0) 2022.07.14
'Tips & theory' 카테고리의 다른 글
  • fsb
  • 입/출력 함수의 입력, 출력 방식.
  • 문제에서 제공된 libc 파일 사용.
  • GDB run 실행 후 입력 값 넘기기
wyv3rn
wyv3rn
아저씨의 흔한 취미. wyv3rn#1249
  • wyv3rn
    think storage
    wyv3rn
  • 전체
    오늘
    어제
    • 분류 전체보기 (520)
      • To do list (7)
        • Doing (1)
        • Complete (6)
      • Diary (35)
      • Tips & theory (75)
      • Kernel Exploit (28)
        • Theory (16)
        • Exercise (5)
      • File Structure (6)
      • Wargame (322)
        • pwn.college (34)
        • Dreamhack (156)
        • pwnable.kr (15)
        • Lord of Sqlinjection (4)
        • Cryptohack (20)
        • Root me (27)
        • CodeEngn (4)
        • Exploit Education (22)
        • ROP Emporium (8)
        • H4C (10)
        • Hackerchool (22)
      • CTF (46)
        • Solved (44)
        • Unsolved (2)
      • Script (0)
      • RubiyaLap (0)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

    • PWN wargame 모음 (및 느낀점)
    • 비공개 글들에 대해.
    • 뭐라도 하나 얻어가시길...
  • 인기 글

  • 태그

    32bit
    Me
    pwnable.kr
    tcache
    dreamhack
    lob
    x86
    heap
    hackerschool
    docker
    Buffer Overflow
    root-me
    libc
    x64
    FSB
    root
    vtable
    _IO_FILE
    Format String Bug
    rop
    RTL
    exploit education
    64bit
    la ctf
    cryptohack
    BOF
    CANARY
    pwntools
    ROOT ME
    phoenix
  • 최근 댓글

  • 최근 글

  • 250x250
    반응형
  • hELLO· Designed By정상우.v4.10.3
wyv3rn
libc에서 offset 찾기.
상단으로

티스토리툴바