제공된 libc.so.6에 debug simbol이 없어 gdb에서 print stdout을 사용할 수 없습니다

페이로드는
payload = "A"*24 + p64(0)*2 + p64(oneshot_gadget)
이렇게 작성했고

gdb로 attach 해서 리턴 주소에 값이 정확히 들어가는 것을 확인했는데 쉘이 실행되지 않았습니다

oneshot_gadget을 구하기 위해서 아래와 같이 식을 작성하였는데
libc_base = stdout - 0x3c5708
oneshot_gadget = libc_base + 0x45216

제가 생각하는 문제가 되는 부분은 libc_base를 구하는 부분입니다

처음에는 oneshot 파일을 그대로 gdb로 열고
print stdout을 해서 나온 주소에서, vmmap을 해서 나온 /usr/lib/x86_64-linux-gnu/libc-2.31.so의 base 주소(시작 주소)를 뺀 값인 0x1bf6a0를 stdout 값에서 빼줬으나 동작하지 않아

patchelf --replace-needed 명령어로 문제파일에서 주어진 so.6 파일로 변경 후 다시 gdb로 열었습니다

이렇게 하니까 vmmap 으로 봤을 때 변경된 so.6 파일이 열리는것을 확인했는데

문제는 제공된 libc.so.6 파일에 debug simbol이 없어 print stdout이 먹히지 않는다는 것이었습니다

https://typemiss.tistory.com/2

이 사이트를 참고해서 libc6-dbg 패키지를 다운받아 gdb 에서 set도 해보았고

readelf -s ./libc6.so.6 | grep stdout에서 나온 stdout의 오프셋 값도 사용해보았으나

여전히 해결되지 않았습니다

원리는 다 이해한거 같은데 몇 시간째 문제가 해결되지 않아 답답하네요..

조언 부탁드립니다

(해결)
주어진 libc에서 필요한 데이터를 다 추출해서 풀었습니다

libc 바꿀 필요도 없고 로컬에서 되는거 확인해보지 않아도 되네요

#pwnable
작성자 정보
답변 1
avatar
T@ke_it_EZ
질문 등록: 10
# objdump -D ./oneshot | grep 'stdout'                                                                
 9ff:   48 8b 05 ca 05 20 00    mov    0x2005ca(%rip),%rax        # 200fd0 <stdout@GLIBC_2.2.5>
 a62:   48 8b 05 67 05 20 00    mov    0x200567(%rip),%rax        # 200fd0 <stdout@GLIBC_2.2.5>

위 명령어에서 나온 0x200fd0 값과

# objdump -D ./tmp_lib/libc.so.6_oneshot | grep 'stdout'
   50060:       48 8b 05 e9 3e 37 00    mov    0x373ee9(%rip),%rax        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
   5588a:       48 8b 05 bf e6 36 00    mov    0x36e6bf(%rip),%rax        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
   6d349:       48 3b 1d b8 83 35 00    cmp    0x3583b8(%rip),%rbx        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   6f69c:       48 8b 2d 65 60 35 00    mov    0x356065(%rip),%rbp        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   6f705:       48 8b 3d fc 5f 35 00    mov    0x355ffc(%rip),%rdi        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   6f73d:       48 8b 3d c4 5f 35 00    mov    0x355fc4(%rip),%rdi        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   710f1:       48 8b 1d 10 46 35 00    mov    0x354610(%rip),%rbx        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   7115a:       48 8b 3d a7 45 35 00    mov    0x3545a7(%rip),%rdi        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   71252:       48 8b 3d af 44 35 00    mov    0x3544af(%rip),%rdi        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   71291:       48 8b 1d 70 44 35 00    mov    0x354470(%rip),%rbx        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   712fa:       48 8b 3d 07 44 35 00    mov    0x354407(%rip),%rdi        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   713e0:       48 8b 05 21 43 35 00    mov    0x354321(%rip),%rax        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   71540:       48 8b 05 09 2a 35 00    mov    0x352a09(%rip),%rax        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
   715ea:       48 8b 05 5f 29 35 00    mov    0x35295f(%rip),%rax        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
   73857:       4c 8b 25 aa 1e 35 00    mov    0x351eaa(%rip),%r12        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   738bd:       48 8b 3d 44 1e 35 00    mov    0x351e44(%rip),%rdi        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   7a4d7:       48 8b 2d 2a b2 34 00    mov    0x34b22a(%rip),%rbp        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
   7a53b:       48 8b 3d c6 b1 34 00    mov    0x34b1c6(%rip),%rdi        # 3c5708 <_IO_2_1_stdout_@@GLIBC_2.2.5+0xe8>
  105402:       48 8b 05 47 eb 2b 00    mov    0x2beb47(%rip),%rax        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
  105579:       48 8b 05 d0 e9 2b 00    mov    0x2be9d0(%rip),%rax        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
  113cb6:       48 8b 05 93 02 2b 00    mov    0x2b0293(%rip),%rax        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
  116940:       48 8b 2d 09 d6 2a 00    mov    0x2ad609(%rip),%rbp        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
  116ca6:       48 8b 2d a3 d2 2a 00    mov    0x2ad2a3(%rip),%rbp        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
  117e40:       48 8b 2d 09 c1 2a 00    mov    0x2ac109(%rip),%rbp        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
  1181a6:       48 8b 2d a3 bd 2a 00    mov    0x2abda3(%rip),%rbp        # 3c3f50 <stdout@@GLIBC_2.2.5-0x17b8>
  3c5618:       e0 36                   loopne 3c5650 <_IO_2_1_stdout_@@GLIBC_2.2.5+0x30>
00000000003c5620 <_IO_2_1_stdout_@@GLIBC_2.2.5>:
00000000003c5708 <stdout@@GLIBC_2.2.5>:

위 명령어 결과로 나온 0x3c3f50, 0x3c5708, 0x3c5620, 0x3c5708 전부 다 libc_base 계산할 때(stdout 주소에서 빼는 값으로) 써봤는데 안되네요..ㅠㅠ

'로컬에서 하실땐 폰툴 elf로드과정에서 나오는 libc를 사용하셔야 하고'
=> 1. 어떻게 확인하나요?
=> 2. 질문글에 써놨던 것처럼 patchelf로 libc.so.6을 변경하면 되나요?

2021.04.03. 03:30
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기